单片机C语言之扫描按键

K1~K16,按下Ki ,和二进制i对应的小灯亮起。

矩阵按键

P0 LED真值表         按下K1~K16
P0.7P0.6P0.5P0.4P0.3P0.2P0.1P0.0
暗(高电平 1)亮(低电平 0)
11111101
11111100
11111011
11111010
11111001
11111000
11110111
11110110
11110101
11110100
11110011
11110010
11110001
11110000
11101111

key.h

#ifndef _KEY_H_
#define _KEY_H_
typedef unsigned char uint8;
typedef unsigned int uint16;
typedef char int8;
typedef int int16;
sbit KeyIn4 = P2^7;
sbit keyIn3 = P2^6;
sbit KeyIn2 = P2^5;
sbit keyIn1 = P2^4;
sbit KeyOut1 = P2^3;
sbit keyOut2 = P2^2;
sbit KeyOut3 = P2^1;
sbit keyOut4 = P2^0;
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
 
#endif

key.c

#include<reg51.h>
#include "key.h"
void delay()
{
    uint16 i = 1000;
    while(i--);//roughly delay
}

main()
{ 
    P0 = 0xff;
    ENLED = 0;ADDR3=1;
    ADDR0 = 0; ADDR1 = 0; ADDR2 = 0;
    
    while(1)
    {
        KeyOut1 = 0;KeyOut2 = 1;KeyOut3 = 1;KeyOut4 = 1;
        if(!KeyIn1){
            delay();
            P0 = ~1;
        }
        if(!KeyIn2){
            delay();
            P0 = ~2;
        }
        if(!KeyIn3){
            delay();
            P0 = ~3;
        }
        if(!KeyIn4){
            delay();
            P0 = ~4;
        }
        while(!KeyIn1 || !KeyIn2 || !KeyIn3 || !KeyIn4);
        
        KeyOut1 = 1;KeyOut2 = 0;KeyOut3 = 1;KeyOut4 = 1;
        if(!KeyIn1){
            delay();
            P0 = ~5;
        }
        if(!KeyIn2){
            delay();
            P0 = ~6;
        }
        if(!KeyIn3){
            delay();
            P0 = ~7;
        }
        if(!KeyIn4){
            delay();
            P0 = ~8;
        }
        while(!KeyIn1 || !KeyIn2 || !KeyIn3 || !KeyIn4);
        
        KeyOut1 = 1;KeyOut2 = 1;KeyOut3 = 0;KeyOut4 = 1;
        if(!KeyIn1){
            delay();
            P0 = ~9;
        }
        if(!KeyIn2){
            delay();
            P0 = ~10;
        }
        if(!KeyIn3){
            delay();
            P0 = ~11;
        }
        if(!KeyIn4){
            delay();
            P0 = ~12;
        }
        while(!KeyIn1 || !KeyIn2 || !KeyIn3 || !KeyIn4);
        
        KeyOut1 = 1;KeyOut2 = 1;KeyOut3 = 1;KeyOut4 = 0;
        if(!KeyIn1){
            delay();
            P0 = ~13;
        }
        if(!KeyIn2){
            delay();
            P0 = ~14;
        }
        if(!KeyIn3){
            delay();
            P0 = ~15;
        }
        if(!KeyIn4){
            delay();
            P0 = ~16;
        }
        while(!KeyIn1 || !KeyIn2 || !KeyIn3 || !KeyIn4);
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值