本文从节省单片机I/O资源的角度,运用动态扫描的方式,实现2个I/O口扫描5个按键的功能。
一、思路:2个I/O口分别定义为KEY1和KEY2,可以有4种状态,如下:
—————————————————————
KEY1 KEY2 功能
0 0 不使用
0 1 检测按键2
1 0 检测按键4
1 1 检测按键1、3、5
—————————————————————
二、扫描:
1.KEY1=0,KEY2=1,按下按键2可拉低KEY2,从而检测按键2的状态。
2.KEY1=1,KEY2=0,按下按键4可拉低KEY1,从而检测按键4的状态。
3.KEY1=1,KEY2=1,按下按键1可拉低KEY2,按下按键3可拉低KEY1,按下按键5可同时拉低KEY1和KEY2。
当有某个按键按下时,需要进行松手检测,在按下状态使按键扫描停止,不然会出现错乱。
三、总结:
本案例除按键扫描,还有数码管动态显示,仅为单片机初学者或爱好者提供学习研究,了解程序编写的思维,互相交流。
学无止境,如果学友们有兴趣,下次发布1个I/O扫描8个按键的方案。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
四、单片机程序:
#include <REGX52.H>
#define uint unsigned int
#define uchar unsigned char
uchar code SEG[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳代码
uchar keynum; //定义按键键值变量
sbit COM1=P2^0; //数码管位1
sbit COM2=P2^1; //数码管位2
sbit KEY1=P2^6; //按键位1
sbit KEY2=P2^7; //按键位2
/***********************************************************
延时函数
***********************************************************/
void Delay(uint xms)
{
uchar i;
while(--xms)
{
i=120;
while(--i);
}
}
/***********************************************************
数码管动态扫描显示函数
***********************************************************/
void Show_seg()
{
P0=SEG[keynum/10];
COM1=1;
Delay(5);
COM1=0;
P0=SEG[keynum%10];
COM2=1;
Delay(5);
COM2=0;
}
/***********************************************************
按键扫描函数
***********************************************************/
void Key_scan() //本按键扫描程序必须要有松手检测,不然会出错
{
KEY1=1; KEY2=1; //此状态可以检测按键1、3、5
if(KEY1==1 && KEY2==0) {keynum=1; while(KEY1==1 && KEY2==0)Show_seg(); Delay(15);}
if(KEY1==0 && KEY2==1) {keynum=3; while(KEY1==0 && KEY2==1)Show_seg(); Delay(15);}
if(KEY1==0 && KEY2==0) {keynum=5; while(KEY1==0 && KEY2==0)Show_seg(); Delay(15);}
KEY1=0; KEY2=1; //此状态可以检测按键2
if(KEY2==0) {keynum=2; while(KEY2==0)Show_seg(); Delay(15);}
KEY1=1; KEY2=0; //此状态可以检测按键4
if(KEY1==0) {keynum=4; while(KEY1==0)Show_seg(); Delay(15);}
}
/***********************************************************
主函数
***********************************************************/
void main()
{
while(1)
{
Key_scan();
Show_seg();
}
}
仿真程序下载:
2IO扫描5个按键.7z
(18.63 KB, 下载次数: 11)
|