OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9603|回复: 8

STM32控制12864不能显示

[复制链接]

3

主题

12

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2012-5-14
在线时间
0 小时
发表于 2013-2-17 21:54:26 | 显示全部楼层 |阅读模式

            
最近想用STM32控制12864做显示,本来是仿照做的,可是程序烧进去什么都不显示,我的连接电路如下,我开始以为是没接上接电阻,后来我看了开发板TFT的电路也没有接上接电阻,现在就不知道问题出在哪里了,麻烦各位帮忙看下,谢谢!


 


LCD程序如下:

#include "LCD.h"
#include "zimo.h"
#include "delay.h"


#define DisIO GPIOA                 //定义12864要使用的I/O端口。
#define DisClk RCC_APB2Periph_GPIOA  //定义12864要使用的I/O端口的时钟。
#define IOData GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7

#define RS_H GPIO_SetBits(GPIOE,GPIO_Pin_1) //RS=1
#define RS_L GPIO_ResetBits(GPIOE,GPIO_Pin_1) //RS=0

#define RW_H GPIO_SetBits(GPIOB,GPIO_Pin_10) //RW=1
#define RW_L GPIO_ResetBits(GPIOB,GPIO_Pin_10);  //RW = 0

#define EN_H GPIO_SetBits(GPIOD,GPIO_Pin_7);    //EN = 1.
#define EN_L GPIO_ResetBits(GPIOD,GPIO_Pin_7);  //EN = 0

#define CS1_H GPIO_SetBits(GPIOD,GPIO_Pin_4);    //CS1 = 1.
#define CS1_L GPIO_ResetBits(GPIOD,GPIO_Pin_4);    //CS1 = 0.

#define CS2_H GPIO_SetBits(GPIOD,GPIO_Pin_5);    //CS2 = 1.
#define CS2_L GPIO_ResetBits(GPIOD,GPIO_Pin_5);    //CS2 = 0.

/****************全局变量定义*******************/
Uchar col,row,cbyte;  /*列x,行(页)y,输出数据 */
char x,y,xy;    /*画线方向标志:1水平 */
char conv; //反转显示标志

/****************************************/
/* 清屏,全屏幕清零  */
/****************************************/
void Lcmcls( void )
 {
 for(row=0;row<8;row++)
  for(col=0;col<LCMLIMIT;col++) Wrdata(0);
 }


/****************************************/
/* 数据写输出   */
/****************************************/

void Wrdata(Uchar X)
 {
    Locatexy();  /*坐标定位,返回时保留分区状态不变 */
// wtcom();
    RS_H;  //RS = 1.
    RW_L;  //RW = 0.
 DisIO->ODR=((DisIO->ODR & 0xff00)|X);  //同上。
    EN_H;    //EN = 1.
 delay_ms(2);
    EN_L;  //EN = 0;
    delay_ms(2);
 }

/********************************/
/* 命令输出到左区控制口  */
/********************************/

void WrcmdL(Uchar X)
 {
   lcdbusyL();  /*确定分区,返回时保留分区状态不变*/
   RS_L;  //RS = 0.
   RW_L;  //RW = 0.
   DisIO->ODR=((DisIO->ODR & 0xff00)|X); //此处直接操作寄存器
   EN_H;    //EN = 1.
   delay_ms(2);
   EN_L;  //EN = 0; 
   delay_ms(2);
 }

/********************************/
/* 命令输出到右区控制口  */
/********************************/

void WrcmdR(Uchar X)
 {
   lcdbusyR(); /*确定分区,返回时保留分区状态不变 */
   RS_L;  //RS = 0.
   RS_L;  //RW = 0.
   DisIO->ODR=((DisIO->ODR & 0xff00)|X); //此处直接操作寄存器;
   EN_H;    //EN = 1.
   delay_ms(2);
   EN_L;  //EN = 0;
   delay_ms(2);   
 }

