找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1413|回复: 7
收起左侧

stc89c52单片机矩阵按键和LCD1206显示的程序调试问题

[复制链接]
ID:352989 发表于 2022-12-9 17:05 | 显示全部楼层 |阅读模式
void main()
{
        LCD_Init();                                                        //LCD初始化
        LCD_ShowString(1,1,"MatrixKey:");        //LCD显示字符串
        while(1)
        {
                KeyNum=MatrixKey();                                //获取矩阵键盘键码
                if(KeyNum)                                                //如果有按键按下
                {
                        LCD_ShowNum(2,1,KeyNum,2);        //LCD显示键码
                }
        }
}


在这里为什么要加IF语句,来判断有键按下?我把IF语句删除后,LCD1602确实没有按键显示。

回复

使用道具 举报

ID:883242 发表于 2022-12-9 17:45 | 显示全部楼层
你的问题取决于MatrixKey()的具体实现办法,因为你不贴,别人也不可能知道。
回复

使用道具 举报

ID:123289 发表于 2022-12-9 17:57 | 显示全部楼层
想想:不按如果处理呢?
回复

使用道具 举报

ID:352989 发表于 2022-12-9 18:00 | 显示全部楼层
Hephaestus 发表于 2022-12-9 17:45
你的问题取决于MatrixKey()的具体实现办法,因为你不贴,别人也不可能知道。

#include <REGX52.H>
#include "Delay.h"

/**
  * @brief  矩阵键盘读取按键键码
  * @param  无
  * @retval KeyNumber 按下按键的键码值
                        如果按键按下不放,程序会停留在此函数,松手的一瞬间,返回按键键码,没有按键按下时,返回0
  */
unsigned char MatrixKey()
{
        unsigned char KeyNumber=0;
       
        P1=0xFF;
        P1_3=0;
        if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=1;}
        if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=5;}
        if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=9;}
        if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=13;}
       
        P1=0xFF;
        P1_2=0;
        if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=2;}
        if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=6;}
        if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=10;}
        if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=14;}
       
        P1=0xFF;
        P1_1=0;
        if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=3;}
        if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=7;}
        if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=11;}
        if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=15;}
       
        P1=0xFF;
        P1_0=0;
        if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=4;}
        if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=8;}
        if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=12;}
        if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=16;}
       
        return KeyNumber;
}

看看。
回复

使用道具 举报

ID:213173 发表于 2022-12-9 19:07 | 显示全部楼层
没用键按下,MatrixKey()返回值为0,即为假。如果有按键按下MatrixKey()返回值不为0,即为真,执行 LCD_ShowNum(2,1,KeyNum,2)。
回复

使用道具 举报

ID:352989 发表于 2022-12-9 19:33 | 显示全部楼层
wulin 发表于 2022-12-9 19:07
没用键按下,MatrixKey()返回值为0,即为假。如果有按键按下MatrixKey()返回值不为0,即为真,执行 LCD_Sho ...

谢谢,2楼的解释。如果不判读MatrixKey()返回值,也就是不写if语句,直接写LCD_ShowNum(2,1,KeyNum,2)我认为它也能显示按键,但实际是不显示,这是为什么?
回复

使用道具 举报

ID:814525 发表于 2022-12-10 12:51 | 显示全部楼层
没有IF判断,函数 LCD_ShowNum(2,1,KeyNum,2)会极快的速度不断执行刷新屏幕,肯定会看不见。要么改为改为1秒或2秒才刷新一下屏幕试试
回复

使用道具 举报

ID:352989 发表于 2022-12-14 11:40 | 显示全部楼层
张天师 发表于 2022-12-10 12:51
没有IF判断,函数 LCD_ShowNum(2,1,KeyNum,2)会极快的速度不断执行刷新屏幕,肯定会看不见。要么改为改为1 ...

谢谢!明白了!
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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