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

📄 global.c

📁 KEILC51的始终程序,显示年月日
💻 C
字号:
#include "Global.H"


//任务及菜单控制
//==============
UNCHAR TaskMode = 1;//任务模式。1.键盘测试 2.HELLO 3.时钟显示
bit	TaskChangeFlag = 0;//请求切换任务标志
UNCHAR Menu1 = 1;//任务中的一级菜单控制变量
UNCHAR Menu2 = 1;//任务中的二级菜单控制变量
UNCHAR Menu3 = 1;//任务中的三级菜单控制变量

//数码管显示缓冲区。改变此缓冲区中的字型码,即改变相应数码管的显示内容。
//=====================================================================
UNCHAR DisplayBuffer[8];//数码管显示缓冲区,低字节为左边数码管,高字节为右边数码管

//键盘接口参数
//============
UNCHAR KeyDownFlag = 0;//有键按下标志。应用程序代码不能改变此变量的值,否则会影响键盘的正常工作。
UNCHAR KeyValue = 0;//按键值.有键按下置非0按键扫描码,应用程序读取按键扫描码后需清0.

UNCHAR MyKey = 0;//自定义的按键值。将系统的按键值转换成自定义的按键值,由函数KeyConvert()完成。
void KeyConvert(void);//完成系统按键值转换成自定义按键值的功能


/*
;==============================================================================
;|/
;	 ----a----
;	|		  |
;	f		  b
;	|		  |
;	 ----g----				 显示字符编码区
;	|		  |
;	e		  c
;	|		  |
;	 ----d----	 .dp
;
;显示字节:7(dp),6(g),5(f),4(e),3(d),2(c),1(b),0(a)
;		
;带小数点显示时,只需将要显示的字符符号编码值或上0x80即可.
;
*/

//十六进制数码字符编码
//====================
UNCHAR code HexChar[]={
	0x3F,//0:	00111111B
	0x06,//1:	00000110B
	0x5B,//2:	01011011B
	0x4F,//3:	01001111B
	0x66,//4:	01100110B
	0x6D,//5:	01101101B
	0x7D,//6:	01111101B
	0x07,//7:	00000111B
	0x7F,//8:	01111111B
	0x6F,//9:	01101111B
	0x77,//A:	01110111B
	0x7C,//B:	01111100B
	0x39,//C:	00111001B
	0x5E,//D:	01011110B
	0x79,//E:	01111001B
	0x71 //F:	01110001B
	};

//其它字符编码
//============
UNCHAR code Char_H = 0x76;//01110110B
UNCHAR code Char_L = 0x38;//00111000B
UNCHAR code Char_O = 0x3F;//00111111B
UNCHAR code Char_Colon = 0x09;//00001001B 冒号
UNCHAR code Char_SubSign = 0x40;//01000000B 减号




//显示控制程序内部使用的变量
//--------------------------
UNCHAR DisplayDigit = 0;//当前数码管显示位的编号,亦即显示数据在显示缓冲区中的偏移量
//键盘扫描程序内部使用的变量
//--------------------------
UNCHAR KeyValueTemp = 0;//临时按键值变量,用于进行20ms延时检测
UNCHAR Key20msDelay = 0;//有键按下时的20ms去抖动延时控制

