从单片机基础到程序框架(全集 2019pdf版).pdf - 第663页

为了 更 好 理 解 上一 节 提 出 的 人 机 界面 程 序 框 架的 脉 络 , 本 节 程序 恰 好 包 含 了 整 屏 更新 与 局 部更 新 的 应 用, 同时也引入 了一个新的 知识点: 在人 机界面的程 序框架中 , 常常会遇 到需要 以 “位”来编辑某个数据的 情况, 这种情况实 际上是先把 “待编 辑数据” 分解成几 个 “位” 中间 临时个体, 然后显示并 且编辑这些 “位 ” 中间临时个 体,编辑结束 后,再把这…

100%1 / 836
第一百二十节: 按键切换窗口切换局部来设置参数。
【120.1 按键切换窗口切换局部来设置参数。
上图 120.1.1 数码管
上图 120.1.2 独立按键
上图 120.1.3 有源蜂鸣器
为了上一界面架的程序更新部更
用,同时也引入了一个新的知识点:在人机界面的程序框架中常常会遇到需要“位”来编辑某个数据的
情况,这种情况实际上是先把“待编辑数据”分解成几“位”中间临时个体,然后显示并且编辑这些“位
中间临时个体,编辑结束后,再把这些“位”中间临时个体合并成一个完整的数据赋值给“待编辑数据”
本节程序功能如下:
1 3 1-XX2-YY3-ZZ XXYY,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); //局部选择对应的某个局部变量更新显示输出
void BeepOpen(void);
void BeepClose(void);
sbit KEY_INPUT1=P2^2;
sbit KEY_INPUT2=P2^1;
sbit KEY_INPUT3=P2^0;
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P3_4=P3^4;
//数码管转换
code unsigned char Cu8DigTable[]=
{
0x3f, //0 序号 0
0x06, //1 序号 1
0x5b, //2 序号 2
0x4f, //3 序号 3
0x66, //4 序号 4
0x6d, //5 序号 5
0x7d, //6 序号 6
0x07, //7 序号 7
0x7f, //8 序号 8
0x6f, //9 序号 9
0x00, //不显 序号 10
0x40, //横杠- 序号 11
};
volatile unsigned char vGu8ScanTimerFlag=0;
volatile unsigned int vGu16ScanTimerCnt=0;
volatile unsigned char vGu8BeepTimerFlag=0;
volatile unsigned int vGu16BeepTimerCnt=0;
volatile unsigned char vGu8BlinkTimerFlag=0; //数码管闪烁跳动的定时器
volatile unsigned int vGu16BlinkTimerCnt=0;
unsigned char Gu8SetData_3=0; //单片机内部 3 个可编辑的参数,在窗口 3
unsigned char Gu8SetData_2=0; //单片机内部 2 个可编辑的参数,在窗口 2
unsigned char Gu8SetData_1=0; //单片机内部 1 个可编辑的参数,在窗口 1