液晶12864串口通信(很好的实例,验证通过)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
clk = 0;
if(sid) temp1++;
}
for(i=0;i<8;i++)
{
temp2=temp2<<1;
clk = 0;
}
}
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;
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);
/* 液晶12864并口通信要8根数据线,en,rw,rs和电源正负线,要连一大堆线,用起来很不爽,学会用串口通信成了必然。下面是12864的串口通信传输数据,连电源线一起总共才需要4根线,多爽!(记住:一定要把PSB接低电平,把RS接高电平) */
#include<reg52.h>
#define U8 unsigned char
{
do
{
send_dat(0xfc);
}
while(get_byte()&0x80);
}
void send_cmd(U8 cmd)
{
check_busy();
send_dat(0xf8); //
send_dat(cmd&0xf0); //
lcd_pos(3,4);
write_char('c');
write_char('d');
lcd_wstr(4,0,"*****!!!--*****");
delayms(2000);
lcd_clear();
}
if(5==i)i--;
if(i==4)send_data(0x30);//数据装完,准备发送
for(j=i;j<5;j++)
{
send_data(d[j]|0x30);//取得的数字加上0x30也即得到该数字的ASCII码,再将该数字发送去显示
lcd_wstr(1,0,"床前明月光");
lcd_wstr(2,1,"疑是地上霜");
lcd_wstr(3,1,"举头望明月");
lcd_wstr(4,1,"低头思故乡");
delayms(2000);
}
clk = 1;
clk = 0;
if(sid) temp2++;
}
return ((0xf0&temp1)+(0x0f&temp2)))
{
lcd_clear();
lcd_wstr(1,0,"桂林电子科技大学");
lcd_wstr(2,1,"机电工程学院");
lcd_pos(3,0);
write_char('a');
write_char('b');
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++)
#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--);
send_cmd(0x02);//0000,0010 DDRAM地址归位
send_cmd(0x80);//1000,0000 设定DDRAM 7位地址000,0000到地址计数器A
}
main()
{
P0=0xff;
lcd_init();
while(1)
case 2:
send_cmd(0X90|x_add);break;
case 3:
send_cmd(0X88|x_add);break;
case 4:
send_cmd(0X98|x_add);break;
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;
}
}
void lcd_init() //
{
delayms(1);
send_cmd(0x30);
send_cmd(0x0C);//0000,1100 整体显示,游标off,游标位置off
send_cmd(0x01);//0000,0001 清DDRAM
{
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);
}
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;
if(sid) temp1++;
}
for(i=0;i<8;i++)
{
temp2=temp2<<1;
clk = 0;
}
}
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;
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);
/* 液晶12864并口通信要8根数据线,en,rw,rs和电源正负线,要连一大堆线,用起来很不爽,学会用串口通信成了必然。下面是12864的串口通信传输数据,连电源线一起总共才需要4根线,多爽!(记住:一定要把PSB接低电平,把RS接高电平) */
#include<reg52.h>
#define U8 unsigned char
{
do
{
send_dat(0xfc);
}
while(get_byte()&0x80);
}
void send_cmd(U8 cmd)
{
check_busy();
send_dat(0xf8); //
send_dat(cmd&0xf0); //
lcd_pos(3,4);
write_char('c');
write_char('d');
lcd_wstr(4,0,"*****!!!--*****");
delayms(2000);
lcd_clear();
}
if(5==i)i--;
if(i==4)send_data(0x30);//数据装完,准备发送
for(j=i;j<5;j++)
{
send_data(d[j]|0x30);//取得的数字加上0x30也即得到该数字的ASCII码,再将该数字发送去显示
lcd_wstr(1,0,"床前明月光");
lcd_wstr(2,1,"疑是地上霜");
lcd_wstr(3,1,"举头望明月");
lcd_wstr(4,1,"低头思故乡");
delayms(2000);
}
clk = 1;
clk = 0;
if(sid) temp2++;
}
return ((0xf0&temp1)+(0x0f&temp2)))
{
lcd_clear();
lcd_wstr(1,0,"桂林电子科技大学");
lcd_wstr(2,1,"机电工程学院");
lcd_pos(3,0);
write_char('a');
write_char('b');
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++)
#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--);
send_cmd(0x02);//0000,0010 DDRAM地址归位
send_cmd(0x80);//1000,0000 设定DDRAM 7位地址000,0000到地址计数器A
}
main()
{
P0=0xff;
lcd_init();
while(1)
case 2:
send_cmd(0X90|x_add);break;
case 3:
send_cmd(0X88|x_add);break;
case 4:
send_cmd(0X98|x_add);break;
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;
}
}
void lcd_init() //
{
delayms(1);
send_cmd(0x30);
send_cmd(0x0C);//0000,1100 整体显示,游标off,游标位置off
send_cmd(0x01);//0000,0001 清DDRAM
{
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);
}
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;