OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10435|回复: 5

请大神们指教啊,51单片机用矩阵键盘连续输入数字显示在LCD1602上,如何显示???

[复制链接]

5

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2016-9-11
在线时间
22 小时
发表于 2016-11-10 22:05:07 | 显示全部楼层 |阅读模式
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次后 会出现乱码 建议你可以定位到具体的某一行某一列显示
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2016-11-11
在线时间
0 小时
发表于 2016-11-10 22:05:08 | 显示全部楼层
因为你的每次while(1)循环都重新写了一次命令LcdWriteCom(0x80 + 0x40);  这个就导致了每次都在一个地方显示  但是你去掉以后  显示32次后  会出现乱码  建议你可以定位到具体的某一行某一列显示
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165378
金钱
165378
注册时间
2010-12-1
在线时间
2111 小时
发表于 2016-11-10 22:58:40 | 显示全部楼层
帮顶
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2016-11-11 22:17:38 | 显示全部楼层
就就是轮到你动脑子的时候到了。这是算法问题。别人是一下子帮不到你的
回复

使用道具 举报

0

主题

11

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2016-11-11
在线时间
9 小时
发表于 2016-11-12 07:01:30 来自手机 | 显示全部楼层
用一个表示输入数字个数的变量来控制,例如变量为n;当n为0时,当按下数字1就在最右边某处显示1,
回复

使用道具 举报

0

主题

11

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2016-11-11
在线时间
9 小时
发表于 2016-11-12 07:03:04 来自手机 | 显示全部楼层
当n等于1,按下2时就在次右边显示2。每按下一次就n++
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-3-14 01:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表