前言
学习资料参考
课程资料:
【【小蜜蜂笔记】蓝桥杯大赛-单片机设计与开发基础技能与进阶强化教程】https://www.bilibili.com/video/BV1Bt41187hw?p=7&vd_source=e2191f89c557f5ac44bb6c7aa3967c7c
数码管的基本控制可以参考以下笔记:
https://blog.csdn.net/zicheng_G/article/details/142304378?fromshare=blogdetail&sharetype=blogdetail&sharerId=142304378&sharerefer=PC&sharesource=zicheng_G&sharefrom=from_link
本节训练重点
- 矩阵键盘扫描
- 矩阵键盘的识别和基本处理:在扫描过程中,发现与按键触发信号后(不做去抖),待按键松开后,数码管的第一位显示相应的数字:从左至右,从上到下,一次显示0~F。
矩阵键盘
原理图
对矩阵键盘进行控制,要先将J5的跳帽接到1~2引脚。
编程思路
/*头文件声明区域*/
#include <REGX52.H>
/*变量声明区域*/
sfr P4 = 0xc0;//用于P4口的调用
sbit HC138_A0_A = P2^5;
sbit HC138_A1_B = P2^6;
sbit HC138_A2_C = P2^7;
sbit L1 = P4^4;//用与矩阵键盘列的调用
sbit L2 = P4^2;
sbit L3 = P3^5;
sbit L4 = P3^4;
sbit C1 = P3^0;//用与矩阵键盘行的调用
sbit C2 = P3^1;
sbit C3 = P3^2;
sbit C4 = P3^3;
unsigned char code lib_Bit_Number[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
/*138译码器Y口选中情况*/
void HC138_NumberY(unsigned char x)
{
switch(x)
{
case 6:
{
HC138_A0_A=0;
HC138_A1_B=1;
HC138_A2_C=1;
break;
}
case 7:
{
HC138_A0_A=1;
HC138_A1_B=1;
HC138_A2_C=1;
break;
}
}
}
/*单个数码管的静态显示*/
void SMG(unsigned char Bit)
{
HC138_NumberY(6); //数码管位选
P0=0x01;
HC138_NumberY(7); //数码管段选
P0=lib_Bit_Number[Bit];
}
/*按键检测*/
void MatK_Scan()
{
/*扫描第一列*/
L1=0;
L2=L3=L4=1;
if(C1==0)//判断S7是否按下
{
while(C1==0);
SMG(0);//数码管显示0
}
if(C2==0)//判断S6是否按下
{
while(C2==0);
SMG(4);//数码管显示4
}
if(C3==0)//判断S5是否按下
{
while(C3==0);
SMG(8);//数码管显示8
}
if(C4==0)//判断S4是否按下
{
while(C4==0);
SMG(12);//数码管显示c
}
/*扫描第二列*/
L2=0;
L1=L3=L4=1;
if(C1==0)//判断S11是否按下
{
while(C1==0);
SMG(1);//数码管显示1
}
if(C2==0)//判断S10是否按下
{
while(C2==0);
SMG(5);//数码管显示5
}
if(C3==0)//判断S9是否按下
{
while(C3==0);
SMG(9);//数码管显示9
}
if(C4==0)//判断S8是否按下
{
while(C4==0);
SMG(13);//数码管显示d
}
/*扫描第三列*/
L3=0;
L1=L2=L4=1;
if(C1==0)//判断S15是否按下
{
while(C1==0);
SMG(2);//数码管显示2
}
if(C2==0)//判断S14是否按下
{
while(C2==0);
SMG(6);//数码管显示6
}
if(C3==0)//判断S13是否按下
{
while(C3==0);
SMG(10);//数码管显示a
}
if(C4==0)//判断S12是否按下
{
while(C4==0);
SMG(14);//数码管显示e
}
/*扫描第四列*/
L4=0;
L1=L2=L3=1;
if(C1==0)//判断S19是否按下
{
while(C1==0);
SMG(3);//数码管显示3
}
if(C2==0)//判断S18是否按下
{
while(C2==0);
SMG(7);//数码管显示7
}
if(C3==0)//判断S17是否按下
{
while(C3==0);
SMG(11);//数码管显示b
}
if(C4==0)//判断S16是否按下
{
while(C4==0);
SMG(15);//数码管显示f
}
}
/*主函数*/
void main()
{
while(1)
{
MatK_Scan();
}
}