初级会员

- 积分
- 142
- 金钱
- 142
- 注册时间
- 2016-9-11
- 在线时间
- 22 小时
|
1金钱
最近想用51单片机上的矩阵键盘做个简单的计算器,输入的数字或符号显示在LCD1602上。但是我想不到用什么办法可以连续输入数字显示在LCD1602上,请各位大神指教指教啊!!!
这是我的主函数代码:
#include <reg51.h>
#include <stdio.h>
#include "lcd.h"
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define CHECK_BUSY
//--定义使用的IO口--//
#define GPIO_KEY P1
//--定义全局变量--//
//unsigned char PuZh[17]="The key value is:";
unsigned char KeyValue;
unsigned char LED;
//用来存放读取到的键值
//--声明全局函数--//
void KeyScan(void);
unsigned char KeyPro(void);
void Delay10ms(unsigned int c); //误差 0us
void KeyScan(void)
{
char a = 0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)//读取按键是否按下
{
Delay10ms(20);//延时20ms进行消抖
if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
{
//测试列
GPIO_KEY=0XF0;
switch(GPIO_KEY)
{
case(0Xe0): KeyValue=1;break;
case(0Xd0): KeyValue=2;break;
case(0Xb0): KeyValue=3;break;
case(0X70): KeyValue=4;break;
}
//测试行
GPIO_KEY=0X0F;
switch(GPIO_KEY)
{
case(0X0e): KeyValue=KeyValue;break;
case(0X0d): KeyValue=KeyValue+4;break;
case(0X0b): KeyValue=KeyValue+8;break;
case(0X07): KeyValue=KeyValue+12;break;
}
while((a<50) && (GPIO_KEY!=0xf0)) //检测按键松手检测
{
Delay10ms(1);
a++;
}
}
}
}
unsigned char KeyPro(void)
{
KeyScan();
switch(KeyValue)
{
case 1:return '1';break;//按下相应的键显示相对应的码值
case 2:return '2';break;
case 3:return '3';break;
case 4:return '+';break;
case 5:return '4';break;
case 6:return '5';break;
case 7:return '6';break;
case 8:return '-';break;
case 9:return '7';break;
case 10:return '8';break;
case 11:return '9';break;
case 12:return 'x';break;
case 13:return '0';break;
case 14:return '.';break;
case 15:return '=';break;
case 16:return '/';break;
default:return 0xff;break;
}
}
main()
{
unsigned char num;
unsigned char s;
unsigned int i, j;
LcdInit();
while(1)
{
Delay10ms(10);
GPIO_KEY = 0x0f;
num = KeyPro();
if(GPIO_KEY != 0x0f)
{
LcdWriteCom(0x80 + 0x40);
LcdWriteData(num);
}
}
}
现在的效果是只能在原地显示数字,如何连续的显示呢?
|
最佳答案
查看完整内容[请看2#楼]
因为你的每次while(1)循环都重新写了一次命令LcdWriteCom(0x80 + 0x40); 这个就导致了每次都在一个地方显示 但是你去掉以后 显示32次后 会出现乱码 建议你可以定位到具体的某一行某一列显示
|