STC89C52单片机入门第四课

STC89C52单片机入门第四课

本节主讲“矩阵键盘”按键扫描和接线,以及switch和逻辑与的应用

讲的过程也许跟网上视频教程差异较大,但都是抽简单,正确的来教

首先要了解,什么是矩阵键盘,像一般按键,一个按键,则需占用1个I/O口

这样的话,按键多的情况下,很浪费I/O口,矩阵键盘,就是用较少的I/O口来做更多的按键。

首先是接线(面包板使用者须看,开发板使用者,跳到后面程序段)

把16个按键连接起来,上图是示意图,应该认真看,动手在面包板上接线

以及LED灯,也按图接上,VCC只的是5V电源,也是单片机第40脚

下面开始写程序,开头的那些就不再细说了,包含头文件、写上主函数

写上1个1MS(1毫秒)的延时函数(不懂可以参照上节课)

在主函数内,定义2个变量

unsigned char key,num;

这2个变量是unsigned char型,也就是无符号整形,0到256

在while(1)这个循环内,写入

P1=0x0f;

key=P1;

上面这两句语句的意思是,P1设置为00001111;然后key等于P1

要懂得,单片机只有高电平和低电平

电压大于2V,视为高电平,也就是1

电压低于2V,视为低电平,也就是0

0x0f也就是把P1.0、P1.1、P1.2、P1.3置为高电平

P1.4、P1.5、P1.6、P1.7置为低电平

检测key!=0x0f也就是说,key不等于0x0f,那么表示有按键按下

也可能是因为抖动引起的误判的,所以,这里需要再延时一些

再把P1赋值0x0f,把key等于P1结果就是(key=00001111)

如果按键按下时,(通俗的说0会把1吃掉),那么key也就不等于00001111了

这时候,就应该判断,到底按下了哪个按键(通俗的说,看看哪个1被吃掉)

key=P1&0x0f这个指令是逻辑与的意思

也就是把P1跟0x0f进行逻辑与比较,结果放在key

这里说明下switch()这个判断语句

switch(key)则是判断中括号内的变量,或者语句,是等于什么

后面case 0x07: num=4; break;意思是,如果key等于0x07那么num赋值4

如果不是,则判断下一个case,如果全都不是,则执行default: break;

这里先不详细说明switch,免得新手迷糊,先懂就可以了

逻辑与的意思:

必须都为1,否则即为0

比方:1&1=1;1&0=0;0&0=0;0&1=0;

假设P1是0000 1101

0x0f 也是0000 1111

它们与完的结果则是 0000 1101

十六进制是0x0d

那则表示,在P1.1所在的那一行有按键按下

把目标锁定在P1.1所在行的4个按键

那怎么判断,是这4个按键的哪一个呢?

这时,就要给P1赋值为0xf0;

也就是把P1.7、P1.6、P1.5、P1.4置为高电平

P1.0、P1.1、P1.2、P1.3置为低电平

然后再判断key,如果key等于0x70,那么就是0111 0000

也就是说在P1.1这行,第1个按键S5按下

那给num这个变量不变 如果是0xb0;那就是1011 0000

也就是P1.1这行,第二个按键按下,则num+4

那么结果就是

按S1按键num=1 按S2按键,num=5

按S5按键num=2 按S6按键num=6

按S9按键num=3 按S10按键num=7

按S13按键num=4按S14按键num=8

竖立键盘,当然要改成横的也不难,但这个留给新手朋友去练习吧

最后,加上1个循环,等待按键松手,以及让LED灯显示