谁能看看为什么LCD没反应。

2019-07-18 11:24发布

谁能看看程序哪错了,怎么仿真LCD1602没反应?
//******************************//
//******************************//
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar table[]={"X:"};
uchar table1[]={"Y:"};
sbit en=P2^2;//使能端         en为低电平时液晶屏开始执行命令。
sbit rs=P2^0;//数据命令选择端         RS寄存器选择,RS=1数据寄存器,RS=0指令寄存器

uchar num,num1,x1,y1;
uint d=0,h=0,d1=0,h1=0;
/********************************************************************/
void delay(uint n)//延时程序
{
while(n>0) n--;
}
void write_com(uchar com) //液晶写命令程序
{
rs=0;//等0输入是命令
en=0;//液晶使能信号初始化
P0=com;//把com参数,液晶的命令值送到P0口
delay(100);//延时,按照液晶时序图要的要求
en=1;//使能信号,0到1表示上升沿打开可以写命令数据到液晶里
delay(100);
en=0;//使能信号恢复0
}
void write_data(uchar date) //液晶写数据程序
{
rs=1; //等1表示输入是数据
en=0;
P0=date; //把date参数,液晶的数据送到P0口;
delay(100);
en=1;
delay(100);
en=0;
}
void init() //液晶初始化程序
{
en=0;
write_com(0x38); //0x38是按照液晶文档说明写    0011 1000                 显示模式设置:设置为16*2显示,5*7点阵,8位数据接口
write_com(0x0c);                                                          //0000        1100                 显示开关及光标设置,开显示,不显示光标,光标不闪烁
write_com(0x06);                                                         //0000        0110                 输入模式设置,光标右移,文字不移动
write_com(0x01);                                                         //0000        0001                液晶全清屏指令
}
/*********************************************************/
//-------------------------
void Readtemp(void) //读x1,y1程序
{
d=x1;  //坐标x1的低8位数据函数
h=x1; //坐标x1的高8位数据函数
d1=y1;  //坐标y1的低8位数据函数
h1=y1; //坐标y1的高8位数据函数
}
/*********************************************************/
void convertx() //坐标处理程序,把坐标x值转换位液晶显示
{
uint temp,tmp;
float tt;
tmp=d; //低8位数据给tmp
temp=h; //高8位数据给temp
temp<<=8; //高8位左移8位
temp|=d; //高低位数据或起来再赋给temp  
if((h&0x80)!=0) //高8位h&10000000是否等0,不等0表示是负多少度
{
table[7]='-'; //把-赋给液晶数组的第8个元素,表示-号在第8位,1602液晶一行有16个字符
temp=temp-1;
temp=~temp;
}
else
table[7]='+';
temp>>=4;
table[8]=(temp/100)+'0'; //液晶第9位字符为坐标的百位数,例如120度的1
table[9]=((temp/10)%10)+'0'; //液晶的第10位字符为坐标的十位,例如2
table[10]=(temp%10)+'0'; //液晶的第11位字符为坐标的个位,例如0
tmp=tmp&0x0f; //坐标提取小数数据
tt=tmp*0.0625; //小数部分数据转换
table[11]='.'; //显示小数点
table[12]=((uchar)(tt*10))%10+'0'; //小数点后面的小数数字
}
/**************************************************************/
void converty() //坐标处理程序,把坐标y值转换位液晶显示  
{
uint temp,tmp;
float tt;
tmp=d1; //低8位数据给tmp
temp=h1; //高8位数据给temp
temp<<=8; //高8位左移8位
temp|=d1; //高低位数据或起来再赋给temp  
if((h&0x80)!=0) //高8位h&10000000是否等0,不等0表示是负多少度
{
table1[7]='-'; //把-赋给液晶数组的第8个元素,表示-号在第8位,1602液晶一行有16个字符
temp=temp-1;
temp=~temp;
}
else
table1[7]='+';
temp>>=4;
table1[8]=(temp/100)+'0'; //液晶第9位字符为坐标的百位数,例如120度的1
table1[9]=((temp/10)%10)+'0'; //液晶的第10位字符为坐标的十位,例如2
table1[10]=(temp%10)+'0'; //液晶的第11位字符为坐标的个位,例如0
tmp=tmp&0x0f; //坐标提取小数数据
tt=tmp*0.0625; //小数部分数据转换
table1[11]='.'; //显示小数点
table1[12]=((uchar)(tt*10))%10+'0'; //小数点后面的小数数字
}
void main()
{
x1=0xb5;
y1=0xb2;
init(); //液晶初始化函数
Readtemp();
converty();
write_com(0x80+0x40); //0x80+0x40表示液晶的第二行的开始地址
for(num1=0;num1<16;num1++) //num<16,16表示显示16位
{
write_data(table1[num1]); //液晶需要显示的内容,
}
convertx();  
write_com(0x80); //液晶的第一行开始地址
for(num=0;num<16;num++) //显示16位数据,后面的几位没有用到就不写到16,以免后面的几位会出现一个随机数据显示乱码
{
write_data(table1[num]); //液晶需要显示的内容
}
}

lcd.jpg
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。