OpenEdv-开源电子网

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

新人求助,驱动1602液晶的问题

[复制链接]

3

主题

8

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2015-11-14
在线时间
0 小时
发表于 2015-11-14 21:20:17 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]求指点,为什么我的代码不能驱动1602液晶!![/mw_shl_code] [mw_shl_code=c,true]在线等。。。[/mw_shl_code] [mw_shl_code=c,true] #include "1602.h" [mw_shl_code=c,true]#define L1602_RS_1 GPIO_SetBits(GPIOB, GPIO_Pin_0) #define L1602_RS_0 GPIO_ResetBits(GPIOB, GPIO_Pin_0) #define L1602_RW_1 GPIO_SetBits(GPIOB, GPIO_Pin_1) #define L1602_RW_0 GPIO_ResetBits(GPIOB, GPIO_Pin_1) #define L1602_E_1 GPIO_SetBits(GPIOB, GPIO_Pin_2) [/mw_shl_code] #define L1602_E_0 GPIO_ResetBits(GPIOB, GPIO_Pin_2)[/mw_shl_code] [mw_shl_code=c,true]void delay_us(u16 us) { u8 i; while(us--) for(i=0;i<6;i++); } void delay_ms(u16 ms) { while(ms--) delay_us(1000); } void busy_wait()//检查LCD是否忙,如果忙等待 { L1602_E_0; L1602_RW_1;//读 L1602_RS_0;//状态 L1602_E_1;// GPIOA->ODR=0XFF;//(GPIOA->ODR&0XFF00)| delay_us(1); while(GPIOA->ODR>>7);// dddddddd判断PA0~7 状态 &0xffff L1602_E_0; } void write_cmd(u8 cmd)//向1602发送一条命令 { L1602_E_0; L1602_RS_0;//命令或数据 L1602_RW_0;//写 GPIOA->ODR=(cmd&0X7F);//命令(GPIOA->ODR&0XFF00)| delay_us(1);//>40ns L1602_E_1;//执行 delay_ms(1);//>150ns L1602_E_0; delay_us(1);//>250ns } void set_ddram(u8 add)//设置DDRAM的地址--显示地址 { L1602_E_0; L1602_RS_0;//命令或数据 L1602_RW_0;//写 GPIOA->ODR=(add|0X80);//地址(GPIOA->ODR&0XFF00)| delay_us(1);//>40ns L1602_E_1;//执行 delay_ms(1);//>150ns L1602_E_0; delay_us(1);//>250ns } void write_dat(u8 asc)//向1602写入数据--asc码 { L1602_E_0; L1602_RS_1;//命令或数据 L1602_RW_0;//写 GPIOA->ODR=asc;//命令(GPIOA->ODR&0XFF00)| delay_us(1);//>40ns L1602_E_1;//执行 delay_ms(1);//>150ns L1602_E_0; delay_us(1);//>250ns } void show_asc(u8 add,u8 asc)//在LCD上显示一个ASC字符 { busy_wait(); set_ddram(add); busy_wait(); write_dat(asc); } void show_string(u8 add,u8 *p)//显示一个字符串 { busy_wait(); set_ddram(add); while(*p) { busy_wait(); write_dat(*p++); } } void show_number(u8 add,u16 n)//在LCD 上显示一个数 { char s[6]; s[0]=(n/10000)+48;//(0~9)+48===48~57 得到万位的asc码 s[1]=(n%10000/1000)+48; s[2]=(n%1000/100)+'0'; s[3]=(n%100/10)+'0'; s[4]=(n%10)+'0'; s[5]='\0';// \转义符 show_string(add,(u8 *)s); } void show_float(u8 add,float n)//在LCD 上显示小数 { char s[10]; sprintf (s, "%04.3f", n);//按照指定 格式 打印 一个 字符串 n按照浮点型格式打印到asc码中 /* 调用这个函数是因为我们要把这个数字按照字符串的格式打印到数组中去 然后调用字符串显示函数 */ show_string(add,(u8 *)s); } /* void show_float(u8 add,float t)//在LCD 上显示一个数 { char s[7]; u16 n; n=t*100; s[0]=(n/10000)+48;//(0~9)+48===48~57 得到万位的asc码 s[1]=(n%10000/1000)+48; s[2]='.'; s[3]=(n%1000/100)+'0'; s[4]=(n%100/10)+'0'; s[5]=(n%10)+'0'; s[6]='\0';// \转义符 show_string(add,s); } */ void LCD_init()//初始化1602 { RCC->APB2ENR=0x0000000c; GPIOB->CRL=0x0111; GPIOA->CRL=0x11111111; delay_us(15); write_cmd(0X38); delay_us(5); write_cmd(0X38); delay_us(5); write_cmd(0X38);//00111000 --8位接口,2行显示,5*7 busy_wait(); write_cmd(0X38); busy_wait(); write_cmd(0X08); busy_wait(); write_cmd(0X01);//清屏--填为空格 busy_wait(); // write_cmd(0X0F);//开显示,开光标 write_cmd(0X0C);//开显示,关光标 busy_wait(); write_cmd(0X06);//地址自动加1,不移动 } [/mw_shl_code]

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

使用道具 举报

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3223
金钱
3223
注册时间
2015-7-26
在线时间
811 小时
发表于 2015-11-14 21:35:49 | 显示全部楼层
好久没驱动过1602了,不过驱动不了大部分是时序的问题
我的博客:http://blog.csdn.net/itdo_just
回复

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2015-11-14
在线时间
0 小时
 楼主| 发表于 2015-11-14 21:42:33 | 显示全部楼层
回复【2楼】229382777@qq.com:
---------------------------------
时序我看过好几遍了,应该是没问题的。我现在想确认下我那样操作IO口有没有问题?我怀疑是我没操作好IO口
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 01:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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