/********************************************************/
/* 分区操作允许等待,返回时保留分区选择状态  */
/********************************************************/
void lcdbusyL(void)
 {
 CS1_H;    //CS1 = 1.
 CS2_L;    //CS2 = 0.
  wtcom();  /* waitting for enable */
 }

void lcdbusyR(void)
 {
 CS1_L;    //CS1 = 0.
 CS2_H;    //CS2 = 1.
  wtcom();  /* waitting for enable */
 }

void wtcom(void)
 {
 LCDIO_IN();        //把数据引脚定义为浮空输入;
    RS_L;  //RS = 0.
    RW_H;    //RW = 1.
    EN_H;    //EN = 1.
 delay_ms(2);
    while(GPIO_ReadInputData(DisIO) & 0x0080); ////只要位7的值,位7是忙标志位。
    EN_L;  //EN = 0;
 delay_ms(2);
    LCDIO_OUT();      //把所有引脚定义为输出。
 }

/********************************************************/
/*根据设定的坐标数据,定位LCM上的下一个操作单元位置 */
/********************************************************/
void Locatexy(void)
 {
  unsigned char x,y;
  switch (col&0xc0)  /* col.and.0xC0 */
   {   /*条件分支执行  */
   case 0:   {lcdbusyL();break;} /*左区 */
   case 0x40:  {lcdbusyR();break;} /*右区 */
   }
   x = col&0x3F|SETX;  /* col.and.0x3f.or.setx */
   y = row&0x07|SETY;  /* row.and.0x07.or.sety */
   wtcom();  /* waitting for enable  */
   RS_L;  //RS = 0.
   RW_L;  //RW = 0.
   DisIO->ODR=((DisIO->ODR & 0xff00)|y); //此处直接操作寄存器;
   EN_H;    //EN = 1.
   delay_ms(2);
   EN_L;  //EN = 0;
   wtcom();  /* waitting for enable  */

   RS_L;  //RS = 0.
   RW_L;  //RW = 0.
   DisIO->ODR=((DisIO->ODR & 0xff00)|x); //此处直接操作寄存器;
   EN_H;    //EN = 1.
   delay_ms(2);
   EN_L;  //EN = 0;
   delay_ms(2);
 }

/********************************/
/*液晶屏初始化   */
/********************************/

void Lcminit(void)
 {
   cbyte = DISPOFF; /*关闭显示屏 */
   WrcmdL(cbyte);
  WrcmdR(cbyte);
 delay_ms(2);
   cbyte = DISPON;  /*打开显示屏 */
   WrcmdL(cbyte);
   WrcmdR(cbyte);
 delay_ms(2);
   cbyte = DISPFIRST; /*定义显示起始行为零 */
   WrcmdL(cbyte);
    WrcmdR(cbyte);
 delay_ms(2);
   Lcmcls(); /*清屏  */
   col=0; 
   row=0;
   Locatexy();
 }

//初始化lcd
void IO_Init(void)
{            

   GPIO_InitTypeDef GPIO_InitStructure;
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC |
                          RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE , ENABLE);
  

   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//定义数据引脚为浮空输入的变量初始化。
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Pin = IOData;
      GPIO_Init(DisIO,&GPIO_InitStructure);  
  
  
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;  //LCD_CS1/CS2
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
   GPIO_Init(GPIOD, &GPIO_InitStructure);
   GPIO_ResetBits(GPIOD,GPIO_Pin_4 | GPIO_Pin_5); 

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //LCD_RS     
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
   GPIO_Init(GPIOE, &GPIO_InitStructure);
   GPIO_ResetBits(GPIOE,GPIO_Pin_1); 

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;  //LCD_RW
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
   GPIO_Init(GPIOB, &GPIO_InitStructure);
   GPIO_ResetBits(GPIOB,GPIO_Pin_10); 

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //LCD_EN
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
   GPIO_Init(GPIOD, &GPIO_InitStructure);
   GPIO_ResetBits(GPIOD,GPIO_Pin_7);      
  
}