//显示键盘控制程序。在Timer2中断服务程序中被调用。
//===============================================
void DisplayKeyboardControl(void) using 3
{
	UNCHAR KeyTestCode;//扫描键盘时的扫描测试码
	UNCHAR KeyScanCode;//按键扫描码,为0表示没有键按下
	UNCHAR i;

	UNCHAR Digit;//用于计算控制数码位显示的位数据,以便送入DisplayDigitSelect锁存器控制位显示

	//停止所有数码位的显示
	//====================
	XBYTE[DisplayDigitSelect] = 0xFF;

	//扫描键盘当前是否有键按下
	//========================
	KeyScanCode = 0x00 ;//初始化为未检测到有键按下
	for(i=0;i<8;i++)
	{
		//计算本次扫描测试码
		//------------------
		KeyTestCode = 0x01;
		KeyTestCode <<= i;
		KeyTestCode = ~KeyTestCode;

		//输出键盘扫描测试码
		//------------------
		XBYTE[DisplaySegmentSelect] = KeyTestCode;

		//检查是否有按键按下
		//------------------
		if(!P1_0)
		{//0路有键按下
			KeyScanCode = 2*i + 1;//计算此按键的扫描码
			break;//退出键盘扫描循环
		}
		else if(!P1_1)
		{//1路有键按下
			KeyScanCode = 2*i + 2;//计算此按键的扫描码
			break;//退出键盘扫描循环
		}
	}
	
	//确定按键是否稳定按下或已经抬起
	//==============================
	if(KeyScanCode)
	{//本次中断有键按下.如果按键已经稳定按下(KeyDownFlag非0)了,则不做任何事,否则处理20ms去抖动延时.
		if(!KeyDownFlag)
		{//如果未确定按键已经稳定按下时,处理20ms延时
			if(Key20msDelay)
			{//在20ms延时处理中,继续20ms延时处理
				Key20msDelay++;
				if(Key20msDelay>8)
				{//20ms延时时间到
					if(KeyScanCode == KeyValueTemp)
					{//本次按键扫描码与20ms延时开始时的按键扫描码相同,确定按键稳定按下
						KeyDownFlag = 1;//标记按键稳定按下
						KeyValue = KeyScanCode;//将按键扫描码送入按键缓冲区
						Key20msDelay = 0;//结束20ms延时状态
					}
					else
					{//20ms延时前后的扫描码不相同,以最后一次的扫描码来启动新的20ms去抖动延时
						KeyValueTemp = KeyScanCode;//记下20ms延时开始时的按键扫描码
						Key20msDelay = 1;//重新进入20ms延时处理
					}
				}
			}
			else
			{//未进入20ms延时处理时,启动20ms延时处理
				KeyValueTemp = KeyScanCode;//记下20ms延时开始时的按键扫描码
				Key20msDelay = 1;//进入20ms延时处理
			}
		}
	}
	else
	{//本次中断无键按下
		if(Key20msDelay)
		{//在20ms延时处理中,继续20ms延时处理
			Key20msDelay++;
			if(Key20msDelay>8)
			{//20ms延时时间到,说明启动20ms延时的按键信号是干扰信号,直接结束20ms延时状态
				Key20msDelay = 0;//结束20ms延时状态
			}
		}
		else
		{//未进入20ms延时处理时
			KeyDownFlag = 0;//标记按键已经抬起
		}
	}

	//显示下一个数码位
	//================
	DisplayDigit++;//指向新的要显示的数码管
	if(DisplayDigit>=8) DisplayDigit = 0;

	XBYTE[DisplaySegmentSelect] = DisplayBuffer[DisplayDigit];//送段显示数据,确定要显示的字型

	//计算位显示锁存器数据
	//--------------------
	Digit = 0x01;//0000 0001
	Digit <<= DisplayDigit;
	Digit = ~Digit;

	XBYTE[DisplayDigitSelect] = Digit;//送位显示数据,确定要显示的数码位
}

//完成系统按键值转换成自定义按键值的功能.在main()的主循环中被调用
//===============================================================
void KeyConvert(void)
{
	if(KeyValue)
	{
		switch(KeyValue)
		{
			case 1:  MyKey = 1; break;
			case 2:  MyKey = 2; break;
			case 3:  MyKey = 3; break;
			case 4:  MyKey = 4; break;
			case 5:  MyKey = 5; break;
			case 6:  MyKey = 6; break;
			case 7:  MyKey = 7; break;
			case 8:  MyKey = 8; break;
			case 9:  MyKey = 9; break;
			case 10: MyKey = 10;break;
			case 11: MyKey = 11;break;
			case 12: MyKey = 12;break;
			case 13: MyKey = 13;break;
			case 14: MyKey = 14;break;
			case 15: MyKey = 15;break;
			case 16: MyKey = 16;break;
		}

		KeyValue = 0;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -