小白跟做江科大51单片机之矩阵键盘

1.看电路板的原理图

2.确定如何读取数据

首先把P1口全置为1,然后如果想读取一列,就把哪个口设置为0,之后再检测P1_7到P1_4这几个口的状态,因为默认按键状态为1,所以按键按下为0。

可以按行扫描也可以按列扫描,但因为P15口联系到了蜂鸣器,所以按列扫描。

此单片机是弱上拉模式,所以两个端口1个口1一个口0,正常工作。

3.编写代码

把之前的延时代码.c和延时代码.h以及LCD1602.c和LCD1602.h复制到本项目中来;随后编写读取按键的代码keyboard.c如下所示:

#include <REGX52.H>
#include "Delay.h"
unsigned char keyboard()
{
    unsigned char keyInput=0;
    
    P1=0xFF;
    P1_3=0;
    if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);keyInput=1;}
    if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);keyInput=5;}
    if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);keyInput=9;}
    if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);keyInput=13;}
    
    P1=0xFF;
    P1_2=0;
    if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);keyInput=2;}
    if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);keyInput=6;}
    if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);keyInput=10;}
    if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);keyInput=14;}
    
    P1=0xFF;
    P1_1=0;
    if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);keyInput=3;}
    if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);keyInput=7;}
    if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);keyInput=11;}
    if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);keyInput=15;}
    
    P1=0xFF;
    P1_0=0;
    if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);keyInput=4;}
    if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);keyInput=8;}
    if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);keyInput=12;}
    if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);keyInput=16;}
    
    return keyInput;
}

keyboard.h如下所示:

#ifndef __KEYBOARD_H__
#define __KEYBOARD_H__
 
unsigned char keyboard();
#endif

main.c如下所示:

#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "keyboard.h"
void main()
{
    unsigned char keynum=0;
    LCD_Init();
    LCD_ShowString(1,3,"Hello!");
    while(1)
    {
        keynum=keyboard();
            if(keynum)   //这里是为了判断是由有按键按下,不添加不会显示数值
        {
            LCD_ShowNum(2,3,keynum,2);
        }
    }
}

4.结果实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值