找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

独立按键学习(一)

[复制链接]
admin 发表于 2012-9-2 22:37:10 | 显示全部楼层 |阅读模式

本文包含原理图、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;
}
}
}
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-29 12:51 , Processed in 0.054059 second(s), 11 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表