LCD 1602 稳定显示
册中‘置数据存储器地址’指令)
5 LCD 1602程序编写
5.1 LCD初始化
//----------------------- ---------//写命令,初始化端口设置LCD显示模式//----------------------- ---- ----void LCD_mode_init(){LCD_EN = L;//等待LCD电路完全接通delay_ms( DELAY_TIME_FOR_INIT );//P0= 00111000设置16x2显示,5x7点库,8位数据端口write_command( 0x38 );delay_ms( DELAY_TIME );//LCD开显示,显示光标,光标闪烁write_command( 0x0f );//读写字符后地址指针、光标加1,整屏显示不移动write_command( 0x06 );//清显示,便对LCD写入write_command( 0x01 );}
根据图3,当LCD电路接通之时,需要用约15ms的时间来让LCD VDD电压达4.5V,虽然在开启单片机电源的时候程序还未执行到初始化程序就已经过了15ms让LCD VDD电源达4.5V。但也有可能程序中只包含了LCD程序,初始化被放在了最前面,15ms的时间足以让单片机运行很多指令了(可以由单片机的机器周期和一条指令执行的机器周期数比较一下),为了防止在LCDVDD电源未达4.5V时单片机程序已经执行到设置LCD显示模式的指令,就在进入LCD初始化程序时等待15ms的时间,让LCD电源初始化完毕。
5.2 写指令
//-------- -----//写命令//--------- ----void write_command( uchar command ){while( lcd_busy() );LCD_RS = L;LCD_RW = L;delay_ms(DELAY_TIME); P0 = command;//等待数据稳定delay_ms(DELAY_TIME);LCD_EN = H;//让使能位保持到一,负脉冲跳变delay_ms( DELAY_TIME );LCD_EN = L;delay_ms( DELAY_TIME );}
写指令前首先要检查LCD内部操作是否已经完成,LCD的BF位(D7)为高电平表示忙,为低电平表示空闲。同理,在对每一个端口设置高低电平后,同样需要一段时间来等待电平的彻底变化。
5.3 写数据
//-----------------------//写数据,写LCD显示内容//-----------------------void write_data( uchar wdata ){while( lcd_busy() );LCD_RS = H;LCD_RW = L;LCD_EN = L;P0 = wdata;//等待DB0-DB7数据稳定delay_ms( DELAY_TIME );LCD_EN = H;//让使能位充分达到1delay_ms( DELAY_TIME );LCD_EN = L;delay_ms( DELAY_TIME );}
5.4 检测LCD忙信号
//--------------------//检测LCD的忙信号//--------------------bit lcd_busy(){ bit result;LCD_RS = 0;LCD_RW = 1;LCD_EN = 1;delay_ms( DELAY_TIME );result = (bit)(P0&0x80);LCD_EN = 0;return result; }
在检测LCD忙信号的同时,还可以设置一下原本该低或该高的位的状态。P0端口是连接到D0—D6端口的I/O引脚,0x80就是用来检测D7位状态的数据。
5.5 延迟函数
//-------- -----//延迟函数//--------- ----void delay_ms( uint ms ){ uint i, j;for(i = ms; i > 0; i--){for(j = 110; j > 0; j--){;}}}
根据单片机的晶振和keil执行指令的时间计算,以上延迟函数约延迟ms 毫秒的时间。DELAY_TIME的宏值为5,表示延迟5毫秒的时间。LCD有的端口不需要延迟这么长的时间,这个可以调试到适合相应端口最适合的延迟时间即可。借助手册和枚举调试法。
5.6 运行结果
将初始化函数放置在main函数中后,将LCD的显示地址设置在第一行第一列(此指令在写指令集中,可调用write_command(0x80)来完成),然后写字符到LCD第一行中。再将显示地址跳到第二行,地址后移需要显示字符传长度个单位,写入显示的字符传,对整个屏幕移位(由写指令集中指令完成,移字符传长度那么多位,移完一个停留的时间需要长点,如200ms左右的时间)。
然后让程序等待,只为LCD操作演示^-^。
程序的效果为:首先在第一行显示了指定的字符串。当移入第二行字符串时,由于是整个屏幕的移动,所以第一行字符串也随之移入了屏幕的左边。
现将两行的字符串显示在LCD屏幕之上,不采取移动的操作。
6 总结
电平变化时不是瞬间的,需要用延迟函数来等待相应位彻底的编程预期的电平。这是跟写其它程序的一个区别。每逢遇到对硬件引脚电平的置位时,都需要结合手册看看对应引脚的灵敏度,若高出指令执行时间徐许多数量级就不用延迟语句,否则应当考虑用延迟语句来等待。应该走进硬件的操作时序世界中去才能编写好它们的程序。
此次笔记记录完毕。
LCD1602稳定显 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)