#include <reg51.h>
#include <intrins.h>
sbit RS = P2^0; //寄存器选择输入
sbit RW = P2^1; //液晶读/写控制
sbit E = P2^2; //液晶使能控制
void lcd_w_cmd(unsigned char com);
void lcd_w_dat(unsigned char dat);
void lcd_int();
unsigned char lcd[]="hello!";
unsigned char diz[]={0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8b,0x8d,0x8e,0x8f};
void delay(unsigned int i)
{
unsigned int k;
for(k=0;k<i;k++);
}
void main()
{ int i;
lcd_int(); //LCD初始化
delay(20505);
while(1) {
for(i=0;i<6;i++){
lcd_w_cmd(0x80+i); //0x80代表第一行第一个,0xc0代表第二行第一个,可以往后加到F,F之后就无法显示了
lcd_w_dat(lcd[i]);
lcd_w_cmd(0xc5+i);
lcd_w_dat(lcd[i]);
}
/*22222 for(i=16;i>=0;i--){
lcd_w_cmd(0x8F-i); //0x80代表第一行第一个,0xc0代表第二行第一个,可以往后加到F,F之后就无法显示了
lcd_w_dat('S');
delay(10505);
lcd_w_cmd(0x8F-i);
lcd_w_dat(0x00);
} */
}
}
void delay1()
{
_nop_();
_nop_();
_nop_();
}
void lcd_int()
{
lcd_w_cmd(0x3c); //0011 1100 如果只能显示一行,那就写多次这个代码,第一次可能是3写进去了,C没写进去
_nop_();
lcd_w_cmd(0x3c); //0011 1100
_nop_();
lcd_w_cmd(0x0c); //0000 1110 低2位是控制闪烁,低1位是控制光标
_nop_();
lcd_w_cmd(0x01); //0000 0001 清屏幕指令,将以前的显示内容清零
_nop_();
lcd_w_cmd(0x06); //0000 1010 显示模式设置:光标右移,字符不移
_nop_();
lcd_w_cmd(0x80); //1000 0000
}
void lcd_w_cmd(unsigned char com)
{
RW=0; //从lcd写指令或数据
delay1();
RS=0; //输入指令
delay1();
E=1; //读取信息
delay1();
P1=com;
delay1();
E=0; //执行指令
delay1();
RW=1; //从lcd读取数据
delay(255);
}
void lcd_w_dat(unsigned char dat)
{
RW=0;
delay1();
RS=1;
delay1();
E=1;
delay1();
P1=dat;
delay1();
E=0;
delay1();
RW=1;
delay(255);
}
|