求帮忙看看这个矩阵键盘的程序,为什么在LCD1602上显示的是乱码啊。。T_T
我想用矩阵键盘输入1354这个数据,然后在LCD1602上显示,但显示的全是乱码
#include<reg51.h>
#define LCD1602_DATAPINS P0
#define GPIO_KEY P2
sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;
void LcdWriteCom(unsigned char com);//LCD控制
void LcdWriteData(unsigned char dat);//LCD数据
void KeyScan(void);
void Delay(unsigned short int c);
unsigned char KeyValue;//键盘键值
unsigned char i;
void main(void)
{
LcdWriteCom(0x32);//将8位总线转为4位总线
LcdWriteCom(0x28);//在四位线下的初始化
LcdWriteCom(0x0c);//开显示不显示光标
LcdWriteCom(0x06);//写一个指针加1
LcdWriteCom(0x01);//清屏
LcdWriteCom(0x80);//设置数据指针起点
while(1)
{
KeyValue = 16;
while(KeyValue>15)
{
KeyScan();
}
if(KeyValue < 10)
{
LcdWriteData('0' + KeyValue);
}
else
{
LcdWriteData('7' + KeyValue); //A的ASCII码的前10位是7,所以用7做基数
}
LcdWriteCom(0x15);
}
}
void Delay(unsigned int c) //误差 0us
{
unsigned char a,b;
for (; c>0; c--)
{
for(b=199; b>0; b--)
{
for(a=1; a>0; a--);
}
}
}
void LcdWriteCom(unsigned char com) //写入命令
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 0; //选择写入命令
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = com;//由于4位的接线是接到P0口的高四位,所以传送高四位不用改
Delay(1);
LCD1602_E = 1; //写入时序
Delay(5);
LCD1602_E = 0;
Delay(1);
LCD1602_DATAPINS = com << 4; //发送低四位
Delay(1);
LCD1602_E = 1; //写入时序
Delay(5);
LCD1602_E = 0;
}
void LcdWriteData(unsigned char dat)//写入数据
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 1; //选择写入数据
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = dat;//由于4位的接线是接到P0口的高四位,所以传送高四位不用改
Delay(1);
LCD1602_E = 1; //写入时序
Delay(5);
LCD1602_E = 0;
LCD1602_DATAPINS = dat << 4; //写入低四位
Delay(1);
LCD1602_E = 1; //写入时序
Delay(5);
LCD1602_E = 0;
}
void KeyScan(void)
{
GPIO_KEY=0X0f;
Delay(10);//延时10ms进行消抖
GPIO_KEY=0X0f;//测试列
switch(GPIO_KEY)
{
case(0X07):KeyValue=0;break;
case(0X0b):KeyValue=4;break;
case(0X0d): KeyValue=8;break;
case(0X0e):KeyValue=12;break;
default:break;
}
GPIO_KEY=0Xf0;//测试行
switch(GPIO_KEY)
{
case(0X70):KeyValue=KeyValue+3;break;
case(0Xb0):KeyValue=KeyValue+2;break;
case(0Xd0): KeyValue=KeyValue+1;break;
case(0Xe0):KeyValue=KeyValue;break;
default:break;
}
}
我想用矩阵键盘输入1354这个数据,然后在LCD1602上显示,但显示的全是乱码
#include<reg51.h>
#define LCD1602_DATAPINS P0
#define GPIO_KEY P2
sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;
void LcdWriteCom(unsigned char com);//LCD控制
void LcdWriteData(unsigned char dat);//LCD数据
void KeyScan(void);
void Delay(unsigned short int c);
unsigned char KeyValue;//键盘键值
unsigned char i;
void main(void)
{
LcdWriteCom(0x32);//将8位总线转为4位总线
LcdWriteCom(0x28);//在四位线下的初始化
LcdWriteCom(0x0c);//开显示不显示光标
LcdWriteCom(0x06);//写一个指针加1
LcdWriteCom(0x01);//清屏
LcdWriteCom(0x80);//设置数据指针起点
while(1)
{
KeyValue = 16;
while(KeyValue>15)
{
KeyScan();
}
if(KeyValue < 10)
{
LcdWriteData('0' + KeyValue);
}
else
{
LcdWriteData('7' + KeyValue); //A的ASCII码的前10位是7,所以用7做基数
}
LcdWriteCom(0x15);
}
}
void Delay(unsigned int c) //误差 0us
{
unsigned char a,b;
for (; c>0; c--)
{
for(b=199; b>0; b--)
{
for(a=1; a>0; a--);
}
}
}
void LcdWriteCom(unsigned char com) //写入命令
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 0; //选择写入命令
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = com;//由于4位的接线是接到P0口的高四位,所以传送高四位不用改
Delay(1);
LCD1602_E = 1; //写入时序
Delay(5);
LCD1602_E = 0;
Delay(1);
LCD1602_DATAPINS = com << 4; //发送低四位
Delay(1);
LCD1602_E = 1; //写入时序
Delay(5);
LCD1602_E = 0;
}
void LcdWriteData(unsigned char dat)//写入数据
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 1; //选择写入数据
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = dat;//由于4位的接线是接到P0口的高四位,所以传送高四位不用改
Delay(1);
LCD1602_E = 1; //写入时序
Delay(5);
LCD1602_E = 0;
LCD1602_DATAPINS = dat << 4; //写入低四位
Delay(1);
LCD1602_E = 1; //写入时序
Delay(5);
LCD1602_E = 0;
}
void KeyScan(void)
{
GPIO_KEY=0X0f;
Delay(10);//延时10ms进行消抖
GPIO_KEY=0X0f;//测试列
switch(GPIO_KEY)
{
case(0X07):KeyValue=0;break;
case(0X0b):KeyValue=4;break;
case(0X0d): KeyValue=8;break;
case(0X0e):KeyValue=12;break;
default:break;
}
GPIO_KEY=0Xf0;//测试行
switch(GPIO_KEY)
{
case(0X70):KeyValue=KeyValue+3;break;
case(0Xb0):KeyValue=KeyValue+2;break;
case(0Xd0): KeyValue=KeyValue+1;break;
case(0Xe0):KeyValue=KeyValue;break;
default:break;
}
}