51单片机之矩阵按键

2019-04-15 16:05发布

2018/3/18单片机1.说在前面1.今天从图书馆借到了一本51单片机的基础教程,从其中看到了一些关于单片机的基础知识1-1:单片机是在一块硅片上集成微处理器,储存器以及各种输入输出接口,所以被称为单片微型计算机,简称单片机1-2:通俗的来说,单片机就是一块集成芯片,但是有一些特殊的功能,通过在不同时间控制芯片输出高低电平从而输出不同的电平,控制和引脚相连的外围电路的电气情况对于我的单片机板子ST89c52 40ISTC:前缀    8:8051内核    9:内部是FlashE^2prom存储器    c:cmos存储器    5:无特殊含意    2:内存为2*4KB40I:40表示单片机的最高晶振为40mhz,I:表示为工业用(c:商业    a:汽车用品    m:军用)2.矩阵键盘(进入正题)1.矩阵键盘其实和独立键盘的原理差不多,都是机械按键,都需要实现消抖,但是矩阵键盘需要加上一些特定的条件,不能跟独立键盘一样一个一个定义了(否则定义16个不是要爆炸),所以如果要判断是哪个键位按下,有两种判断方法 方法一:先通过高四位全部输出低电平,然后逐行扫描,如果低四位不为1(非门)则,该行的按键被按下
方法二(常用):先给高四位全部输出低电平,低四位输出高电平,接受数据,当低四位不全为高电平时,判断所在列,然后,低四位输出低电平,高四位输出高电平,判断行,行列都判断了; #include //采用宏定义,定义矩阵端口和数码管发送端口 #define GPIO_KEY P1//矩阵端口 #define GPIO_DIG P0//数码管端口 typedef unsigned char u8; typedef unsigned int u16; /*实现38译码器的使用,实现数码管的位选*/ sbit LSA=P2^2; sbit LSB=P2^3; sbit LSC=P2^4; u8 KEY_VALUE;//定义矩阵键盘所定义的数 u16 i;//延时参数 u16 a=0; //使用数组定义,code为定义常量数组,将数组定义在ROM中 u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f, 0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//定义数码管的字码 //延时函数 void delay(u16 i) { while(i--); } //判断按键按下的情况 void KEYDown() { GPIO_KEY=0x0f;//00001111 定义高四位为低电平,低四位为高电平 if(GPIO_KEY!=0x0f)//说明某一列按键按下 { delay(1000);//消抖 if(GPIO_KEY!=0x0f) //检测代码是否按下 { //列判断 GPIO_KEY=0x0f;//00001111定义高四位为0,低四位为1 switch(GPIO_KEY) { //给samg数组赋值,便于让按钮控制数值 case(0x07): KEY_VALUE=0;break;//第一列,00000111 case(0x0b): KEY_VALUE=1;break;//第二列,00001011 case(0x0d): KEY_VALUE=2;break;//第三列,00001101 case(0x0e): KEY_VALUE=3;break;//第四列;00001110 } //行判断 GPIO_KEY=0xf0; switch(GPIO_KEY) { GPIO_KEY=0xf0;//定义高四位为1,低四位为0(第二次判断) case(0x70): KEY_VALUE=KEY_VALUE;break;//第一行,01110000 case(0xb0): KEY_VALUE=KEY_VALUE+4;break;//第二行,10110000 case(0xd0): KEY_VALUE=KEY_VALUE+8;break;//第三列,11010000 case(0xe0): KEY_VALUE=KEY_VALUE+12;break;//第四列;11100000 } //设置a,设置运转时间 while((a<50)&&(GPIO_KEY!=0xf0))//按键松手检测 { delay(1000); a++; } } } } void main() { //表示38译码器 LSA=1; LSB=1; LSC=0; while(1) { KEYDown(); GPIO_DIG=smgduan[KEY_VALUE]; } }