LCD1602显示屏概念:
工业字符型液晶,能够同时显示16x02即32个字符。
LCD1602显示屏原理图:

第1脚:VSS为电源地
第2脚:VCC接5V电源正极
第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。
第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。
第6脚:E(或EN)端为使能(enable)端,高电平(1)时读取信息,负跳变时执行指令。
第7~14脚:D0~D7为8位双向数据端。
第15~16脚:空脚或背灯电源。15脚背光正极,16脚背光负极。
LCD1602显示程序:
- #include
- #include
- #define uchar unsigned char
- #define uint unsigned int
- sbit RS=P2^6; //定义数据命令选择端
- sbit RW=P2^5; //定义读写选择端
- sbit E=P2^7; //定义使能端
- uchar shuju1[]="JackTao";
- uchar shuju2[]="Helloworld";
- void delay_ms(uint z) //延时函数(1毫秒)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- /*****************侧忙函数****************/
- uchar Lcd1602_ReadBusy() //判断lcd1602是否处于忙的状态
- {
- uchar temp;
- RS=0;
- RW=1;
- _nop_();
- P0=0xff; //读某IO口数据前,先将该口置为1
- /*原因:电路中存在的一个普遍的现象:高电平很容易被低电平拉低,而低电平一般不可能被高电平拉高。所以在读数据之前将单片机IO口拉高才不会影响原来数据线上的数据!*/
- _nop_();
- E=1;
- _nop_();
- temp=P0; //读取此时lcd1602的状态字
- _nop_();
- E=0;
- return (temp&0x80); //如果忙
- /*状态字为temp(8位2进制数)的最高位,最高位为1表示禁止读写,为0表示允许读写,即temp&0x80得1表示忙,得0表示不忙*/
- }
- /*****************写命令****************/
- void Lcd1602_WriteCom(uchar com)
- {
- while(Lcd1602_ReadBusy()); //判忙
- RS=0; //命令
- RW=0; //写
- _nop_();
- P0=com; //准备发送命令
- _nop_();
- E=1; //由时序图知,使能端为高电平时才允许数据交换
- _nop_();
- _nop_();
- E=0; //由时序图知,使能端在完成数据交换后要拉低
- _nop_();
- _nop_();
- }
- /****************写数据****************/
- void Lcd1602_WriteData(uchar dat)
- {
- while(Lcd1602_ReadBusy()); //判忙
- RS=1; //数据
- RW=0; //写
- _nop_();
- P0=dat;
- _nop_();
- E=1;
- _nop_();
- _nop_();
- E=0;
- _nop_();
- _nop_();
- }
- void Lcd1602_init() //初始化函数
- {
- delay_ms(15);
- write_com(0x38); //显示模式设置
- delay_ms(5);
- write_com(0x38);
- delay_ms(5);
- write_com(0x38);
- write_com(0x0c); //显示开
- write_com(0x01); //显示清屏
- write_com(0x06); //显示光标
- }
- void main()
- {
- uchar i,j;
- Lcd1602_init(); //Lcd初始化
- Lcd1602_WriteCom(0x80); //0x80是第一行的第一个字符的地址
- for(i=0;i<7;i++)
- Lcd1602_WriteData(shuju1[i]);
- Lcd1602_WriteCom(0x80+0x40); //0xc0是第二行的第一个字符的地址,可以用0xc0,0x80+0x40,0x80|0x40等等
- for(j=0;j<10;j++)
- Lcd1602_WriteData(shuju2[j]);
- }