从单片机基础到程序框架(全集 2019pdf版).pdf - 第662页
第一百二十节: 按键切换窗口切换局部来设置参数。 【120.1 按键切换窗口切换局部来设置参数。 】 上图 12 0.1.1 数码管 上图 12 0.1.2 独立按键 上图 12 0.1.3 有源蜂鸣器

}
vGu8BeepTimerFlag=0;
vGu16BeepTimerCnt=VOICE_TIME; //蜂鸣器发出“滴”一声
vGu8BeepTimerFlag=1;
vGu8KeySec=0;
break;
case 2: //2 号按键
...... //此处省略 N 行代码,跟 1 号按键的代码类似
vGu8BeepTimerFlag=0;
vGu16BeepTimerCnt=VOICE_TIME; //蜂鸣器发出“滴”一声
vGu8BeepTimerFlag=1;
vGu8KeySec=0;
break;
}
}

第一百二十节: 按键切换窗口切换局部来设置参数。
【120.1 按键切换窗口切换局部来设置参数。】
上图 120.1.1 数码管
上图 120.1.2 独立按键
上图 120.1.3 有源蜂鸣器

为了更好理解上一节提出的人机界面程序框架的脉络,本节程序恰好包含了整屏更新与局部更新的应
用,同时也引入了一个新的知识点:在人机界面的程序框架中,常常会遇到需要以“位”来编辑某个数据的
情况,这种情况实际上是先把“待编辑数据”分解成几个“位”中间临时个体,然后显示并且编辑这些“位”
中间临时个体,编辑结束后,再把这些“位”中间临时个体合并成一个完整的数据赋值给“待编辑数据”。
本节程序功能如下:
(1)有 3 个窗口 1-XX,2-YY,3-ZZ,其中 XX,YY,ZZ 分别代表 3 个可编辑的数据 Gu8SetDate_1,
Gu8SetDate_2,Gu8SetDate_3。数据范围是从 0 到 99。
(2)K1 按键。含“短按”与“长按”复合双功能。当数码管“没有闪烁”时,“短按”K1 按键可以切
换窗口,而“长按”K1 按键会使数码管从“没有闪烁”进入到“闪烁模式”。当数码管处于“闪烁模式”时,
“短按”K1 可以使数码管在十位和个位之间切换“闪烁”的“局部位”,而“长按”K1 表示更改完毕当前窗
口数据并从“闪烁模式”退出到“没有闪烁”。
(3)K2 按键。当数码管处于“闪烁模式”时,每按一次 K2 按键就可以使当前闪烁的某位数码管“递增
1”。
(4)K3 按键。当数码管处于“闪烁模式”时,每按一次 K2 按键就可以使当前闪烁的某位数码管“递减
1”。
上述功能,在窗口切换和退出“闪烁模式”时用到整屏更新,在闪烁的某位数码管切换“局部”时用到
局部更新。代码如下:
#include "REG52.H"
#define KEY_FILTER_TIME 25 //按键的“短按”兼“滤波”的“稳定时间”
#define KEY_LONG_TIME 500 //按键的“长按”兼“滤波”的“稳定时间”
#define SCAN_TIME 1
#define VOICE_TIME 50
#define BLINK_TIME 250 //数码管闪烁跳动的时间的间隔
void T0_time();
void SystemInitial(void) ;
void Delay(unsigned long u32DelayTime) ;
void PeripheralInitial(void) ;
void KeyScan(void);
void KeyTask(void);
void VoiceScan(void);
void DisplayScan(void);
void DisplayTask(void); //上层显示的任务函数
void Wd1(void); //窗口 1 显示函数
void Wd2(void); //窗口 2 显示函数
void Wd3(void); //窗口 3 显示函数
void PartUpdate(unsigned char u8Part); //局部选择对应的某个局部变量更新显示输出