|
我的程序有一点小问题,开机时LCD显示000000,当我按键盘的时候,数据从第二位开始显示,即我输入1的时候,正常应该是100000,定时我显示的是010000,当我按完五位数后,后面若再有键按下,就从第一位开始显示了,我认真的检查过程序,不知道问题出在那里,希望高人指点指点,谢谢!我的程序如下:
#include< W77E58.H>
#define uchar unsigned char
#define uint unsigned int
#define KEY P2
#define DATA P0
sbit RS=P3^3; //1602LCD控制接口
sbit RW=P3^4; //1602LCD读写接口
sbit E=P3^5; //1602LCD使能接口
uint m=0;
uchar n=0;
uchar v=0;
uchar key_num[6]={0,0,0,0,0,0};
uchar code keycode[12] =
{
0xee,0xde,0xbe,
0xed,0xdd,0xbd,
0xeb,0xdb,0xbb,
0xe7,0xd7,0xb7
};
void delay(uchar k)
{
uchar m,n;
for(m=0;m<20;m++)
for(n=0;n<k;n++);
}
void write_com(uchar com)
{
E=0;
RW=0;
RS=0;
P0=com;
E=1;
delay(10);
}
void write_dat(uchar dat)
{
E=0;
RW=0;
RS=1;
P0=dat;
E=1;
delay(10);
}
void LCD_init()
{
write_com(0x38); //8bit I/F;2-linedisplay;5x8 font
write_com(0x04); // screen shifting
write_com(0x0c); //Display on;cursor off;cursor-blinking off
write_com(0x01); //clear screen
}
uchar key_scan(void)
{
uchar i=0xff,keyval=0;
KEY=0xf0; //将行线拉低
if (KEY != 0xf0) //表示有键按下
{
keyval = (KEY & 0xf0); //取被改变的高4位
KEY=0x0f; //再将列线拉低
keyval |= (KEY & 0x0f); //取被改变的低4位
if (keyval != v)
{
for (i = 0;i<12;i++) if(keyval == keycode) break; //在数组中搜索符合的条件
if (i>=12) i=0xff;
v = keyval;m=0;
}
else i=0xff;
}
return i;
}
void key_test(void)
{
uchar val =0;
uchar a=0;
val = key_scan();
if (val != 0xff)
{
a=val+1;
n++;
if (n>=6)
n=0;
if(a<=11)
{
key_num[n] = a;
}
if(a==11)
{
key_num[n]=0;
}
if(a==12)
{
key_num[n]=11;
}
}
}
void display()
{
write_com(0x80);
if(key_num[0]<10)
{
write_dat(key_num[0]+0x30);
}
else
{
write_dat(key_num[0]+0x37);
}
write_com(0x81);
if(key_num[1]<10)
{
write_dat(key_num[1]+0x30);
}
else
{
write_dat(key_num[1]+0x37);
}
write_com(0x82);
if(key_num[2]<10)
{
write_dat(key_num[2]+0x30);
}
else
{
write_dat(key_num[2]+0x37);
}
write_com(0x83);
if(key_num[3]<10)
{
write_dat(key_num[3]+0x30);
}
else
{
write_dat(key_num[3]+0x37);
}
write_com(0x84);
if(key_num[4]<10)
{
write_dat(key_num[4]+0x30);
}
else
{
write_dat(key_num[4]+0x37);
}
write_com(0x85);
if(key_num[5]<10)
{
write_dat(key_num[5]+0x30);
}
else
{
write_dat(key_num[5]+0x37);
}
}
void main (void)
{
TMOD=0X20;
TR1=1;
TH1=0XFA;
TL1=0XFA;
SCON1=0X40;
PCON=0X00;
EA=1;
ES1=1;
LCD_init();
while(1)
{
key_test();
TI_1=0;//置位
SBUF1 =key_num[0]; //发送数据
while(!TI_1);//等待数据发送完
TI_1=0;//置位
SBUF1 =key_num[1]; //发送数据
while(!TI_1);//等待数据发送完
TI_1=0;//置位
SBUF1 =key_num[2]; //发送数据
while(!TI_1);//等待数据发送完
TI_1=0;//置位
SBUF1 =key_num[3]; //发送数据
while(!TI_1);//等待数据发送完
TI_1=0;//置位
SBUF1 =key_num[4]; //发送数据
while(!TI_1);//等待数据发送完
TI_1=0;//置位
SBUF1 =key_num[5]; //发送数据
while(!TI_1);//等待数据发送完
display();
delay(10);
if (m++ == 50)
{m=0;
v=0;
}
}
} |
|