//数据引脚设置为浮空输入
void LCDIO_IN(void)
{            

   GPIO_InitTypeDef GPIO_InitStructure;
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);

   GPIO_InitStructure.GPIO_Pin = IOData;      
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
   GPIO_Init(GPIOA, &GPIO_InitStructure);   
  
}

//数据引脚设置推挽输出
void LCDIO_OUT(void)
{            

   GPIO_InitTypeDef GPIO_InitStructure;
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);

   GPIO_InitStructure.GPIO_Pin = IOData;      
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
   GPIO_Init(GPIOA, &GPIO_InitStructure);
  
}

主程序如下:

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "lcd.h"
//ALIENTEK战舰STM32开发板实验1
//跑马灯实验 
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司 
 
extern unsigned char col,row,cbyte;  //列x,行(页)y,输出数据
extern char xy;    //画线方向标志:1水平
extern char conv; //反转显示标志                    


 int main(void)
 { 
 int i=0;
 IO_Init();            //端口初始化
 delay_init();       //延时函数初始化  
 LED_Init();     //初始化与LED连接的硬件接口
 delay_ms(50);  //延时40ms
 Lcminit();  //液晶模块初始化,包括全屏幕清屏 
 row=2;
    col=0;
  for(i=0;i<32;i++)  //显示横线
  { 
     col=i;
     Wrdata(1);
  }

 while(1)
 {
  LED0=0;
  LED1=1;
  delay_ms(300);  //延时300ms
  LED0=1;
  LED1=0;
  delay_ms(300); //延时300ms
 }
 }

 

 


 

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2012-8-14
在线时间
0 小时
发表于 2013-2-17 22:41:22 | 显示全部楼层
回复【楼主位】t待鸿:
---------------------------------
没看你程序哈
1. 扭一扭12864液晶对比度调节电阻
2. 用的是3.3V的12864液晶吗?STM32是3.3VIO口。
心兰相随
回复 支持 反对

使用道具 举报

3

主题

12

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2012-5-14
在线时间
0 小时
 楼主| 发表于 2013-2-18 08:25:38 | 显示全部楼层

回复【2楼】SprayFly:
---------------------------------
谢谢你的回复, 确实是对比度电位器没有仔细调!

回复 支持 反对

使用道具 举报

46

主题

333

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2013-12-12
在线时间
63 小时
发表于 2014-1-24 02:20:03 | 显示全部楼层
回复【3楼】t待鸿:
---------------------------------
回复【2楼】SprayFly:
---------------------------------
我可以看看你们的12864的调试好的工程么?发一份吧~1960765649~
回复 支持 反对

使用道具 举报

头像被屏蔽

38

主题

382

帖子

0

精华

高级会员

Rank: 4

积分
596
金钱
596
注册时间
2012-12-5
在线时间
19 小时
发表于 2014-1-24 02:31:56 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

29

主题

311

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1530
金钱
1530
注册时间
2012-9-4
在线时间
262 小时
发表于 2014-4-15 12:42:31 | 显示全部楼层
回复【3楼】t待鸿:
---------------------------------
你好  3.3v的输出电压能控制12864吗????
STM32---STM32---STM32---STM32---STM32---STM32---STM32---STM32---STM32
回复 支持 反对

使用道具 举报

29

主题

311

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1530
金钱
1530
注册时间
2012-9-4
在线时间
262 小时
发表于 2014-4-15 12:53:06 | 显示全部楼层
回复【3楼】t待鸿:
---------------------------------
程序能发我一下吗???  103145516@qq.com
STM32---STM32---STM32---STM32---STM32---STM32---STM32---STM32---STM32
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2014-5-14
在线时间
0 小时
发表于 2014-6-17 09:16:55 | 显示全部楼层
能发出来看看吗
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2015-4-8
在线时间
0 小时
发表于 2015-4-8 21:02:53 | 显示全部楼层
大神,请问是只要连接定义的5根线就好使么
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-23 22:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表