目录
简介
原理图及工作原理
程序实现
简介
????????矩阵键盘是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_temp
HC138(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返回19
while(P34==0);
}
if(P35==0)
{
Delay(10);
if(P35==0)
key_tp=0x0f;//S15返回15
while(P35==0);
}
if(P42==0)
{
Delay(10);
if(P42==0)
key_tp=0x0b;//S11返回11
while(P42==0);
}
if(P44==0)
{
Delay(10);
if(P44==0)
key_tp=0x07;//S7返回7
while(P44==0);
}
P3=0xff;
P31=0;
if(P34==0)
{
Delay(10);
if(P34==0)
key_tp=0x12;//S18返回18
while(P34==0);
}
if(P35==0)
{
Delay(10);
if(P35==0)
key_tp=0x0e;//S14返回14
while(P35==0);
}
if(P42==0)
{
Delay(10);
if(P42==0)
key_tp=0x0a;//S10返回10
while(P42==0);
}
if(P44==0)
{
Delay(10);
if(P44==0)
key_tp=0x06;//S6返回6
while(P44==0);
}
P3=0xff;
P32=0;
if(P34==0)
{
Delay(10);
if(P34==0)
key_tp=0x11;//S17返回17
while(P34==0);
}
if(P35==0)
{
Delay(10);
if(P35==0)
key_tp=0x0d;//S13返回13
while(P35==0);
}
if(P42==0)
{
Delay(10);
if(P42==0)
key_tp=0x09;//S9返回9
while(P42==0);
}
if(P44==0)
{
Delay(10);
if(P44==0)
key_tp=0x05;//s5返回5
while(P44==0);
}
P3=0xff;
P33=0;
if(P34==0)
{
Delay(10);
if(P34==0)
key_tp=0x10;//s16返回16
while(P34==0);
}
if(P35==0)
{
Delay(10);
if(P35==0)
key_tp=0x0c;//s12返回12
while(P35==0);
}
if(P42==0)
{
Delay(10);
if(P42==0)
key_tp=0x08;//s8返回8
while(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;
}
|