2017年12月15日
1602液晶显示程序
1602液晶屏内部常用的命令定义:
1、0x38:设置16*2显示;5*7点阵;8位数据口连接
2、0x01:清屏
3、0x0f:开显示,显示光标,光标不闪烁
4、0x08:只开显示
5、0x0e:开显示不显示光标
6、0x06:地址加一,当写入数据时光标右移
7、0x02:地址计数器AC=0(此时地址为0x80)光标归原点但DDRAM中断内容不变
8、0x18:光标和显示一起向左移动
#include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit lcden=P3^2;//位定义1602液晶使能脚 sbit rs=P3^0; //位定义1602液晶数据/命令(H/L)引脚 sbit rw=P3^1; //位定义1602液晶读/写(H/L)引脚 sbit dula=P2^6;//数码管段选 sbit wela=P2^7;//数码管位选 uchar table1[]="HELLO QX-MCS51";//第一行要显示的字符 uchar table2[]=" QQ:7651719 ";//第二行要显示的字符 void delay(uint x)//延时函数,单位us { uint a,b; for(a=x;a>0;a--) for(b=10;b>0;b--); } void delay1(uint x)//延时函数,单位ms { uint a,b; for(a=x;a>0;a--) for(b=100;b>0;b--); } void write_com(uchar com)// 向D0~D7输入指令 { P2=com; //将8条串口数据线赋给com rs=0; //指令 lcden=0; //使能端初始化 delay(10); //延时10us lcden=1; //使能端由高电平转向低电平时输入指令 delay(10); //延时10us lcden=0; } void write_date(uchar date) //向D0~D7输入数据 { P2=date; rs=1; //数据 lcden=0; //使能端初始化 delay(10); //延时10us lcden=1; //在en使能端由高电平转向低电平之间的时间里向1602输入数据或命令 delay(10); //延时10us lcden=0; } void init() //液晶初始化 { rw=0; //写 dula=0; //关闭段选和位选 wela=0; write_com(0x38);//设置16乘2显示,5乘7点阵,8位数据口连接 delay(20); write_com(0x0f); //开显示,显示光标,光标不闪烁 delay(20); write_com(0x06);//地址加1,当写入数据时向右移 delay(20); write_com(0x01); //清屏 delay(20); } void main() { uchar a; init();//液晶初始化函数 write_com(0x80+17); //0x80为液晶显示第一行初始地址 delay(20); //延时20us for(a=0;a<14;a++) //a代表table1字符显示的字符数量 { write_date(table1[a]);//向1602中输入字符 delay(20); //等待20us } write_com(0xc0+17);//液晶第二行初始地址 delay(50); //延时50us /*for(a=0;a<14;a++) { write_date(table2[a]);//a代表table2中的字符 delay(40); //等待40us }*/ for(a=0;a<16;a++) //右移16个字符 { write_com(0x18); //光标和显示一起向左移 delay1(200); //延时200ms } while(1); //循环
}