单片机LCD12864液晶屏

单片机型号:STC89C52RC晶振频率:12MHZ液晶屏:KXM12864M-3液晶屏引脚定义如下图:液晶屏与单片机学习班使用40厘米左右的数据线相连液晶屏:RS,R/... 单片机型号: STC89C52RC
晶振频率: 12MHZ
液晶屏: KXM12864M-3

液晶屏引脚定义如下图:

液晶屏与单片机学习班使用40厘米左右的数据线相连
液晶屏:RS,R/W,E 分别连接 P2-0,P2-1,P2-2
液晶屏:第3,18,16留空不连接,15口连接P2-3,17口连接P2-5
电源口1,2均由学习板提供。背光灯连接外部电源
===========================================================

现在的问题是程序烧入进去了,液晶屏上没有任何显示,
接通背光电源背光亮,就是不显示文字。
程序是从网上找到的改了端口~! 代码在下面~!
本人是菜鸟,很喜欢单片机,初学不到两个月,
希望各位大虾帮帮忙看看是不是程序出了问题~! 谢谢~~!
===========================================================

#include <reg51.h>

#define unchar unsigned char
#define unint unsigned int

sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;

///延时等待函数
void delay(unsigned int t)
{
unsigned int i,j;
for(i=0;i<t;i++)for(j=0;j<10;j++);
}

////检测"忙碌"状态
void busy()
{
RS=0;
RW=0;
E=1;
P0=0xff;
while((P0&0x80)==0x80);
}

///写指令
void write_com(unchar com)
{
busy();
RS=0;
RW=0;
E=1;
P0=com;
delay(5);
E=0;
delay(5);
}

///写数据
void write_date(unchar date)
{
busy();
RS=1;
RW=0;
E=1;
P0=date;
// delay(5);
E=0;
// delay(5);
}

////初始化
void init()
{
delay(2000);
write_com(0x30); ///选择基本指令,选择8位数据流
delay(5);
write_com(0x0c); ///开显示 (无游标,不反白)
delay(10);
write_com(0x01); ///清除显示,并且设定地址指针为00H
delay(500);
write_com(0x06); ///设定游标移动方向
}

void sendaddr(unchar n,unchar m)
{
switch(n)
{
case 1:write_com(0x80+m);break;
case 2:write_com(0x90+m);break;
case 3:write_com(0x88+m);break;
case 4:write_com(0x98+m);break;
}
}

void display(unchar n,unchar m,unchar *s)
{
sendaddr(n,m);
while(*s>0)
{
write_date(*s);
s++;
delay(100);
}
}

///主程序入口(开始)
void main()
{
unchar *s;
init(); ///执行初始化
s="甲:“我来了”";
display(1,0,s); ///输出在第一行
s="乙:“热烈欢迎。”";
delay(10000);
display(2,0,s); ///输出在第二行
s="。。。“热烈欢迎”";
delay(10000);
display(3,0,s); ///输出在第三行
s="麻烦跟我去派出所";
delay(10000);
display(4,0,s); ///第四行
delay(10000);
write_com(0x01);
s="乙“为什么?”";
delay(10000);
display(1,0,s);
s="我们发现你偷税漏税。。。";
delay(10000);
display(2,0,s);
delay(10000);
write_com(0x01);
write_com(0x80);
write_date(0x32);
while(1);
}
展开
 我来答
超级大木头人
2011-01-11
知道答主
回答量:55
采纳率:0%
帮助的人:23.8万
展开全部
你用的是串口方式 而程序是并口方式,所以再怎么弄都不会显示出来 ;
我这里有串口方式的程序 今晚刚编好的 也测试了液晶能显示出来 你看看吧 把我的端口对应改一下就行 如果液晶再无法显示 那就是你硬件的问题了 比如PSB端口是否接了低电平
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit cs=P2^5; //片选端 高电平有效
sbit sid=P2^6; //数据线
sbit sclk=P2^7; //串行时钟信号 下降沿有效
uchar table[]="我是个小兵却乐天知命,在你的世界说鸟语,在我的世界对不起请说汉语";
uchar datecnt;

void delayms(uint z)//单位延时一毫秒
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);

}
void send_byte(uchar byte)//发送一个字节函数
{
uchar j;
cs=1;
for(j=0;j<8;j++)
{
sclk=0;
byte=byte<<1;
sid=CY;
sclk=1;
sclk=0;
}
cs=0;
}

void writecom_12864(uchar com)//写命令控制函数
{
uchar HDATA,LDATA;
HDATA=com&0xf0;
LDATA=((com<<4)&0xf0);
send_byte(0xf8);
send_byte(HDATA);
send_byte(LDATA);
}

void writedate_12864(uchar date)//写数据控制函数
{
uchar HDATA,LDATA;
HDATA=date&0xf0;
LDATA=((date<<4)&0xf0);
send_byte(0xfa);
send_byte(HDATA);
send_byte(LDATA);
}

void init_12864()//初始化12864
{
writecom_12864(0x30);
writecom_12864(0x30);
writecom_12864(0x0c);
writecom_12864(0x01);//清屏
writecom_12864(0x06);
}

void display_12864()
{

for(datecnt=0;datecnt<64;datecnt++)
{
if(datecnt==0) writecom_12864(0x80);
if(datecnt==16)writecom_12864(0x90);
if(datecnt==32)writecom_12864(0x88);
if(datecnt==48)writecom_12864(0x98);
writedate_12864(table[datecnt]);
}
}

void main()
{
init_12864();
display_12864();
while(1);
}
hepday
2011-01-11 · TA获得超过718个赞
知道小有建树答主
回答量:1074
采纳率:73%
帮助的人:319万
展开全部
凭俺的经验,如果12864只有背光灯在亮的话,请调节对比度也就是12864的第三脚,直接接到地
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
nishuileiyu
2011-01-09
知道答主
回答量:4
采纳率:0%
帮助的人:6930
展开全部
最好是招专业刷程序的刷下程序
还有一个就是你的液晶屏白屏。或屏线坏了
一般不管程序对错。都不会显示白屏只显示黑屏或花屏
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
a86223222
2011-01-10
知道答主
回答量:18
采纳率:0%
帮助的人:9.2万
展开全部
你仿真了没?仿真成功了就应该不是软件问题而是硬件问题。硬件的话检查显示器与单片机相连的控制端和数据传输端是否连好。看看有没有虚焊、短路什么的问题。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式