📄 scankey.c
字号:
#include <reg51.h>
#define LONGPRESS 4 //定义长按设置键的时间
sbit SETKEY = P1^5; //K2,多功能按键(短按,长按)
sbit SELECT = P1^6; //调整键(k3),位选择
sbit ADJUST = P1^7; //调整键(k4),位调整
unsigned char skeycount; //设置按键时长计数器
unsigned char skpttime; //设置按键时长
unsigned char sflag; //设置显示状态标志,0-普通运行,1-定时设置,2-日历时钟设置
bit skpflag; //设置按键按下标志
void delay1ms(unsigned char ms);//延时程序
void setkeyscan(); //设置键的扫描判断函数
void pro_sklp(); //长按设置功能键的处理函数
void pro_sksp(); //短按设置功能键的处理函数
//主程序,初始化及初值设定
//===========================
void main()
{
skeycount=0; //初始化功能键按下时长计数器
skpttime=0; //初始化功能键按下的总时长
sflag=0; //初始化显示状态标志,0-普通运行,1-定时设置,2-日历时钟设置
SELECT=1; //k3,设置为输入端口
ADJUST=1; //k4,设置为输入端口
SETKEY=1; //k2,设置为输入端口
IE = 0x82; //CPU开中断,Timer0开中断
TMOD = 0x11; //Timer0,Timer1工作于模式1, 16位定时方式
TH0 = 0xdc;TL0 = 0x00; //Timer0置10ms定时初值
//TH1 = 0xff;TL1 = 0x00; //Timer1置初值
TR0 = 1; //Timer0启动
//TR1 = 0;
while(1)
{
setkeyscan(); //检测功能键
//--------
//主程序内容
//--------
}
}
//=======子程序==================================
/*检测及处理多功能设置按键k2*/
void setkeyscan()
{
if (skpflag) //判断是否已经有键按下未被处理
{
if(skeycount>LONGPRESS) //如果是长按则执行长按键设置功能
{
pro_sklp();
skpflag=0;
}
else if((skpttime>0) && (skpttime<=LONGPRESS)) //否则如果是短按则执行短按的功能,都不是直接跳过
{
pro_sksp();
skpflag=0;
}
}
else
{
if(!SETKEY) //按下设置键
{
delay1ms(10); //键盘防抖
if(!SETKEY)
{
skeycount=0; //初始化按键时长计数器
skpttime=0; //初始化按键时长
skpflag=1; //标志已经有键被按下
}
}
}
}
/* 延时程序*/
void delay1ms(unsigned char ms)
{ while(ms--) //每循环一次,约延迟1ms
{ unsigned char i;
for(i = 0; i< 250; i++) //循环250次,在12M晶振时约延时1ms
{
_nop_(); //执行一条_nop_()指令为一个机器周期
_nop_();
_nop_();
_nop_();
}
}
}
/*(短按k2)*/
void pro_sksp()
{
sflag=0; //设置状态标志
//以下为短按键的处理程序
//
//---------------------
}
/*(长按k2)*/
void pro_sklp()
{
sflag=0; //设置状态标志
//以下为长按键的处理程序
//
//---------------------
}
//===中断子程序=======================
/*Timer0中断处理程序,秒的产生*/
void timer0() interrupt 1
{
TH0=0xdc; //Timer0置10ms定时初值dc00H(2^16=65536D,dc00H=56320D)
TL0=0x00; //定时时间=(65536-56320)*(1/11.0592)*12=10ms (f0=11.0592Mhz)
sec100++;
if(sec100 >= 100) //1秒时间 (100*10ms=1000ms=1s)
{
sec100 = 0;
//以下为设置功能键的按键时长计数部分
if(skpflag)
{
skeycount++;
if(SETKEY) skpttime=skeycount;
}
//------------
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -