问题:
1. 矩阵键盘是4*4的用作计算器键盘 有数字键有符号键 ,现在的问题是无论是先后只要有符号键按下之后数字按键就会无效但是符号键还是有效的,复位之后只按数字按键就都有有效。
2.程序下载到单片机后lcd会直接显示第一个数字键的值 也就是1。预想的是有输入才有显示。
以下是程序:
#include "reg52.h"
#include "lcd.h"
#define KeyBoard P1
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
u8 Disp[]=" input password ";
u8 KeyValue;
void KeyDown()//矩阵键盘按键判断
{
u8 a=0;
KeyBoard=0x0f;
if(KeyBoard!=0x0f)
{
Lcd1602_Delay1ms(10);
if(KeyBoard!=0x0f)
{
switch(KeyBoard)
{
case(0x07):KeyValue=0;break;
case(0x0b):KeyValue=1;break;
case(0x0d):KeyValue=2;break;
case(0x0e):KeyValue=3;break;
}
KeyBoard=0xf0;
if(KeyBoard!=0xf0)
{
Lcd1602_Delay1ms(10);
if(KeyBoard!=0xf0)
{
switch(KeyBoard)
{
case(0x70):KeyValue=KeyValue;break;
case(0xb0):KeyValue=KeyValue+4;break;
case(0xd0):KeyValue=KeyValue+8;break;
case(0xe0):KeyValue=KeyValue+12;break;
}
}
}
while((a<50)&&(KeyBoard!=0xf0))
{
Lcd1602_Delay1ms(10);
a++;
}
}
}
}
void KeyScan() //判断键盘输入的数值
{
u8 num,fuhao;
KeyDown();
switch(KeyValue)
{
case(0):num=1;break;
case(1):num=2;break;
case(2):num=3;break;
case(4):num=4;break;
case(5):num=5;break;
case(6):num=6;break;
case(8):num=7;break;
case(9):num=8;break;
case(10):num=9;break;
case(13):num=0;break;
case(3):fuhao=3;break;
case(7):fuhao=7;break;
case(11):fuhao=11;break;
case(15):fuhao=15;break;
case(14):fuhao=14;break;
}
LcdWriteCom(0x40+0x80);
if(fuhao==3)
{
LcdWriteData('+');
}
else if(fuhao==7)
{
LcdWriteData('-');
}
else if(fuhao==11)
{
LcdWriteData('*');
}
else if(fuhao==15)
{
LcdWriteData('/');
}
else if(fuhao==14)
{
LcdWriteData('=');
}
else
{
LcdWriteData(num+0x30);
}
}
void main(void) //主函数
{
u8 i;
LcdInit();
for(i=0;i<16;i++)
{
LcdWriteData(Disp[i]);
}
while(1)
{
KeyScan();
}
}
1. 矩阵键盘是4*4的用作计算器键盘 有数字键有符号键 ,现在的问题是无论是先后只要有符号键按下之后数字按键就会无效但是符号键还是有效的,复位之后只按数字按键就都有有效。
2.程序下载到单片机后lcd会直接显示第一个数字键的值 也就是1。预想的是有输入才有显示。
以下是程序:
#include "reg52.h"
#include "lcd.h"
#define KeyBoard P1
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
u8 Disp[]=" input password ";
u8 KeyValue;
void KeyDown()//矩阵键盘按键判断
{
u8 a=0;
KeyBoard=0x0f;
if(KeyBoard!=0x0f)
{
Lcd1602_Delay1ms(10);
if(KeyBoard!=0x0f)
{
switch(KeyBoard)
{
case(0x07):KeyValue=0;break;
case(0x0b):KeyValue=1;break;
case(0x0d):KeyValue=2;break;
case(0x0e):KeyValue=3;break;
}
KeyBoard=0xf0;
if(KeyBoard!=0xf0)
{
Lcd1602_Delay1ms(10);
if(KeyBoard!=0xf0)
{
switch(KeyBoard)
{
case(0x70):KeyValue=KeyValue;break;
case(0xb0):KeyValue=KeyValue+4;break;
case(0xd0):KeyValue=KeyValue+8;break;
case(0xe0):KeyValue=KeyValue+12;break;
}
}
}
while((a<50)&&(KeyBoard!=0xf0))
{
Lcd1602_Delay1ms(10);
a++;
}
}
}
}
void KeyScan() //判断键盘输入的数值
{
u8 num,fuhao;
KeyDown();
switch(KeyValue)
{
case(0):num=1;break;
case(1):num=2;break;
case(2):num=3;break;
case(4):num=4;break;
case(5):num=5;break;
case(6):num=6;break;
case(8):num=7;break;
case(9):num=8;break;
case(10):num=9;break;
case(13):num=0;break;
case(3):fuhao=3;break;
case(7):fuhao=7;break;
case(11):fuhao=11;break;
case(15):fuhao=15;break;
case(14):fuhao=14;break;
}
LcdWriteCom(0x40+0x80);
if(fuhao==3)
{
LcdWriteData('+');
}
else if(fuhao==7)
{
LcdWriteData('-');
}
else if(fuhao==11)
{
LcdWriteData('*');
}
else if(fuhao==15)
{
LcdWriteData('/');
}
else if(fuhao==14)
{
LcdWriteData('=');
}
else
{
LcdWriteData(num+0x30);
}
}
void main(void) //主函数
{
u8 i;
LcdInit();
for(i=0;i<16;i++)
{
LcdWriteData(Disp[i]);
}
while(1)
{
KeyScan();
}
}