历史上的今天
今天是:2024年11月03日(星期日)
2021年11月03日 | 4*4矩阵 ---- 学习笔记
2021-11-03 来源:eefocus
一、矩阵按键的由来
按键矩阵是由一个个独立按键连接在一起,每一行引出一个管脚,每一列也引出。

二、矩阵按键的扫描原理
逐行扫描:通过高四位轮流输出低电平来对矩阵键盘逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,通过接收到的数据是哪一位为0来判断是那一个按键被按下。
行列扫描:我们可以通过高四位全部输出低电平,低四位输出高电平。当接收到的数据,低四位不全位高电平时,说明有按键按下,通过接收到的数值,判断是哪一列有按键按下,然后在反过来,高四位输出高电平,低四位输出低电平,然后根据接收到的高四位的值判断是那一行有按键按下,这样能够确定是哪一个按键按下。
三、矩阵按键变成独立按键
四、代码
#include #include typedef unsigned char u8; // 预处理数据类型 无符号 typedef unsigned int u16; // 预处理数据类型 #define GPIO_GIO P0 // 宏定义 按键断选 #define GPIO_KEY P1 // 按键接口 /*// 138译码器管脚定义 sbit LSA = P2^2; sbit LSB = P2^3; sbit LSC = P2^4; */ u8 KeyValue; // 全局变量 存储读到的键值 // 延迟函数 void delay(u16 i){ while(i--); } u8 code smgduan[16]={0X3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴 /*静态数码管P0口,矩阵P1口*/ void KeyDown(){ char a =0 ; // -128到128 初始化a GPIO_KEY = 0x0f; // 对并行串口的定义,高四位为低电平 if(GPIO_KEY != 0x0f){ // 判断按键是否按下 delay(1000); // 按键消抖 if(GPIO_KEY != 0x0f){ // 判断列 switch(GPIO_KEY){ case(0x07):KeyValue =0;break; // 0000 0111 case(0x0b):KeyValue =1;break; // 0000 1011 case(0x0d):KeyValue =2;break; // 0000 1101 case(0x0e):KeyValue =3;break; // 0000 1110 } GPIO_KEY=0xf0; //判断行 switch(GPIO_KEY){ case(0x70):KeyValue =KeyValue;break; // case(0xb0):KeyValue =KeyValue+4;break; // case(0xd0):KeyValue =KeyValue+8;break; // case(0xe0):KeyValue =KeyValue+12;break; // } while((a<50)&&(GPIO_KEY!=0xf0)) // 强制退出while循环 GPIO_KEY { delay(1000); // 延迟10毫秒 a++; } } } } // 数组 /********************************** 数码管显示真值表 共阳 0 1 2 3 4 5 0xc0 0xf9 0xa4 0xb0 0x99 0x92 6 7 8 9 a b 0x82 0xf8 0x80 0x90 0x88 0x83 c d e f 0xa7 0xa1 0x86 0x8e ************************************* 数码管显示数字的真值表 */ /*void DigDisplay(){ u8 i; // for(i=0;i<8;i++){ switch(i){ case(0): LSA = 0;LSB=0;LSC=0;break; case(1): LSA = 1;LSB=0;LSC=0;break; case(2): LSA = 0;LSB=1;LSC=0;break; case(3): LSA = 1;LSB=1;LSC=0;break; case(4): LSA = 0;LSB=0;LSC=1;break; case(5): LSA = 1;LSB=0;LSC=1;break; case(6): LSA = 0;LSB=1;LSC=1;break; case(7): LSA = 1;LSB=1;LSC=1;break; } P0 = smgduan[i]; delay(100); //P0= 0X00; } } */ void main(){ P0=~smgduan[0]; while(1){ KeyDown(); GPIO_GIO =smgduan[KeyValue]; } } 显示效果:按矩阵按键s1~s16分别显示数字1~9,字母a~f
史海拾趣
|
关于接地:数字地、模拟地、信号地、交流地、直流地、屏蔽地、浮地,特别经典哦 除了正确进行接地设计、安装,还要正确进行各种不同信号的接地处理。控制系统中,大致有以下几种地线: (1)数字地:也叫逻辑地,是各种开关量(数字量)信号的零电位。 (2)模拟地:是各种模拟量信号的零电位。 & ...… 查看全部问答> |
|
A synchronous buck converter with modified hysteretic control, invariable from output filter characteristics… 查看全部问答> |
|
呵呵,芯币兑换AVR学习板活动引起了大家的极大热情。 有一些朋友反映芯币不够,为了给大家更多的学习机会,我可以从我的芯币里面借一些给大家。 但是,为了让真正需要的人获得学习机会,我对提出借芯币的人要有一些考察,最后还要请EEWOR ...… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 09:12 编辑 整天呆在实验室,备战8月底的电赛,感觉好累,虽然每天吃在实验室,睡在实验室,还是感觉没效率啊,该怎么办啊,现在老师只叫我们调12864,把msp430采集的的正弦波形在12864上面显示出来,还要显示频 ...… 查看全部问答> |
|
职位要求: 1、自动控制或电子类专业; 2、10年以上电子等相关行业硬件研发工作经验; 3、能够独立完成电路方案设计、LAYOUT、以及后期硬件调试,能良好与软件工程师的交流协作;&nbs ...… 查看全部问答> |







