cdrom控制板-液晶显示编程说明:8bit 显示方式 显示驱动函数 (这个驱动函数在 protues里面是无法正确模拟的!但是实际lcd1602是可以运行。)
lcd1602 8线并口通信源程序
连接方式是db0-db7接p1.0-p1.7;rs:p2.7;rw:p2.6 en:p2.5;
#include <reg51.h>
#define lcdio p0
sbit lcd1602_rs=p2^7;
sbit lcd1602_rw=p2^6;
sbit lcd1602_en=p2^5;
void lcd_delay(void)//使用延时函数代替busy check 该延时函数 使用for语句不能作为精确延时通用函数
{
unsigned char i;
for(i=40;i>0;i--)
;
}
void lcd_en_command(unsigned char command)
{
lcdio=command;
lcd1602_rs=0;
lcd1602_rw=0;
lcd1602_en=0;
lcd_delay();
lcd1602_en=1;
}
void lcd_en_dat(unsigned char dat)
{
lcd1602_rs=1;
lcd1602_rw=0;
lcd1602_en=0;
lcd_delay();
lcdio=dat;
lcd1602_en=1;
}
void lcd_set_xy( unsigned char x, unsigned char y )
{
unsigned char address;
if (y == 0)
address = 0x80 + x;
else
address = 0xc0 + x;
lcd_en_command(address);
}
void lcd_write_char( unsigned x,unsigned char y,unsigned char dat)
{
lcd_set_xy( x, y );
lcd_en_dat(dat);
}
void lcd_write_string(unsigned char x,unsigned char y,unsigned char *s)
{
lcd_set_xy( x, y );
while (*s)
{
lcdio=*s;
lcd_en_dat(*s);
s ++;
}
}
void lcd_init(void)//初始化函数 具体见 hd44780的命令详解
{
lcd_en_command(0x01);
delay_nms(5);
lcd_en_command(0x38);
delay_nms(5);
lcd_en_command(0x38);
delay_nms(5);
lcd_en_command(0x38);
delay_nms(5);
lcd_en_command(0xc0);
delay_nms(5);
lcd_en_command(0x80);
delay_nms(5);
lcd_en_command(0x01);
delay_nms(5);
}
void delay_nms(unsigned int n)//长延时函数,同样不能作为精确延时的用函数
{
unsigned int i=0,j=0;
for (i=n;i>0;i--)
for (j=0;j<1140;j++);
}
void main(void)
{
lcd_init();
while(1)
{
clearscreen;
delay_nms(2);
lcd_write_string(0,0," bg8wj");
lcd_write_string(0,1," cdrom contral ");
}
}