谁能看看LCD1602程序哪有问题,

2019-07-15 14:15发布

谁能看看LCD1602程序哪有问题,为什么第二行的数据会出现在第一行呢,分别显示的时候,都能正常显示,但是同时显示的时候就出错了。
程序如下:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar table0[]={" X "};
uchar table1[]={" Y "};
sbit rs=P2^0;//数据命令选择端         RS寄存器选择,RS=1数据寄存器,RS=0指令寄存器
sbit rw=P2^1;
sbit en=P2^2;//使能端         en为低电平时液晶屏开始执行命令。
uchar num,num1,x1,y1;
uchar a,b;
uchar h=0,d=0;
void delay(uint n)//延时程序
{
while(n>0) n--;
}
bit Busy(void)
{
bit busy_flag = 0;
rs = 0;
rw = 1;
en = 1;
delay(5);
busy_flag = (bit)(P0 & 0x80);
en = 0;
return busy_flag;
}
void write_com(uchar com) //液晶写命令程序
{
while(Busy());
rw=0;
rs=0;//等0输入是命令
en=0;//液晶使能信号初始化
delay(10);
P0=com;//把com参数,液晶的命令值送到P0口
delay(10);//延时,按照液晶时序图要的要求
en=1;//使能信号,0到1表示上升沿打开可以写命令数据到液晶里
delay(10);
en=0;//使能信号恢复0
}
void write_data(uchar date) //液晶写数据程序
{
while(Busy());
rs=1; //等1表示输入是数据
rw=0;
en=0;
delay(10);
P0=date; //把date参数,液晶的数据送到P0口;
delay(10);
en=1;
delay(10);
en=0;
}
void init() //液晶初始化程序
{rs=0;
en=0;
delay(50);
write_com(0x38); //0x38是按照液晶文档说明写    0011 1000                 显示模式设置:设置为16*2显示,5*7点阵,8位数据接口
delay(50);
write_com(0x0c);                                                          //0000        1100                 显示开关及光标设置,开显示,不显示光标,光标不闪烁
delay(10);
write_com(0x06);                                                         //0000        0110                 输入模式设置,光标右移,文字不移动
delay(10);
write_com(0x01);                                                         //0000        0001                液晶全清屏指令
delay(10);
write_com(0x80);
}
void convertx() //坐标处理程序,把坐标x值转换位液晶显示
{
table0[8]=(x1/100)+'0'; //液晶第9位字符为坐标的百位数,例如120度的1
table0[9]=((x1/10)%10)+'0'; //液晶的第10位字符为坐标的十位,例如2
table0[10]=(x1%10)+'0'; //液晶的第11位字符为坐标的个位,例如0
}
void converty() //坐标处理程序,把坐标x值转换位液晶显示
{
table1[8]=(y1/100)+'0'; //液晶第9位字符为坐标的百位数,例如120度的1
table1[9]=((y1/10)%10)+'0'; //液晶的第10位字符为坐标的十位,例如2
table1[10]=(y1%10)+'0'; //液晶的第11位字符为坐标的个位,例如0
}  
void main()
{
//unsigned char i;
x1=0xb5;
y1=0xb2;
delay(30);  
init();
convertx();
converty();
//液晶的第一行开始地址
for(num=0;num<11;num++) //显示16位数据,后面的几位没有用到就不写到16,以免后面的几位会出现一个随机数据显示乱码
{a=0x80+num;
write_com(a);  
write_data(table0[num]); //液晶需要显示的内容
}

write_com(0xc0);
for(num1=0;num1<11;num1++) //显示16位数据,后面的几位没有用到就不写到16,以免后面的几位会出现一个随机数据显示乱码
{b=0xc0+num1;
write_com(b);
write_data(table1[num1]); //液晶需要显示的内容
}
while(1);
}

lcd.jpg
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
米兰霸气
1楼-- · 2019-07-15 19:10
 精彩回答 2  元偷偷看……
烈焰123
2楼-- · 2019-07-16 01:00
米兰霸气 发表于 2016-4-25 23:13
大致瞟了下,目测地址没写对,write_com(0x80)是从第一行显示,如果要从第二行显示,首先地址为write_com(0x80+0x40)

80H加40H不是C0H么
qqydf
3楼-- · 2019-07-16 05:15
table赋值,你查看一下,是不是没有赋值。
qqydf
4楼-- · 2019-07-16 08:11
初值先用空值占位,试一下。
烈焰123
5楼-- · 2019-07-16 12:39
通过快一周的调试,终于成功了。
LCD1602.jpg

一周热门 更多>