液晶操作
液晶的操作:
1602液晶只能显示ASCI,今天把1602液晶驱动起来,液晶操作要比数码管简单
液晶的基本操作时序:
1.1读状态:输入:RS = L,RW =H,E = H 输出D0~D7
1.2写指令:输入:RS = L,RW = L,D0~D7指令码,E = 高脉冲,输出:无;
RS是数据命令选择端(H/L);
1.3读数据:输入RS= H,RW=H,E=H
1.4写指令:输出,RS = L,RW = L,D0~D7=数据,E=高脉冲
注意:对控制器每次进行读写操作之前,都必须进行读写检测,确保STA7为0,可以用简单的延时来代替
初始化设置
显示模式设置
指令码:00111000 功能16*2显示,5*7点阵,8为数据接口0x38的指令
显示开/关光标的设置
因此左移和右由N和S设置
数据指针的指令码
80H+地址码(0-27H,40H到67H)
其他设置
指令码 01H 功能是显示清屏:1数据指针清零,2所有显示清零
02H显示回车:1数据指针清零
电路图如图所示:
示例代码:动态显示
#include<reg52.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int sbit lcden = P2^6;//这几个端口要和硬件电路先联系 sbit lcdrw = P2^5; sbit lcdrs = P2^4; sbit dula = P3^1; sbit wela = P3^2; uchar num; uchar code table[]="I LIke MCU!"; uchar code table1[]="I LIke HULeiHao"; void delay(uint z) { uint x,y; for(x= z;x>0;x--) for(y =110;y>0;y--); } void write_com(uchar com)//写命令函数 { lcdrs = 0;//使能端置0低脉冲写指令,高脉冲写数据 _nop_();//推迟一个机器周期 lcdrw = 0;//低电平往里面写数据 P0= com; delay(5); lcden = 1;//使能端给一个高电平读走数据 delay(5); lcden = 0;//使能端给一个低电平回位 } void write_date(uchar date)//写数据函数 { lcdrs = 1;//使能端置0低脉冲写指令,高脉冲写数据 _nop_();//推迟一个机器周期 lcdrw = 0; P0= date; delay(5); lcden = 1; delay(5); lcden = 0; } void init() { dula = 0; wela = 0;//关闭数码管 lcden = 0; write_com(0x38);//显示模式设置 write_com(0x0e);//显示开关以及光标设置 write_com(0x06); write_com(0x80+0x10); } void main() { init(); for(num=0;num<11; num++) { write_date(table[num]); delay(20); } // write_com = 1;//清屏操作 write_com(0x80+0x53);//设置数据指针 for(num=0;num<15; num++) { write_date(table1[num]); delay(20); } for(num = 0 ;num<16;num++) { write_com(0x18);//整个屏幕左移 delay(20); } while(1); }
版权所有:转载请注明链接地址:http://www.cnblogs.com/fengdashen/p/3337331.html