青岛大学本科生毕业论文(设计)
if (w == 0) { }
//标志位为0正常走时
//显示日期 //显示农历 //显示时间
displaydate(); displaynl(); displaytime();
read_temp(); //读取温度 ds1820disp(); //显示温度 displayxq(); //显示星期 if(!up) { } { } { }
game(); //按下退出键进入游戏功能
music(); //按下下键进入音乐功能
book(); //按下上键进入电子书功能
if(!down)
if(!exit)
else settime();//标志位为1,则进入调时功能
}//while循环结束 }//main函数结束
2、按键扫描函数
本设计中用到的按键较少,使用四个按键外加功能复用即可实现人机交互。
①:音频播放和文本浏览时,按键次数较少,因此采用单片机延时检测电平的方法实现按键扫描:
unsigned char keyscan() //按键扫描函数 {
unsigned char q;
31
青岛大学本科生毕业论文(设计)
if(!up) //按下UP键 {
delay(5000); while(!up); if(up) { }
delay(5000); if(up) }
}
q=0;
return q; //返回UP键值为0
//按键防抖
{
if(!down) //按下DOWN键 {
delay(5000); //按键防抖 while(!down); if(down) { }
if(!enter) //按下enter键 {
delay(5000); //按键防抖
32
delay(5000); if(down) }
q=1; return q; }
//返回DOWN键值为1
{
青岛大学本科生毕业论文(设计)
}
②:当进行俄罗斯方块游戏时,检测电平的方法不能满足设计要求,此时采用定时器中断的方法进行按键扫描:
33
while(!enter); if(enter) { }
if(!exit) //按下exit键 {
delay(5000); while(!exit); if(exit) { } q=4;
return q; //无键按下
delay(5000); if(exit) }
}
q=3;
return q; //返回exit键值为3
delay(5000); if(enter) }
}
q=2; return q;
//返回enter键值为2
//按键防抖
{
{
青岛大学本科生毕业论文(设计)
void initTimer0(void) //定时器0初始化 { }
void keyScan(void) interrupt 1 {
uchar keyCur;
static uchar keyOld = 0xff,keyTime = 0; TH0 = 0x70; keyCur = ~P3;
if(keyCur != keyOld)
keyTime = 0; keyChange = 0;
keyOld = keyCur; //保存当前按键情况 return;
//返回
//如果两次值不等,说明按键情况发生了改变
//键盘按下时间为0
//5ms
TMOD&=0xF0; TMOD|=0x01; ET0=1;
TR0=1; EA=1;
//启动定时器0
//定时器0模式控制在高4位 //定时器0工作在模式1
TL0 = 0x00;
{
}
else
if(++ keyTime == 5) {
keyTime = 0; keyOld = 0xff;
keyPress = keyCur&0x3C; //保存按键 keyChange = 1;
//如果按下时间足够
{
}
} }
34
青岛大学本科生毕业论文(设计)
3、book()子函数
book()子函数用来实现电子书的浏览,正常待机界面下按up键进入电子书功能,具体流程图如下:
按下电子书功能键 显示书籍列表 左右键选择书籍 按键检测 输入键 浏览文本 退出键到上一级 按键检测 退出键退出 左右键 上下翻页 输入键选择书签 返回默认界面
图4.2 电子书函数设计流程图
具体程序设计见附录二。
4、music()子函数
music()子函数用来实现音频文件播放,正常待机界面下按down键进入音频播放功能,具体流程图如下:
35