⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scankey.c

📁 自做的一个流程流码,用于判断C51单片机的长按与短按键的功能(一键多功能),自动调用相应的处理函数.修改下还可以实现更多的功能.
💻 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 + -