1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 蓝桥杯CT107D:关于矩阵键盘工作原理及其应用

蓝桥杯CT107D:关于矩阵键盘工作原理及其应用

时间:2023-02-07 22:39:46

相关推荐

蓝桥杯CT107D:关于矩阵键盘工作原理及其应用

目录

简介

原理图及工作原理

程序实现

简介

矩阵键盘是CT107D上左下角由16个按键组成的、排列顺序类似矩阵的按键组。

原理图及工作原理

工作原理:

在矩阵键盘中,在每条水平线和垂直线交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如 P0 口)就可以构成 4×4=16个按键,比直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成 20 键的键盘,而直接用端口线则只能多出一键(9 键)。由此可见,在需要的键数比较多时,采用矩阵键盘是合理的。

矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,列线通过电阻接正电源,并将行线所接的单片机的 I/O 口作为输出端,而列线所接的 I/O 口则作为输入端。这样,当按键没有按下时,所有的输入端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。矩阵键盘中按键的识别有行扫描和线翻转两种方法,其中行扫描法是一种最常用的按键识别方法,过程如下:

(1)逐行输出 0,检查列线是否非全高;

(2)如果某行输出 0 时,查到列线非全高,则该行有按键按下;

(3)根据输出 0 的行线和读入 0 的列线,即可判断按下按键的位置。

注意:其中 J5 用于键盘选择1、 2 连接时为矩阵按键, 2、 3 连接时 S4~S7 为独立按键。

程序实现

按哪个键就用数码管显示其键号,例如按S19,就显示在数码管上19

上代码

主函数

#include "STC15F2K60S2.h"#include "Delay.h"#include "Close.h"#include "HC138.h"#include "Timer0.h"#include "intrins.h"#incldue "Read_keyborad.h"code unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0x7f};unsigned char dspcom=0;unsigned char dspbuf[8]={10,10,10,10,10,10,0,0};unsigned char key_temp;unsigned char num=0;void main(){Close_Init();HC138(4);P0=0x00;P2=0x1f;//138译码器清零while(1){key_temp=read_keyborad();//键盘的返回值给key_tempHC138(4);//Y4打开P0=~(key_temp);//LED亮起P2=0x1f;//138译码器清零dspbuf[6]=key_temp/10;//取出十位dspbuf[7]=key_temp%10;//取出个位HC138(7);//消影——>消除刷新叠影,Y7打开P0=0xff;HC138(6);//Y6打开,位选P0=0x80;//选择第一个数码管HC138(7);//Y7打开P0=tab[dspbuf[7]];//输出个位P2&=0x1f;//138译码器清零Delay(2);HC138(7);//消影——>消除刷新叠影,Y7打开P0=0xff;P2&=0x1f;//138译码器清零HC138(6);//Y6打开,位选P0=0x40;//选择第二个数码管P2&=0x1f;//138译码器清零HC138(7);//Y7打开P0=tab[dspbuf[6]];//输出十位P2&=0x1f;//138译码器清零Delay(2);}}

返回键位值

#include "STC15F2K60S2.h"#include "intrins.h"#include "Delay.h"unsigned char read_keyborad(){unsigned char key_tp;//记录返回值P3=0xff;P30=0;if(P34==0){Delay(10);if(P34==0)key_tp=0x13;//S19返回19while(P34==0);}if(P35==0){Delay(10);if(P35==0)key_tp=0x0f;//S15返回15while(P35==0);}if(P42==0){Delay(10);if(P42==0)key_tp=0x0b;//S11返回11while(P42==0);}if(P44==0){Delay(10);if(P44==0)key_tp=0x07;//S7返回7while(P44==0);}P3=0xff;P31=0;if(P34==0){Delay(10);if(P34==0)key_tp=0x12;//S18返回18while(P34==0);}if(P35==0){Delay(10);if(P35==0)key_tp=0x0e;//S14返回14while(P35==0);}if(P42==0){Delay(10);if(P42==0)key_tp=0x0a;//S10返回10while(P42==0);}if(P44==0){Delay(10);if(P44==0)key_tp=0x06;//S6返回6while(P44==0);}P3=0xff;P32=0;if(P34==0){Delay(10);if(P34==0)key_tp=0x11;//S17返回17while(P34==0);}if(P35==0){Delay(10);if(P35==0)key_tp=0x0d;//S13返回13while(P35==0);}if(P42==0){Delay(10);if(P42==0)key_tp=0x09;//S9返回9while(P42==0);}if(P44==0){Delay(10);if(P44==0)key_tp=0x05;//s5返回5while(P44==0);}P3=0xff;P33=0;if(P34==0){Delay(10);if(P34==0)key_tp=0x10;//s16返回16while(P34==0);}if(P35==0){Delay(10);if(P35==0)key_tp=0x0c;//s12返回12while(P35==0);}if(P42==0){Delay(10);if(P42==0)key_tp=0x08;//s8返回8while(P42==0);}if(P44==0){Delay(10);if(P44==0)key_tp=0x04;while(P44==0);}return key_tp;}

延时函数

#include "STC15F2K60S2.H"//Delay延时函数#include "intrins.h"void Delay(unsigned int num){unsigned int i;while(num--){for(i=0;i<628;i++);}}

选择138译码器的函数

#include "STC15F2K60S2.h"//选择138译码器的函数#include "intrins.h"void HC138(unsigned char n){switch(n){case 4:P2=((P2&0x1f)|0x8f);break;case 5:P2=((P2&0x1f)|0xaf);break;case 6:P2=((P2&0x1f)|0xcf);break;case 7:P2=((P2&0x1f)|0xef);break;}}

关闭蜂鸣器、继电器的函数,这个可以直接写写不用模块化

#include "STC15F2K60S2.h"//关蜂鸣器、继电器#include "intrins.h"#include "HC138.h"void Close_Init(){HC138(5);P0=0xaf;P2=0x1f;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。