📄 global.c
字号:
#include "Global.H"
//数码管显示缓冲区。改变此缓冲区中的字型码,即改变相应数码管的显示内容。
//=====================================================================
UNCHAR DisplayBuffer[8];//数码管显示缓冲区,低字节为左边数码管,高字节为右边数码管
UNCHAR code HexChar[16] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71}; //0到f
/////////////////////////////////////////////////////数码管显示与键盘扫描函数///////////////////////////
UNCHAR KeyValue = 0;//按键值.有键按下置非0按键扫描码,应用程序读取按键扫描码后需清0.
//显示控制程序内部使用的变量
//--------------------------
UNCHAR DisplayDigit = 0;//当前数码管显示位的编号,亦即显示数据在显示缓冲区中的偏移量
//键盘扫描程序内部使用的变量
//--------------------------
UNCHAR KeyValueTemp = 0;//临时按键值变量,用于进行20ms延时检测
UNCHAR Key20msDelay = 0;//有键按下时的20ms去抖动延时控制
//显示键盘控制程序。在Timer1中断服务程序中被调用。
//===============================================
UNCHAR KeyDownFlag = 0;//有键按下标志。应用程序代码不能改变此变量的值,否则会影响键盘的正常工作。
void DisplayKeyboardControl(void) using 3
{
UNCHAR KeyScanCode;//按键扫描码,为0表示没有键按下
UNCHAR i;
//停止所有数码位的显示
//====================
XBYTE[DisplayDigitSelect] = 0xFF;
KeyScanCode = 0x00 ;//初始化为未检测到有键按下,为0表示没有键按下
//按键识别
//=================================
for(i=0;i<8;i++)
{
XBYTE[DisplaySegmentSelect]=~(0x1<<i);
if(P1^0==0)
{
KeyScanCode=2*i+1;
break;//退出键盘扫描循环
}
else if(P1^1==0)
{
KeyScanCode=2*i+2;
break;//退出键盘扫描循环
}
}
/////////////////////////////////////// //确定按键是否稳定按下或已经抬起 ///////////////////////////////////////
//确定按键是否稳定按下或已经抬起
//==============================
if(KeyScanCode)
{//本次中断有键按下.如果按键已经稳定按下(KeyDownFlag非0)了,则不做任何事,否则处理20ms去抖动延时.
if(!KeyDownFlag)
{//如果未确定按键已经稳定按下时,处理20ms延时
if(Key20msDelay)
{//在20ms延时处理中,继续20ms延时处理
Key20msDelay++;
if(Key20msDelay>20)
{//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;//标记按键已经抬起
}
}
/*
XBYTE[DisplayDigitSelect]=~(0x01<<DisplayDigit); //选择数码管显示位数
XBYTE[DisplaySegmentSelect]=DisplayBuffer[DisplayDigit]; //显示数字
DisplayDigit++;
if(DisplayDigit>=8)
DisplayDigit=0;
*/
}
/*
//完成系统按键值转换成自定义按键值的功能.在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;
}
}
*/
/*
;==============================================================================
;|/
; ----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 冒号*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -