液晶12864串口通信(很好的实例,验证通过)

/* 液晶12864并口通信要8根数据线,en,rw,rs和电源正负线,要连一大堆线,用起来很不爽,学会用串口通信成了必然。下面是12864的串口通信传输数据,连电源线一起总共才需要4根线,多爽!(记住:一定要把PSB接低电平,把RS接高电平) */



#include
#define U8 unsigned char
#define U16 unsigned int

sbit clk=P3^0;
sbit sid=P3^1;


void delayms(U16 ms)
{
U16 i;
for(;ms>0;ms--)
{
for(i=124;i>0;i--);
}
}


void send_dat(U8 dat)
{
U8 i;
for(i=0;i<8;i++)
{
clk=0;
dat<<=1;
sid=CY;
clk=1;
}
}

U8 get_byte()
{
U8 i,temp1=0,temp2=0;
for(i=0;i<8;i++)
{
temp1=temp1<<1;
clk = 0;
clk = 1;
clk = 0;
if(sid) temp1++;
}
for(i=0;i<8;i++)
{
temp2=temp2<<1;
clk = 0;
clk = 1;
clk = 0;
if(sid) temp2++;
}
return ((0xf0&temp1)+(0x0f&temp2));
}

void check_busy()
{
do
{
send_dat(0xfc);
}
while(get_byte()&0x80);
}

void send_cmd(U8 cmd)
{
check_busy();
send_dat(0xf8); //
send_dat(cmd&0xf0); //
send_dat((cmd&0x0f)<<4); //
}

void write_char(U8 dat)
{
check_busy();
send_dat(0xfa);//rw=0;rs=1
send_dat(dat&0xf0);
send_dat((dat&0x0f)<<4);
}

void lcd_clear() //清除显示
{
send_cmd(0x01);
}


void lcd_pos(U8 y_add , U8 x_add)
{
switch(y_add)
{
case 1:
send_cmd(0X80|x_add);break;
case 2:
send_cmd(0X90|x_add);break;
case 3:
send_cmd(0X88|x_add);break;
case 4:
send_cmd(0X98|x_add);break;
default:break;
}
}


void lcd_wstr(U8 y_add , U8 x_add , U8 *str) //
{
U8 i;
lcd_pos(y_add , x_add);
for(i=0;str[i]!='\0';i++)
{
write_char(str[i]);
}

}

void write_figer(uchar y_add , uchar x_add , uint figer)//在任何位置写数字
{
uchar d[5],i,j;
lcd_pos(y_add , x_add);
d[4]=figer%10;
d[3]=figer%100/10;
d[2]=figer%1000/100;
d[1]=figer%10000/1000;
d[0]=figer/10000;
for(i=0;i<5;i++)
{
if(d[i]!=0)break;
}

if(5==i)i--;
if(i==4)send_data(0x30);//数据装完,准备发送
for(j=i;j<5;j++)
{
send_data(d[j]|0x30);//取得的数字加上0x30也即得到该数字的ASCII码,再将该数字发送去显示
}

}

void lcd_init() //
{
delayms(1);
send_cmd(0x30);
send_cmd(0x0C);//0000,1100 整体显示,游标off,游标位置off
send_cmd(0x01);//0000,0001 清DDRAM
send_cmd(0x02);//0000,0010 DDRAM地址归位
send_cmd(0x80);//1000,0000 设定DDRAM 7位地址000,0000到地址计数器A

}

main()
{
P0=0xff;
lcd_init();
while(1)
{
lcd_clear();
lcd_wstr(1,0,"桂林电子科技大学");
lcd_wstr(2,1,"机电工程学院");
lcd_pos(3,0);
write_char('a');
write_char('b');
lcd_pos(3,4);
write_char('c');
write_char('d');
lcd_wstr(4,0,"*****!!!--*****");
delayms(2000);
lcd_clear();
lcd_wstr(1,0,"床前明月光");
lcd_wstr(2,1,"疑是地上霜");
lcd_wstr(3,1,"举头望明月");
lcd_wstr(4,1,"低头思故乡");
delayms(2000);
}

}


相关文档
最新文档