8个IO口检测64个按键,按键自锁控制方式
Posted perseverance52
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了8个IO口检测64个按键,按键自锁控制方式相关的知识,希望对你有一定的参考价值。
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个按键,按键自锁控制方式的主要内容,如果未能解决你的问题,请参考以下文章
51单片机 3个IO口 + TM1638+24个独立按键扫描+驱动8位共阳数码管显示+Proteus仿真