LCD12864仿真与现实用的LCD12864没有那一款是相同的,所以不能用仿真的代码驱动现实的LCD,你应该将你的LCD图片传上来让大家看看你用的是哪种(现实板的也有很大的不同,有有字库与无字库,驱动用的芯片也有很多不一样的)
我这有一个
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit RS = P2^6; //(数据命令)寄存器选择输入
sbit RW = P2^5; //液晶读/写控制
sbit EN = P2^7; //液晶使能控制
sbit PSB = P3^2; //串/并方式控制
sbit RST = P3^4; //复位端
void LCD12864_init();
void delay(uint c);
uchar Busy(void); //判忙
void WriteCmd(uchar cmd); //写指令
void WriteData(uchar dat); //写数据
void SetWindow(uchar x, uchar y); // SetWindow
void disp(uchar *wc); //显示
uchar code zhifu1[]="相见时难别亦难,东风无力百花残。春蚕到死丝方尽,蜡炬成灰泪始干。0 ";
uchar code zhifu2[]="晓镜但愁云鬓改,夜吟应觉月光寒。蓬山此去无多路,青鸟殷勤为探看。0 ";
uchar code shiju1[]="黄河远上白云间,一片孤城万仞山。羌笛何须怨杨柳,春风不度玉门关。0 ";
uchar code shiju2[]="两个黄鹂鸣翠柳,一行白鹭上青天。窗含西岭千秋雪,门泊东吴万里船。0 ";
uchar code shiju3[]=" 千山鸟飞绝, 万径人踪灭。 孤舟蓑笠翁, 独钓寒江雪。 0 ";
uchar code ci1[]="春花秋月何时了?往事知多少。 小楼昨夜又东风,故国不堪回首 0 ";
uchar code ci2[]="月明中。 雕栏玉砌应犹在,只是朱颜改。 问ju能有几多愁?0 ";// 我晕!没有君!
uchar code ci3[]="恰似一江春水 向东流。 0 ";
uchar code zhaopin1[]=" 【招聘】 电子软件工程师: 1 名 1.要会吹牛 0 ";
uchar code zhaopin2[]="2.要会勾妹仔, 多勾多得! 3.要会忽悠 赵本山十级俱佳。0 ";
void disp(uchar *wc)
{
uchar t;
t=0;
SetWindow(0, 0);
while(wc[t]!='\0')
{
WriteData(wc[t]);
t++;
if (t==16)SetWindow(1,0); //第一行满写第三行
if (t==32)SetWindow(2,0); //第三行满写第四行
if (t==48)SetWindow(3,0); //第三行满写第四行
}
delay(5000);
}
void main()
{
uchar j=0;
LCD12864_init();
while(1)
{
disp(&zhifu1);
disp(&zhifu2);
disp(&shiju1);
disp(&shiju2);
disp(&shiju3);
disp(&ci1);
disp(&ci2);
disp(&ci3);
disp(&zhaopin1);
disp(&zhaopin2);
}
}
void LCD12864_init() //初始化LCD12864
{
PSB = 1; //选择并行输入
RST = 1; //复位
WriteCmd(0x30); //选择基本指令操作
WriteCmd(0x0c); //显示开,关光标
WriteCmd(0x01); //清除LCD12864的显示内容
}
void delay(uint c)
{
uchar a,b;
for(; c>0; c--)
{
for(b=199; b>0; b--)
{
for(a=1; a>0; a--);
}
}
}
uchar Busy(void) //判忙
{
uchar i = 0;
RS = 0; //选择命令
RW = 1; //选择读取
EN = 1;
delay(1);
while(( P0 & 0x80) == 0x80) //检测读取到的值
{
i++;
if(i > 100)
{
EN = 0;
return 0; //超过等待时间返回0表示失败
}
}
EN = 0;
return 1;
}
void WriteCmd(uchar cmd) //写指令
{
uchar i;
i = 0;
while( Busy() == 0)
{
delay(1);
i++;
if( i>100)
{
return; //超过等待退出
}
}
RS = 0; //选择命令
RW = 0; //选择写入
EN = 0; //初始化使能端
P0 = cmd; //放置数据
EN = 1; //写时序
delay(5);
EN = 0;
}
void WriteData(uchar dat) //写数据
{
uchar i = 0;
while( Busy() == 0)
{
delay(1);
i++;
if( i>100)return;//超过等待退出
}
RS = 1; //选择数据
RW = 0; //选择写入
EN = 0; //初始化使能端
P0 = dat; //放置数据
EN = 1; //写时序
delay(5);
EN = 0;
}
void SetWindow(uchar x, uchar y) // SetWindow
{
uchar con;
if(x == 0) x = 0x80; // 第一行的地址是80H
else if(x == 1) x = 0x90; // 第二行的地址是90H
else if(x == 2) x = 0x88; // 第三行的地址是88H
else if(x == 3) x = 0x98; // 98
con = x + y;
WriteCmd(con);
}
这几点控制点你要改成你板上的,数据口也要改
sbit RS = P2^6; //(数据命令)寄存器选择输入
sbit RW = P2^5; //液晶读/写控制
sbit EN = P2^7; //液晶使能控制
sbit PSB = P3^2; //串/并方式控制
sbit RST = P3^4; //复位端
下面是我用的12864带字库
|