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 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 基于STC15W4K32S4系列单片机的矩阵键盘扫描 -> 正文阅读

[嵌入式]基于STC15W4K32S4系列单片机的矩阵键盘扫描

前言
·主要介绍矩阵按键原理以及扫描方式和编写代码的思路
矩阵按键的扫描原理
矩阵按键的扫描原理主要由两种逐行扫描与行列扫描
逐行扫描:可以通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到数据不全为1时,说明有按键按下,然后通过接收到的数据是哪一位为0来进行判断是哪一个按键按下。
行列扫描:可以通过高四位全部输出低电平,低四位输出高电平。当接收到的数据,低四位就会有一位被拉低,不会全是高电平,说明有按键按下,通过接收的数据值,判断是哪一列有按键按下,然后再反过来,高四位输出输出高电平,低四位输出低电平,然后根据接收到的高四位的值进行判断是哪一行有按键按下,这样就能够确定是哪一个按键按下了。
程序效果通过八段数码管来验证
矩阵按键的原理图如下所示:在这里插入图片描述
单片机复位电路与晶振电路如下图所示:
在这里插入图片描述
单片机芯片图片如下所示:
在这里插入图片描述
八段数码管模块如下图所示:点亮最右边的一位数码管 在这里插入图片描述
程序代码主要用到扫描原理是方法二:行列扫描。
程序代码如下

/*矩阵按键连接到单片机的P3口,数码管段选连接到单片机的P0口,第一位数码管位选端连接到P1^0口*/
/*实验现象数码显示0——F十六进制数,按下第十六个按键熄灭数码管*/
#include <stc15.h>   //定义头文件

typedef unsigned int uint;   //定义无符号int数据类型,16位
typedef unsigned char uchar;   //定义无符号char数据类型,8位

#defien key P3    //定义矩阵按键端口
#define smg_duan P0    //定义数码管段选端口

sbit smg_wei P1^0;   //定义数码管位选端口

uchar code smg_duanma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e, 0x79,0x71,0x00};
//共阴极数码管的0——F段码,0x00为熄灭数码管
uchar num=0;    //存放矩阵按键按下的数据变量

void delay(uint i)   //软件延时函数
{
	while(i--);
}

void Mode_IO()    //设置STC15单片机端口IO模式,准双向IO模式
{
	P0M0=0;
	P0M1=0;
	P1M0=0;
	P1M1=0;
	P2M0=0;
	P2M1=0;
	P3M0=0;
	P3M1=0;
}

void KeyDis()   //矩阵按键处理函数程序
{
	uchar temp0,temp1,temp2,a;    //temp0存放temp1和temp2相加的结果,temp0存放确定那个按键的值,temp1存放列扫描后的值,temp2存放行扫描的值
	key=0x0f;   //列扫描赋值
	if(key!=0x0f)   //判断列是否有按键按下,按下则key不等于0x0f
	{
		delay(1000);   //消抖
		if(key!=0x0f)   //再次判断
		{
			temp1=key;    //将列扫描后的值存到temp1
		}
		key=0xf0;  //行扫描赋值
		if(key!=0xf0)   //判断行是否有按键按下,按下则key不等于0xf0
		{
			temp2=key;   //将行扫描后的值存到temp2
		}
		temp0=temp1+tep2;    //将两个结果相加得到的结果赋给temp0,确定那个按键按下
		switch(temp0)   //对相应的按键值进行赋值
		{
			case(0x77): num=1;break;   //第一行
			case(0x7b): num=2;break;
			case(0x7d): num=3;break;
			case(0x7e): num=4;break;
			case(0xb7): num=5;break;   //第二行
			case(0xbb): num=6;break;
			case(0xbd): num=7;break;
			case(0xbe): num=8;break;
			case(0xd7): num=9;break;  //第三行
			case(0xdb): num=10;break;
			case(0xdd): num=11;break;
			case(0xde): num=12;break;
			case(0xe7): num=13;break;  //第四行
			case(0xeb): num=14;break;
			case(0xed): num=15;break;
			case(0xee): num=16;break;
		}
		while((a<50)&&(key!=0xf0))    //判断按键是否松开
		{
			delay(1000);
			a++;
		}
	}
}

void main()    //主程序
{
	Mode_IO();   //调用IO模式子程序
	smg_wei=0;   //拉低第一位数码管
	while(1)   //主循环
	{
		KeyDis();    //调用按键处理子程序
		smg_duan=smg_duanma[num];    //发送数码管段码进行显示
		delay(100);
		smg_daun=0x00;    //消隐
	}
}

程序效果图如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-10-06 12:23:33  更:2021-10-06 12:24:56 
 
开发: 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 4:50:09-

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