2.7 【基础 07】矩阵键盘的基本操作 新建工程,以 I/O 模式编写代码,在 CT107D 单片机综合训练平台上,实现以下功能:
1、将 CT107D 上 J5 处跳帽接到 1~2 引脚,使 S4 到 S19 成为 4X4 的矩阵键盘。
2、系统上电后,关闭蜂鸣器,关闭继电器,关闭 8 个 LED 灯。
3、循环扫描矩阵键盘状态,发现有按键按下,等待其松开后,在数码管的最左边 1 位 显示相应的数字。从左至右,从上到下,依次显示“0”到“F”。即按下 S7,显示“0”, 按下 S11 显示“1”,按下 S15 显示“2”,按下 S6 显示“4”...依次类推。
【训练要点】: 矩阵键盘的扫描原理与程序设计思路,矩阵键盘的键码识别与基本处理。 【参考资源】: B 站视频教程【基础技能 07】矩阵键盘的扫描原理与基本应用 【考点提醒】: 第 11 届和第 12 届的省赛出现了矩阵键盘的考点,但不是考查 4X4 的矩阵 键盘,而是 2X2 的矩阵键盘。不要背代码,要理解工作原理和本质含义。
限于个人水平,难于做到尽善尽美,且本专栏主要起练习笔记作用。如有前辈发现代码错误或可以优化的地方,还请不吝赐教,学生感激不尽。
#include<STC15F2K60S2.h>
unsigned char code SMG_duanma[18]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};
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=P4^2;
sbit C1=P4^4;
void SelectHC573Init(unsigned char num1,num2)
{
P2 = (P2&0x1f)|0x00;
P0 = num2;
switch(num1)
{
case 0: P2 = (P2&0x1f)|0x00; break;//³õʼ»¯
case 4: P2 = (P2&0x1f)|0x80; break;//LED
case 5: P2 = (P2&0x1f)|0xA0; break;//·äÃùÆ÷¡¢¼ÌµçÆ÷
case 6: P2 = (P2&0x1f)|0xC0; break;//λѡ
case 7: P2 = (P2&0x1f)|0xE0; break;//¶ÎÑ¡
}
P2 = (P2&0x1f)|0x00;
}
void Delay(unsigned int t)
{
while(t--);
}
void DlsplaySMG(unsigned char dat)
{
SelectHC573Init(6,0x01);
SelectHC573Init(7,SMG_duanma[dat]);
}
unsigned char keyflag=0;
void ScanKeys()
{
R1=0;
R2=R3=R4=1;
if(C1==0)
{
Delay(500);
if(C1==0)
{
keyflag=0;
DlsplaySMG(keyflag);
while(C1==0);
}
}
if(C2==0)
{
Delay(500);
if(C2==0)
{
keyflag=1;
DlsplaySMG(keyflag);
while(C2==0);
}
}
if(C3==0)
{
Delay(500);
if(C3==0)
{
keyflag=2;
DlsplaySMG(keyflag);
while(C3==0);
}
}
if(C4==0)
{
Delay(500);
if(C4==0)
{
keyflag=3;
DlsplaySMG(keyflag);
while(C4==0);
}
}
R2=0;
R1=R3=R4=1;
if(C1==0)
{
Delay(500);
if(C1==0)
{
keyflag=4;
DlsplaySMG(keyflag);
while(C1==0);
}
}
if(C2==0)
{
Delay(500);
if(C2==0)
{
keyflag=5;
DlsplaySMG(keyflag);
while(C2==0);
}
}
if(C3==0)
{
Delay(500);
if(C3==0)
{
keyflag=6;
DlsplaySMG(keyflag);
while(C3==0);
}
}
if(C4==0)
{
Delay(500);
if(C4==0)
{
keyflag=7;
DlsplaySMG(keyflag);
while(C4==0);
}
}
R3=0;
R2=R1=R4=1;
if(C1==0)
{
Delay(500);
if(C1==0)
{
keyflag=8;
DlsplaySMG(keyflag);
while(C1==0);
}
}
if(C2==0)
{
Delay(500);
if(C2==0)
{
keyflag=9;
DlsplaySMG(keyflag);
while(C2==0);
}
}
if(C3==0)
{
Delay(500);
if(C3==0)
{
keyflag=10;
DlsplaySMG(keyflag);
while(C3==0);
}
}
if(C4==0)
{
Delay(500);
if(C4==0)
{
keyflag=11;
DlsplaySMG(keyflag);
while(C4==0);
}
}
R4=0;
R2=R3=R1=1;
if(C1==0)
{
Delay(500);
if(C1==0)
{
keyflag=12;
DlsplaySMG(keyflag);
while(C1==0);
}
}
if(C2==0)
{
Delay(500);
if(C2==0)
{
keyflag=13;
DlsplaySMG(keyflag);
while(C2==0);
}
}
if(C3==0)
{
Delay(500);
if(C3==0)
{
keyflag=14;
DlsplaySMG(keyflag);
while(C3==0);
}
}
if(C4==0)
{
Delay(500);
if(C4==0)
{
keyflag=15;
DlsplaySMG(keyflag);
while(C4==0);
}
}
}
void main()
{
while(1)
{
ScanKeys();
}
}