一、任务简述
在CT107D单片机上,使按键S4-S19组成4X4的矩阵键盘,在扫描按键的过程中,发现有按键触发信号后(不做去抖动处理),待按键松开后,在数码管的第一位显示相应的数字:从左至右,从上到下,依次显示0-F。
二、实现方法
数码管显示和573锁存器选择设置可以参考上几篇博客,在此就不再做过多讲解。重点讲解下怎么构成矩阵键盘:
第一行(R1):S7,S11,S15,S19;
第一行(R2):S6,S10,S14,S18;
第一行(R3):S5,S9,S13,S17;
第一行(R4):S4,S8,S12,S16;
第一列(C1):S7,S6,S5,S4;
第一列(C2):S11,S10,S9,S8;
第一列(C3):S15,S14,S13,S12;
第一列(C4):S19,S18,S17,S16;
即 P3引脚控制矩阵键盘。
sbit R1 = P3^0;
sbit R2 = P3^1;
sbit R3 = P3^2;
sbit R4 = P3^3;
sbit C4 = P3^4;
sbit C3 = P3^5;
sbit C2 = P3^6;
sbit C1 = P3^7;
如何判断是哪一个按键按下:令R1为低电平,其他行为高电平;先令C1为低电平,其他列为高电平,判断是否为S7按下,若不是则令C2为低电平,其他为高电平,判断是否为S6按下,若不是,则继续依次方法类推,直至判断出是哪一个按键按下。
三、参考代码
#include "reg52.h"
sbit R1 = P3^0;
sbit R2 = P3^1;
sbit R3 = P3^2;
sbit R4 = P3^3;
sbit C4 = P3^4;
sbit C3 = P3^5;
sbit C2 = P3^6;
sbit C1 = P3^7;
unsigned char code SEG[18] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};
void Select_HC573(unsigned char channel)
{
switch(channel)
{
case 4:
P2 = (P2 & 0x1f) | 0x80;
break;
case 5:
P2 = (P2 & 0x1f) | 0xa0;
break;
case 6:
P2 = (P2 & 0x1f) | 0xc0;
break;
case 7:
P2 = (P2 & 0x1f) | 0xe0;
break;
}
}
void dispaly(unsigned char val)
{
Select_HC573(6);
P0 = 0x01;
Select_HC573(7);
P0 = val;
}
unsigned char KeysVal;
void ScanKeysMulti()
{
R1 = 0;
R2 = R3 = R4 = 1;
C1 = C2 = C3 = C4 = 1;
if(C1 == 0)
{
while(C1 == 0);
KeysVal = 0;
dispaly(SEG[KeysVal]);
}
else if(C2 == 0)
{
while(C2 == 0);
KeysVal = 1;
dispaly(SEG[KeysVal]);
}
else if(C3 == 0)
{
while(C3 == 0);
KeysVal = 2;
dispaly(SEG[KeysVal]);
}
else if(C4 == 0)
{
while(C4 == 0);
KeysVal = 3;
dispaly(SEG[KeysVal]);
}
//2
R2 = 0;
R1 = R3 = R4 = 1;
C1 = C2 = C3 = C4 = 1;
if(C1 == 0)
{
while(C1 == 0);
KeysVal = 4;
dispaly(SEG[KeysVal]);
}
else if(C2 == 0)
{
while(C2 == 0);
KeysVal = 5;
dispaly(SEG[KeysVal]);
}
else if(C3 == 0)
{
while(C3 == 0);
KeysVal = 6;
dispaly(SEG[KeysVal]);
}
else if(C4 == 0)
{
while(C4 == 0);
KeysVal = 7;
dispaly(SEG[KeysVal]);
}
//3
R3 = 0;
R2 = R1 = R4 = 1;
C1 = C2 = C3 = C4 = 1;
if(C1 == 0)
{
while(C1 == 0);
KeysVal = 8;
dispaly(SEG[KeysVal]);
}
else if(C2 == 0)
{
while(C2 == 0);
KeysVal = 9;
dispaly(SEG[KeysVal]);
}
else if(C3 == 0)
{
while(C3 == 0);
KeysVal = 10;
dispaly(SEG[KeysVal]);
}
else if(C4 == 0)
{
while(C4 == 0);
KeysVal = 11;
dispaly(SEG[KeysVal]);
}
//4
R4 = 0;
R2 = R3 = R1 = 1;
C1 = C2 = C3 = C4 = 1;
if(C1 == 0)
{
while(C1 == 0);
KeysVal = 12;
dispaly(SEG[KeysVal]);
}
else if(C2 == 0)
{
while(C2 == 0);
KeysVal = 13;
dispaly(SEG[KeysVal]);
}
else if(C3 == 0)
{
while(C3 == 0);
KeysVal = 14;
dispaly(SEG[KeysVal]);
}
else if(C4 == 0)
{
while(C4 == 0);
KeysVal = 15;
dispaly(SEG[KeysVal]);
}
}
void main()
{
while(1)
{
ScanKeysMulti();
}
}
学习来源于:https://www.bilibili.com/video/BV1Bt41187hw?p=3