LCD1602
仿真图。
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS = P1^0;
sbit RW = P1^1;
sbit E = P1^2;
sbit D7 = P2^7;
void write_code(uchar row, uchar col, uchar *p);
void LCD_init();
void main()
{
LCD_init();
while(1)
{
write_code(0, 0, "0123456789");
write_code(1, 0, "ABCDEFGHIJK");
}
}
void delay(uint n)
{
while(n--);
}
void wait() //判忙
{
P2 = 0XFF; //全部拉高
do{
RS = 0;
RW = 1; //读状态
E = 0;
E = 1;
}while(D7 != 0); //判断最后一位是否为1,是1继续循环,否则为0;
E = 0;
}
void write_dat(uchar dc, uchar dat)
{
wait();
delay(10);
E = 0;
delay(10);
RW = 0; //拉低才能写入数据
delay(10);
RS = dc; //决定写数据还是写数据
delay(10);
P2 = dat; //数据端口
delay(10);
E = 1;
delay(10);
E = 0;
}
void write_code(uchar row, uchar col, uchar *p)
{
row %= 2; col %= 16;
write_dat(0, 0x80+0x40*row+col); //写显示地址
while(*p != '\0')
write_dat(1, *p++); //数据++,地址自动+1
}
void LCD_init() //初始化
{
write_dat(0, 0x38); //8位数据,二行显示,5x7字符
write_dat(0, 0x0c); //显示开,光标关。
write_dat(0, 0x06); //光标右移一个,AC加1
write_dat(0, 0x01); //清显示
}
代码部分。