首页 > 编程知识 正文

单片机1602显示程序(51单片机LCD1602程序详解)

时间:2023-05-04 07:36:40 阅读:122661 作者:1111

LCD1602

工业用文字型液晶。 1602表示液晶屏上显示的内容为16X2,每行可以显示16个字符的两行。

特殊接口说明

RS:寄存器选择输入端子

RS=1:指向数据寄存器

RS=0:指向指令寄存器

RW:读写控制输入端子

RW=0:写入动作RW=1:读取动作

E:使能信号输入端子

读取动作时,高电平有效;

写入时,下降沿有效

程序编写:

# includere g51.h # includeintrins.h /其中有nop函数定义/*对于延迟较短的,要求在us级别采用“_nop_”函数,该函数相当大地发出nop指令NOP命令是单周期命令,可以根据晶振频率计算延迟时间,相对于12M晶振延迟1uS。 //# defineucharunsignedchar # defineuintunsignedintsbitrs=p2 ^ 6; //数据指令定义选择侧sbit RW=P2^5定义读写选择端子sbit E=P2^7使能端子的定义//注意:具体是哪个IO端口由你自己的接线决定,并不是必须这样写的uchar text1[ ]='欢迎到';//在第1行显示的字符uchar text2[]='Lime House '; //第2行显示的字符voidDelay_ms(uintz )//毫秒级别的延迟函数({ uint i,j; for(I=z; i0; i-- ) for(j=110; j0; j----; //为什么忙? 由于LCD1602的控制芯片还是CPU,因此处理上位机发送的命令需要花费时间。 复位命令、全屏命令等。 另外,如果LCD1602的CPU速度慢、上位机快,LCD1602CPU将无法完成前面的命令,而忽略后面的命令,导致命令序列无法正确完全到达LCD1602CPU,导致显示异常。 //uchar LCD 1602 _ read busy (判断/LCD 1602是否忙,即是否忙({ uchar temp; RS=0; RW=1; _nop_ (); P0=0xff; //在读取某个IO端口的数据之前,将该端口设为1 /*的理由:电路中存在高电平容易下降到低电平,低电平不能上升到高电平的普遍现象。 所以,只有在读取数据之前将单片机的IO端口设置得高一些,才会影响原数据线上的数据! (*/_nop_ ); E=1; _nop_ (); temp=P0; //此时的lcd1602的状态字_nop_ (); E=0; 返回(temp0x 80 ); //忙/*状态字为temp(8位二进制)的最高位,最高位为1时表示禁止读写,0时表示允许读写。 也就是说,temp0x80表示忙,0表示不忙。 ()/) )液晶屏1602上的资料提供了读写操作的时序图,需要认真对待液晶屏1602的具体工作步骤*/void液晶屏1602 _ write com (uchar com ) /书写//宣告忙碌的RS=0命令RW=0; _nop_ (书写; P0=com; //准备发送指令_nop_ (; E=1; 从//时序图可知,在使能端子为高电平时才进行数据交换_nop_ (); _nop_ (); E=0; //时序图显示,使能方在数据交换完成后必须降低_nop_ ()。 _nop_ (); } void LCD 1602 _ write data (uchar dat ) /刻录数据(while ) LCD1602_readbusy ); //忙碌的RS=1; //数据RW=0; _nop_ (书写; P0=dat; _nop_ (); E=1; _nop_ (); _nop_ (); E=0; _nop_ (); _nop_ (); }voidLCD1602_init(/初始化函数) Delay_ms ) 15; write_com(0x38; //显示模式设定Delay_ms(5; write_com(0x38; dlay_ms(5; write_com(0x38; write_com(0x0c; 显示//write_com(0x01 )//显示清晰屏幕write_com(0x06 )//显示光标} void main () { uchar i,j; Lcd1602_init (; LCD1602_writecom(0x80 ); //0x80是第一行第一个字符的地址for(I=0; i10; I ) LCD1602_writedata(text1[I]; 液晶屏1602 _ write com (0x800 x40 ); //0xc0有很多方法可以用第二行中第一个字符的地址/*来表示,例如0xc 0,0 x800 x40,0x 80|0x 40,*.for(j=0; j10; j ) LCD 1602 _ write data (文本2 [ j ]; } 其实,LCD1602还有很多很好玩的指令,比如让字符左移右移,大家可以好好看一看lcd1602资料中的相关指令,自己动手去实践一下,才会有更深刻的体会。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。