本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
按键是一种比较常用的输入设备
常见的有 独立按键、矩阵按键
1.
/***************************************************
项目:独立按键
版本:初级版
硬件; 电子工程师之家论坛学习板
具体描述:数码管显示按键按下的次数(最多显示9)
时间:2009年7月
作者:电子隐者
*****************************************************/
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit key1=P3^0; //独立按键端口
sbit dx=P1^4; //数码管段选控制端口
sbit wx=P1^5; //数码管位选控制端口
sbit led_cs=P1^6; //LED控制端口
uchar Qjpressnum; //按键按下的次数变量
/*延时函数*/
Delay(uchar i)
{
uchar j,k;
for(j=i;j>0;j--)
for(k=113;k>0;k--);
}
uchar code table[]={0xC0,0xF9, 0xA4,0xB0, 0x99,0x92,0x82,0xF8,0x80,0x90}; //共阴极数码管0—9的段码
/*键盘扫描函数*/
Keyscan()
{
if(key1==0) //如果key1等于0 则按键可能被按下
{
Delay(20); //延时一段时间
if(key1==0) //如果key1依然等于0 则按下确实被按下
{
while(key1==0) ; //如果按键未松开 则不做任何操作 做空循环
Qjpressnum++; //按键松开 按下次数变量加1
if(Qjpressnum==10) //如果按键次数超过9
Qjpressnum=0; //则按键次数清零
}
}
}
main()
{
led_cs=0; //LED控制端口关闭
while(1)
{
Keyscan(); //键盘扫描函数
/*选定显示数据的数码管*/
P0=0x01;
wx=1;
wx=0;
Delay(2);
/*选定要显示的数据*/
P0=table[Qjpressnum];
dx=1;
dx=0;
Delay(2);
}
}
2.
/********************************************
项目:独立按键
版本:初级版
硬件:电子工程师之家论坛学习板
具体描述:按键被按下一次循环切换任务0、任务1(可增加任务)
时间:2009年7月
作者:电子隐者
**********************************************/
#include<reg52.h>
#include<intrins.h> //包含_crol_() 、_cror_()函数
#define uchar unsigned char
#define uint unsigned int
sbit dx=P1^4; //数码管段选控制端口
sbit wx=P1^5; //数码管位选控制端口
sbit led_cs=P1^6; //LED控制端口
sbit key1=P3^0; //独立按键端口
uchar Qjpressnum; //定义按下按键次数全局变量
uchar Qjpressflag; //时候有按键按下标志
/*延时函数*/
Delay(uchar i)
{
uchar j,k;
for(j=i;j>0;j--)
for(k=200;k>0;k--);
}
/*键盘扫描函数*/
uchar Keyscan()
{
Qjpressflag=0; //按键按下标志置0(无按键按下)
if(key1==0) //如果key1等于0 则有可能按键被按下
{
Delay(20); //延时一段时间
if(key1==0) //如果key1仍然等于0 则按键确实被按下
{
while(!key1) ; //如果按键未松开 做空循环
Qjpressnum++; //按键松开 则按下次数加1
if(Qjpressnum==2) //按下次数等于2
Qjpressnum=0; //则按下次数清零
Qjpressflag=1; // 按键按下标志置1(有按键按下)
}
}
return(Qjpressflag);
}
/*任务0*/
job0()
{
uchar temp0=0xfe; //LED初始值
while(1)
{
P0=temp0;
temp0=_crol_(temp0,1);
Keyscan();
/*如果有按键按下 则跳出循环 返回主函数*/
if(Qjpressflag)
{
P0=0xff;
break;
}
Delay(160);
}
}
/*任务1*/
job1()
{
uchar temp1=0x7f;
while(1)
{
P0=temp1;
temp1=_cror_(temp1,1);
Keyscan();
/*如果有按键按下 则跳出循环 返回主函数*/
if(Qjpressflag)
{
P0=0xff;
break;
}
Delay(160);
}
}
main()
{
dx=0; //数码管段选控制端口关闭
wx=0; //数码管位选控制端口关闭
led_cs=1; //LED控制端口打开
Keyscan(); //先扫描按键
while(!Qjpressflag) //如果没有按键按下LED全亮
{
P0=0x00;
Keyscan(); //继续扫描
}
while(1)
{
switch(Qjpressnum)
{
case 0:job0();break;
case 1:job1();break;
}
}
} |