IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 蓝桥杯CT107D:关于矩阵键盘工作原理及其应用 -> 正文阅读

[嵌入式]蓝桥杯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_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;
}

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-01-29 23:14:49  更:2022-01-29 23:15:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 11:37:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码