8个IO口检测64个按键,按键自锁控制方式

Posted perseverance52

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了8个IO口检测64个按键,按键自锁控制方式相关的知识,希望对你有一定的参考价值。

8个IO口检测64个按键,按键自锁控制方式


相关篇《8个IO口检测64个按键,数码管显示(Proteus仿真)

8个IO口检测64个按键,算法实现和心法要点讲解


本篇带来的控制模式与前面不同的是,采用自锁按键来控制显示内容的。

实例代码

/********************点动自锁版*************/
include "reg51.h"
#include "intrins.h"
#define u8 unsigned char
sbit P36 = P3 ^ 6;
sbit P37 = P3 ^ 7;
sbit STCP = P3 ^ 0;//定义74HC595移位寄存器
sbit SHCP = P3 ^ 2;
sbit DS = P3 ^ 1;

u8 code table[16] = {                //共阴数码管段码16进制
    0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};

void delay() {
    u8 a,b;
    for(b=19; b>0; b--)
        for(a=130; a>0; a--);
}

void txd595(u8 d) {
    u8 i;
    for (i = 0; i < 8; i++) {
        DS = d & 0x80;
        SHCP = 0;
        d <<= 1;
        SHCP = 1;
    }
    STCP=0;
    _nop_();
    STCP=1;
}

void display(u8 d) {
    P37 = 0;
    txd595(table[d%10]);
    delay();
    P37 = 1;
    _nop_();
    P36 = 0;
    txd595(table[d/10]);
    delay();
    P36 = 1;
}

u8 b0(u8 dat) {                //取一个字节中有多少个二进制0 返回0~8
    u8 i, j = 0;
    for (i = 0; i < 8; i++) {
        if (!(dat & (1 << i))) {
            j++;
        }
    }
    return j;
}

u8 key_scan() {                //无按键返回0 有按键返回1~64 (禁止多个按键同时按下,出错返回99)
    u8 i, j, k, l, m;
    P0 = 0xFF;
    _nop_();
    k = P0;
    if (k != 0xFF) {
        if (b0(k) != 1) return 99;
        for (i = 0; i < 8; i++) {//先扫描判断P0口自身有没有被触发拉低。
            if (!(k & (1 << i))) {//如果有触发
                return 57 + i;//返回57+i
            }
        }
    }

    for (i = 0; i < 8; i++) {
        j = ~(1 << i);
        P0 = j;
        _nop_();
        k= P0;
        if (k != j) {
            if (k & ~j || b0(k) != 2) return 99;
            m = 0;
            for (l = 0; l < 8; l++) {
                if (i == l) continue;
                m++;
                if (!(k & (1 << l))) {
                    return i * 7 + m;//返回扫描行i乘以每行的数量7,m代表是i行的第m个数
                }
            }
        }

    }
    return 0;
}

void main() {
    while (1) {
        display(key_scan());
    }
}

以上是关于8个IO口检测64个按键,按键自锁控制方式的主要内容,如果未能解决你的问题,请参考以下文章

8个IO口检测64个按键,算法实现和心法要点讲解

51单片机8个IO口检测64个按键,数码管显示

非自锁物理按键实现自锁功能控制的方法总结

51单片机 3个IO口 + TM1638+24个独立按键扫描+驱动8位共阳数码管显示+Proteus仿真

Arduino UNO 利用3个IO口 + TM1638+驱动8位数码管显示+24个独立按键

按键控制流水灯速度不足是啥