我已经将串口数据转为相应的十进制数并把每位分离出来了,而且有+0x30,但是最后在液晶上显示的都是0,不知道是为什么
相关代码如下
ge=ge+0x30;
write_date(ge);
如果我在前面令ge=1的话,液晶上是能显示出1的,想不通问题出在哪里了,求指教
全程序如下
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit lcden=P2^7;
sbit lcdrs=P2^5;
uint a,b,c,d,s,j,k,ge,shi,bai,qian,wan,shiwan,baiwan,qianwan;
uchar flag;
uchar reg[10] = {0,0,0,0,0,0,0,0,0,0};//特别注意,uchar的取值范围为0——255
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)//指令程序,显示模式设置
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date)//数据程序,写在液晶要显示的字符
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()//初始化
{
P2=0;
lcden=0;
write_com(0x38); //设置显示模式为16*2显示,5*7点阵,8位数据接口
write_com(0x0f); //设置开显示,显示光标,光标闪烁
write_com(0x06); //设置写入的方式
write_com(0x80); //数据指针设置
}
void main()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
P0=0xff;
EA=1;//这是总中断
ES=1;//这是串口中断,打开串口中断表示让串口以中断方式工作
if(flag==2) //判断两个字节是否全部接受
{
init();
ES=0;
flag=0;
c=0;
a=reg[1]*256;
b=a+reg[0];
ge=b%10000%1000%100%10;//取值
shi=b%10000%1000%100/10;
bai=b%10000%1000/100;
qian=b%10000/1000;
wan=b/10000;
//ge=1;如果我不注销这一行,液晶就会显1
ge=ge+0x30; 我怀疑问题是出在这个位置
shi=shi+0x30;
bai=bai+0x30;
qian=qian+0x30;
wan=wan+0x30;
ES=1;
write_date(ge);
delay(20);
}
}
void ser() interrupt 4
{
RI=0;
reg[c]=SBUF;
c++;
flag++;
}
------解决方案--------------------
液晶有驱动逻辑图。
一般有片选端口
数据端口
时钟端口
使能端口
忙闲信号端口
数据锁存端口
有些还有指令数据区分端口。
仔细看看逻辑图,严格按照逻辑图编辑代码。
如果有demo代码,好好看看即可顺利移植。