由于太长时间没接触51代码,写这个东西也费了不少力气。
(本程序试用于金沙滩的STC89C52RC单片机)
我做的这个东西主要有四个功能:
1.查看温度(按键1)
2.查看时间并可以按下enter键来修改时间(按键2)
3.倒计时(按键4)
4.计分器(按键5)
因为我放在while里面,所以一直刷屏会有抖动,所以我设置了一个1秒的中断标志位,当标志位为1的时候,程序才会进行温度,时间,倒计时的刷屏。总的来说原理都比较简单,但是逻辑有绕。
下面是我的main函数代码
void main()
{
hardwave_Init(); //LCD初始化
while (1)
{
if(entering==0 && time_shezhi==1)
{
time_go(); //时间查看的刷新
}
KeyDriver();
if(see_tem==1)
{
tmp_check(); //温度查看
}
else if(time_shezhi==1)
{
time_check(); //查看时间
}
else if(daojishi_go==1)
{
start_jishu(); //倒计时开始
}
else if(beep_start == 0)
{
BUZZ = 0; //蜂鸣器响
if(miao_flag == 1) //若倒计时为0,蜂鸣器响一秒
{
miao_flag = 0;
BUZZ = 1;
beep_start = 1;
}
}
}
}
按键的代码
void KeyAction(unsigned char keycode)
{
if ((keycode>='0') && (keycode<='9')) //判断按键为数字还是符号
{
switch(keycode)
{
case '0':
if(daojishi_shezhi==1 && daojishi_enter == 0)
{
daojishi_enter = 1;
shezhi_jishu();
}
else if(daojishi_enter==1)
{
LcdCloseCursor();
daojishi_index = 1;
daojishi_enter = 0;
if(i[0] != 0 || i[1] != 0)
{
if(i[0] != 0 && i[1] == 0)
{
i[1] = 0x60;
i[0] = i[0] - 0x07;
}
daojishi_go=1;
}
}
break;
case '1':
if(see_tem==0 && time_shezhi==0 && daojishi_shezhi==0 && jifen_shezhi == 0)
{
see_tem=1;
}
else if(see_tem==1)
{
see_tem=0;
hardwave_Init();
}
break;
case '2':
if(see_tem==0 && time_shezhi==0 && daojishi_shezhi==0 && jifen_shezhi == 0)
{
time_shezhi=1;
time_check();
}
else if(time_shezhi==1)
{
time_shezhi=0;
hardwave_Init();
}
break;
case '4':
if(see_tem==0 && time_shezhi==0 && daojishi_shezhi==0 && jifen_shezhi == 0 )
{
daojishi_shezhi=1;
jishu_check();
}
else if(daojishi_shezhi==1)
{
daojishi_shezhi=0;
daojishi_go = 0;
hardwave_Init();
}
break;
case '5':
if(see_tem==0 && time_shezhi==0 && daojishi_shezhi==0 && jifen_shezhi == 0)
{
jifen_shezhi = 1;
jifen_check();
}
else if(jifen_shezhi == 1)
{
jifen_shezhi = 0;
hardwave_Init();
}
break;
}
}
else if (keycode == 0x26) //按下向上键
if(time_shezhi == 1)
{
IncSetTime();
}
else if(daojishi_shezhi == 1 && daojishi_enter == 1)
{
daojishi_up();
}
else if(jifen_shezhi == 1)
{
jifen_redjian();
}
}
else if (keycode == 0x28) //按下向下键
{
if(time_shezhi == 1)
{
DecSetTime();
}
else if(daojishi_shezhi == 1 && daojishi_enter == 1)
{
daojishi_down();
}
else if(jifen_shezhi == 1)
{
jifen_bluejian();
}
}
else if (keycode == 0x25) //按下向左键
{
if(time_shezhi == 1)
{
LeftShiftTimeSet();
}
else if(daojishi_shezhi == 1 && daojishi_enter == 1)
{
daojishi_zuoyi();
}
else if(jifen_shezhi == 1)
{
jifen_red();
}
}
else if (keycode == 0x27) //按下向右键
{
if(time_shezhi == 1)
{
RightShiftTimeSet();
}
else if(daojishi_shezhi == 1 && daojishi_enter == 1)
{
daojishi_youyi();
}
else if(jifen_shezhi == 1)
{
jifen_blue();
}
}
else if (keycode == 0x0D) // enter键按下
{
if (setIndex == 0 && time_shezhi == 1) //判断能否执行时间的设置
{
entering=1;
EnterTimeSet();
}
else //退出设置
{
entering=0;
ExitTimeSet(1);
}
}
else if (keycode == 0x1B) //退出设置
{
if(time_shezhi == 1)
{
entering=0;
ExitTimeSet(0);
}
}
}
通过各种标志位来给程序设定走向,0、1、2、4、5、还有上下左右按键各个按键直接的操作互不干扰,但是又有逻辑的可以在LCD上准确的表现出想要的效果。
代码链接:https://pan.baidu.com/s/1vM-EB-0hD1NWL1rWJWotkw
密码:pbvy
有兴趣的小伙伴可以自行下载观看