此后由于代码量增加,需要进行模块化
模块化就是C语言的多文件编译,通过把一个或者几个功能函数写在其他c文件里,在main.c里面通过应用相应的h文件就可以直接调用功能函数,这样main.c文件不至于复杂冗长。如果没学过可以去B站找一下相关视频(推荐翁恺C语言),或者就地找相关文章,例如这位老哥写得比较完善http://t.csdn.cn/z3pV7。
矩阵键盘显示键码值
矩阵键盘为了减少I/O口采用的是将按键排列成矩阵形式,按逐行或者逐列扫描就能读出任意按键的按下(同一时间只能按下一个)。下面是矩阵按键的原理图:
matrixkey.h文件
#ifndef __MATRIXKEY_H__
#define __MATRIXKEY_H__
unsigned char MatrixKey();
#endif
delay.h文件
#ifndef __DELAY_H__
#define __DELAY_H__
void Delay(unsigned int xms);
#endif
delay.c文件
void Delay(unsigned int xms) //@11.0592MHz
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
xms--;
}
}
matrixkey.c文件(函数写一个就行)文章来源:https://www.toymoban.com/news/detail-571122.html
#include "delay.h"
#include <REGX52.H>
unsigned char MatrixKey()//按行扫描
{
unsigned char KeyNumber = 0;
P1 = 0xFF;
P1_7 = 0;
if(P1_3 == 0){Delay(20);while(P1_3 == 0);Delay(20);KeyNumber = 1;}
if(P1_2 == 0){Delay(20);while(P1_2 == 0);Delay(20);KeyNumber = 2;}
if(P1_1 == 0){Delay(20);while(P1_1 == 0);Delay(20);KeyNumber = 3;}
if(P1_0 == 0){Delay(20);while(P1_0 == 0);Delay(20);KeyNumber = 4;}
P1 = 0xFF;
P1_6 = 0;
if(P1_3 == 0){Delay(20);while(P1_3 == 0);Delay(20);KeyNumber = 5;}
if(P1_2 == 0){Delay(20);while(P1_2 == 0);Delay(20);KeyNumber = 6;}
if(P1_1 == 0){Delay(20);while(P1_1 == 0);Delay(20);KeyNumber = 7;}
if(P1_0 == 0){Delay(20);while(P1_0 == 0);Delay(20);KeyNumber = 8;}
P1 = 0xFF;
P1_5 = 0;
if(P1_3 == 0){Delay(20);while(P1_3 == 0);Delay(20);KeyNumber = 9;}
if(P1_2 == 0){Delay(20);while(P1_2 == 0);Delay(20);KeyNumber = 10;}
if(P1_1 == 0){Delay(20);while(P1_1 == 0);Delay(20);KeyNumber = 11;}
if(P1_0 == 0){Delay(20);while(P1_0 == 0);Delay(20);KeyNumber = 12;}
P1 = 0xFF;
P1_4 = 0;
if(P1_3 == 0){Delay(20);while(P1_3 == 0);Delay(20);KeyNumber = 13;}
if(P1_2 == 0){Delay(20);while(P1_2 == 0);Delay(20);KeyNumber = 14;}
if(P1_1 == 0){Delay(20);while(P1_1 == 0);Delay(20);KeyNumber = 15;}
if(P1_0 == 0){Delay(20);while(P1_0 == 0);Delay(20);KeyNumber = 16;}
return KeyNumber;
}
unsigned char MatrixKey()//按列扫描
{
unsigned char KeyNum = 0;
P1 = 0xFF;
P1_3 = 0;
if(P1_7==0)
{
Delay(20);while(P1_7==0);Delay(20);KeyNum = 1;
}
if(P1_6==0)
{
Delay(20);while(P1_6==0);Delay(20);KeyNum = 5;
}
if(P1_5==0)
{
Delay(20);while(P1_5==0);Delay(20);KeyNum = 9;
}
if(P1_4==0)
{
Delay(20);while(P1_4==0);Delay(20);KeyNum = 13;
}
P1 = 0xFF;
P1_2 = 0;
if(P1_7==0)
{
Delay(20);while(P1_7==0);Delay(20);KeyNum = 2;
}
if(P1_6==0)
{
Delay(20);while(P1_6==0);Delay(20);KeyNum = 6;
}
if(P1_5==0)
{
Delay(20);while(P1_5==0);Delay(20);KeyNum = 10;
}
if(P1_4==0)
{
Delay(20);while(P1_4==0);Delay(20);KeyNum = 14;
}
P1 = 0xFF;
P1_1 = 0;
if(P1_7==0)
{
Delay(20);while(P1_7==0);Delay(20);KeyNum = 3;
}
if(P1_6==0)
{
Delay(20);while(P1_6==0);Delay(20);KeyNum = 7;
}
if(P1_5==0)
{
Delay(20);while(P1_5==0);Delay(20);KeyNum = 11;
}
if(P1_4==0)
{
Delay(20);while(P1_4==0);Delay(20);KeyNum = 15;
}
P1 = 0xFF;
P1_0 = 0;
if(P1_7==0)
{
Delay(20);while(P1_7==0);Delay(20);KeyNum = 4;
}
if(P1_6==0)
{
Delay(20);while(P1_6==0);Delay(20);KeyNum = 8;
}
if(P1_5==0)
{
Delay(20);while(P1_5==0);Delay(20);KeyNum = 12;
}
if(P1_4==0)
{
Delay(20);while(P1_4==0);Delay(20);KeyNum = 16;
}
return KeyNum;
}
主函数:
main.c文章来源地址https://www.toymoban.com/news/detail-571122.html
#include <REGX52.H>
#include "matrixket.h"
#include "delay.h"
unsigned KeyNum;
void main()
{
while(1)
{
KeyNum = MatrixKey();
if(KeyNum)
{
//显示操作等等
}
}
}
到了这里,关于c51--矩阵键盘的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!