logo资料库

矩阵按键.pdf

第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
资料共6页,全文预览结束
一、矩阵按键的由来
二、矩阵按键的扫描原理
三、矩阵按键变成独立按键
四、代码
一、矩阵按键的由来 按键矩阵是由一个个独立按键连接在一起,每一行引出一个管脚,每一列也引出 一个管脚。 二、矩阵按键的扫描原理 逐行扫描:通过高四位轮流输出低电平来对矩阵键盘逐行扫描,当低四位接 收到的数据不全为 1 的时候,说明有按键按下,通过接收到的数据是哪一位为 0 来判断是那一个按键被按下。 行列扫描:
行列扫描:我们可以通过高四位全部输出低电平,低四位输出高电平。当接收到的数 据,低四位不全位高电平时,说明有按键按下,通过接收到的数值,判断是哪一列有按键按 下,然后在反过来,高四位输出高电平,低四位输出低电平,然后根据接收到的高四位的值 判断是那一行有按键按下,这样能够确定是哪一个按键按下。 三、矩阵按键变成独立按键
每一行接一个 GND 四、代码 #include #include typedef unsigned char u8; typedef unsigned int u16; // 预处理数据类型 无符号 // 预处理数据类型 #define GPIO_GIO P0 #define GPIO_KEY P1 // 宏定义 // 按键断选 按键接口 P2^2; /*// 138 译码器管脚定义 sbit LSA = 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 ; GPIO_KEY = 0x0f; if(GPIO_KEY != 0x0f){ // -128 到 128 初始化 a // 对并行串口的定义,高四位为低电平 // 判断按键是否按下 delay(1000); // 按键消抖 if(GPIO_KEY != 0x0f){ // 判断列 switch(GPIO_KEY){ case(0x07):KeyValue =0;break; case(0x0b):KeyValue =1;break; case(0x0d):KeyValue =2;break; case(0x0e):KeyValue =3;break; // 0000 0111 // 0000 1011 // 0000 1101 // 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; // } GPIO_KEY while((a<50)&&(GPIO_KEY!=0xf0)) // 强 制 退 出 while 循 环 { delay(1000); a++; } // 延迟 10 毫秒 } } } // 数组 /********************************** 数码管显示真值表 共阳
1 0 5 0xc0 0xf9 0xa4 0xb0 0x99 0x92 2 3 4 6 9 0x82 0xf8 0x80 0x90 7 8 a b 0x88 0x83 c e d 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]; } }
分享到:
收藏