目录
一、几点说明
1、本例设计在数码管、键盘基础上进行,数码管、键盘设计可以参考博主之前的博文或下载同步配套的资源。
2、人机交互设计中不涉及竞赛中具体的功能模块的调用,如DS1302、18B20、24C02等,竞赛中涉及的功能模块已有单独的博文可以参考。
3、本例以低8界省赛为例,对其它赛题有参考作用。
二、赛题功能描述(截取自赛题)
3.1 初始化
1)关闭蜂鸣器、继电器等无关外设;
2)设备初始化时钟为 23 时 59 分 50 秒,闹钟提醒时间 0 时 0 分 0 秒。
3.2 显示功能
1) 时间显示格式
2) 温度显示格式
3.3 按键功能
1)按键 S7 定义为“时钟设置”按键,通过该按键可切换选择待调整的时、分、秒,当前选择的显示单元以 1 秒为间隔亮灭,时、分、秒的调整需注意数据边界属性。
2) 按键 S6 定义为“闹钟设置”按键,通过该按键可进入闹钟时间设置功能,数码管显示当前设定的闹钟时间。
3) 按键 S5 定义为“加”按键,在“时钟设置”或“闹钟设置”状态下,每次按下该按键当前选择的单元(时、分或秒)增加 1 个单位。
4) 按键 S4 定义为“减”按键,在“时钟设置”或“闹钟设置”状态下,
每次按下该按键当前选择的单元(时、分或秒)减少 1 个单位。
5) 按键功能说明:
按键 S4、 S5 的“加”、“减”功能只在“时钟设置”或“闹钟设置”状态下有效;
在 “时钟显示”状态下,按下 S4 按键,显示温度数据,松开按键,返回“时钟显示”界面。
3.4 闹钟提示功能
1)指示灯 L1 以 0.2 秒为间隔闪烁,持续 5 秒钟; 2)闹钟提示状态下,按下任意按键,关闭闪烁提示功能。
三、显示界面分解与程序设计
1、完善显示功能
参照以前的博文,在数码管、键盘程序基础上完善显示功能,数码管闪烁、灯闪烁、特殊的显示字符等,这里不再赘述,也可以博文最后的链接下载资源,解读程序。
2、显示界面分解与程序设计
从上面显示要求看,需要有3个显示状态,即时钟设置与显示状态、闹钟设置状态和温度显示状态,3个状态与按键功能配合实现切换。
首先,定义一个变量表示它们,一般用0表示初始状态,本例表示时钟状态,1表示闹钟设置状态,2表示温度显示状态。
其次,根据每个显示状态界面显示的内容定义相对应的变量,根据赛题内容付初值。
然后,在数码管显示程序开头,对显示状态变量进行判断,根据每个状态显示的内容将相应的变量拆分送给数码管显示。程序如下:
//定义相关变量
unsigned char dis_statue=0;//显示状态 0--时钟 1--闹钟设置 2--温度显示
unsigned char hour=23; //时
unsigned char minute=59; //分
unsigned char second=50; //秒
unsigned char hour_S=0; //闹钟时
unsigned char minute_S=0; //闹钟分
unsigned char second_S=0; //闹钟秒
unsigned char temp=21; //温度
//数码管程序开头添加内容
switch(dis_statue)//根据显示状态,控制数码管显示
{
case 0://时钟
Led1=hour/10; //时拆分显示
Led2=hour%10;
Led3=11; //分隔符
Led4=minute/10; //分拆分显示
Led5=minute%10;
Led6=11; //分隔符
Led7=second/10; //秒拆分显示
Led8=second%10;
break;
case 1://闹钟
Led1=hour_S/10; //闹钟时拆分显示
Led2=hour_S%10;
Led3=11; //分隔符
Led4=minute_S/10; //闹钟分拆分显示
Led5=minute_S%10;
Led6=11; //分隔符
Led7=second_S/10; //闹钟秒拆分显示
Led8=second_S%10;
break;
case 2://温度显示
Led1=10; //灭
Led2=10;
Led3=10;
Led4=10;
Led5=10;
Led6=temp/10; //温度拆分显示
Led7=temp%10;
Led8=12; // C
break;
default:break;
}
四、键盘功能分解及程序设计
1、S7、S6键功能
S7、S6键功能类似,以S7键为例。
首先,有4个状态进行循环变换,定义一个变量,0为时钟显示状态,1为时修改状态(闪烁),2为分修改状态(闪烁),3为分修改状态(闪烁)。
其次,根据4个状态的要求控制数码管的闪烁、亮灭。
然后,要考虑S7、S6键互锁,即在时钟修改状态S6键无效,同样在闹钟修改状态S7键无效。
最后、考虑在闹钟提示状态,关闭闹钟提示,S7、S6的状态修改功能无效。
S7键的程序如下:
if(!L1_S) //判断闹钟提醒状态
{//非闹钟提醒状态
if(S6_statue==0) //判断S6状态,S6、S7互锁
{
S7_statue++; //S7状态切换
if(S7_statue==4)S7_statue=0;//0~3切换
switch(S7_statue)
{
case 0: //退出时钟设置
Led78_S=0;//数码管78闪烁 0--No 1--S
Led78_LM=0;//数码管78亮灭 0--L 1--M
break;
case 1:
Led12_S=1;//数码管12闪烁 0--No 1--S
break;
case 2:
Led12_S=0;//数码管12闪烁 0--No 1--S
Led12_LM=0;//数码管12亮灭 0--L 1--M
Led45_S=1;//数码管45闪烁 0--No 1--S
break;
case 3:
Led45_S=0;//数码管45闪烁 0--No 1--S
Led45_LM=0;//数码管45亮灭 0--L 1--M
Led78_S=1;//数码管78闪烁 0--No 1--S
break;
default:break;
}
}
}
else {//关闭闹钟提醒
L1_5S=0; //
//5S
L1_S=0;
L1_LM=0;
}
S7_yx=1;//0---No 1--yx
2、S5、S4键功能
S5是加1修改,S4是减1修改,两者功能类似,另外S4键在时钟显示状态按下显示温度,本例以S4键为例。
首先:判断数码管闪烁标志,根据显示状态变量确定是时钟修改还是闹钟修改,对时钟参数或闹钟参数进行修改。
其次:判断在时钟状态下切换为温度显示状态。
然后、考虑在闹钟提示状态,关闭闹钟提示。
最后、在按键松开后恢复为始终显示状态。
S4键功能函数如下:
void S4()
{
Lie1=0;Lie2=1;Lie3=1;Lie4=1;
if(Hang4==0)
{//anxia
if(!S4_yx)
{
S4_js++;
if(S4_js==30)
{
S4_js=0;
//功能
if(!L1_S)//判断闹钟提醒状态
{
if(Led12_S)//时闪烁
{
if(dis_statue==0)
{//时钟状态
if(hour==0)hour=24;
hour--;
}
else {//闹钟状态
if(hour_S==0)hour_S=24;
hour_S--;
}
}
if(Led45_S)//分闪烁
{
if(dis_statue==0)
{//时钟状态
if(minute==0)minute=60;
minute--;
}
else {//闹钟状态
if(minute_S==0)minute_S=60;
minute_S--;
}
}
if(Led78_S)//秒闪烁
{
if(dis_statue==0)
{//时钟状态
if(second==0)second=60;
second--;
}
else {//闹钟状态
if(second_S==0)second_S=60;
second_S--;
}
}
if((S7_statue==0)&&(S6_statue==0))
{//时钟状态进入温度显示
dis_statue=2;//0--时钟 1--闹钟设置 2--温度显示
S4_yx=1;//0---No 1--yx
}
}
else {//关闭闹钟提醒
L1_5S=0;
//5S
L1_S=0;
L1_LM=0;
}
// S4_yx=1;//0---No 1--yx
}
}
}
else {//松开
S4_js=0;
S4_yx=0;//0---No 1--yx
if(dis_statue==2)dis_statue=0;//温度显示状态进入时钟状态
}
}