一、 前言
马上就要决赛了,总是感觉准备的不是很充足,听说拿到省一的小伙伴有的都保研了,可怜那,学校不好,都没有保研名额。
下面进入正题
二、题目
pdf版链接
链接:https://pan.baidu.com/s/11JVfZjdRJzbwwZZNCLPctg
提取码:yh3g
复制这段内容后打开百度网盘手机App,操作更方便哦
三、代码
main.c
#include "main.h"
uint temp;
uint light;
bit lb;
bit lb_flag;//亮暗标志位
bit light_flag = 1;
bit temp_flag = 1;
bit t_flag1;//时间标志位
bit t_flag2;
char h_num = 17;//参数界面默认数据
char temp_num = 25;
char led_num = 4;
sbit led1 = P0^0;
sbit led2 = P0^1;
sbit led3 = P0^2;
sbit led4 = P0^3;
sbit led5 = P0^4;
sbit led6 = P0^5;
sbit led7 = P0^6;
sbit led8 = P0^7;
void Timer0Init(void) //2毫秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x9A; //设置定时初值
TH0 = 0xA9; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
EA = 1;
ET0 = 1;
}
bit key_flag;
bit s4;
uchar s5;
uchar key_val;
uchar key_scanf();
void main()
{
Y4; P0 = 0xff;
Y5; P0 = 0x00;
ds_write(16,59,50);
Timer0Init();
while(1)
{
if(key_flag == 1)
{
key_val = key_scanf();
key_flag = 0;
}
if(light_flag==1)
{
light = ad_read(1);
light_flag = 0;
if(light<250){lb = 1;}
else{lb = 0;}
}
if(temp_flag == 1)
{
temp_flag = 0;
temp = rd_temperature();
}
if(s4 == 0)
{
if(s5==0)
{
smg_display(h/10,h%10,24,m/10,m%10,24,s/10,s%10);
}
if(s5==1)
{
smg_display(21,20,20,20,20,temp/100,temp%100/10+10,temp%10);
}
if(s5 == 2)
{
smg_display(22,20,light/100+10,light%100/10,light%10,20,20,lb);
}
}
if(s4 == 1)
{
if(s5==0)
{
smg_display(23,1,20,20,20,20,h_num/10,h_num%10);
}
if(s5==1)
{
smg_display(23,2,20,20,20,20,temp_num/10,temp_num%10);
}
if(s5 == 2)
{
smg_display(23,3,20,20,20,20,20,led_num);
}
}
}
}
void Timer0() interrupt 1
{
uchar key_ms;
uchar ms;
uint lb_ms;
smg();
ds_read();
key_ms++;
if(key_ms == 5){key_ms = 0; key_flag = 1;light_flag = 1;}
ms++;
if(ms%50 == 0){light_flag = 1;}
if(ms == 200){temp_flag = 1;ms = 0;}
if(lb == 1)
{
lb_ms++;
if(lb_ms == 1500)
{
lb_ms = 0;
lb_flag = 1;
}
}
else if(lb == 0)
{
lb_ms++;
if(lb_ms == 1500)
{
lb_ms = 0;
lb_flag = 0;
}
}
if(ms%20 == 0)
{
if(s4 == 0)
{
P2 = 0x80;
if(h_num<8)
{
if(h<h_num)
{t_flag1 = 1;}
}
if(t_flag1 == 1)
{
if(h != 8){led1 = 0;}
else {t_flag1 = 0;led1 = 1;}
}
if(h_num>8)
{
if(h<h_num)
{t_flag2 = 1;}
}
if(t_flag2 == 1)
{
if(h != 8){led1 = 0;}
else {t_flag2 = 0;led1 = 1;}
}
// if(h<h_num){led1 = 0;}
// else {led1 = 1;}
if((temp/10)<temp_num){led2 = 0;}
else {led2 = 1;}
}
if(lb_flag == 0)
{led3 = 1;}
else
{
led3 = 0;
}
if(lb == 1)
{
if(s4 == 0)
{
if(led_num == 4){led4 = 0;led5 = 1;led6 = 1;led7 = 1; led8 = 1;}
else if(led_num == 5){led4 = 1;led5 = 0;led6 = 1;led7 = 1; led8 = 1;}
else if(led_num == 6){led4 = 1;led5 = 1;led6 = 0;led7 = 1; led8 = 1;}
else if(led_num == 7){led4 = 1;led5 = 1;led6 = 1;led7 = 0; led8 = 1;}
else if(led_num == 8){led4 = 1;led5 = 1;led6 = 1;led7 = 1; led8 = 0;}
}
}
Y0;
}
}
uchar key_return;
uchar key_scanf()//状态机按键
{
static uchar key_state = key_state_0;
uchar key_temp;
uchar key1,key2;
P3 = 0x0f;P42 = 0;P44 = 0;
if(P30 == 0) key1 = 0x0e;
if(P31 == 0) key1 = 0x0d;
if(P32 == 0) key1 = 0x0b;
if(P33 == 0) key1 = 0x07;
if(P3 == 0x0f) key1 = 0x0f;
P3 = 0xf0;P42 = 1;P44 = 1;
if(P34 == 0) key2 = 0xe0;
if(P35 == 0) key2 = 0xd0;
if(P42 == 0) key2 = 0xb0;
if(P44 == 0) key2 = 0x70;
if((P34 == 1)&(P35 == 1)&(P42 == 1)&(P44 == 1))key2 = 0xf0;
key_temp = key1|key2;
switch(key_state)
{
case key_state_0:if(key_temp != no_key) key_state = key_state_1;break;
case key_state_1:
if(key_temp != no_key)
{
key_state = key_state_2;
switch(key_temp)
{
case 0x7b: key_return = 5;
{s5++; if(s5 == 3) s5 = 0;}
break;
case 0x77: key_return = 4;s4=~s4;s5 = 0;
break;
case 0xbb: key_return = 9;
if(s4 == 1)
{
if(s5 == 0){h_num++;if(h_num == 24)h_num = 0;}
if(s5 == 1){temp_num++;if(temp_num == 100)temp_num = 0;}
if(s5 == 2){led_num++;if(led_num == 9) led_num = 4;}
}
break;
case 0xb7: key_return = 8;
if(s4 == 1)
{
if(s5 == 0){h_num--;if(h_num == -1)h_num = 23;}
if(s5 == 1){temp_num--;if(temp_num == -1)temp_num = 99;}
if(s5 == 2){led_num--;if(led_num == 3) led_num = 8;}
}
break;
}
}
else {key_state = key_state_0;}
break;
case key_state_2:
if(key_temp == no_key)
{
key_state = key_state_0;
}
break;
}
return key_return;
}
main.h
#ifndef _MAIN_H
#define _MAIN_H
#include "common.h"
#include "smg.h"
#include "ds1302.h"
#include "onewire.h"
#include "iic.h"
#define key_state_0 0
#define key_state_1 1
#define key_state_2 2
#define no_key 0xff
extern uchar h,m,s;
#endif
代码完整版
链接:https://pan.baidu.com/s/1mxq-nX5RLpP0hFpdxpSTZA
提取码:bjgd
复制这段内容后打开百度网盘手机App,操作更方便哦
小结
在按键处理时key1和key2我给搞混了,找了好久错误,十一届决赛不难,主要是是led处理麻烦,第一个led要求不知道实现没有因为时间关系。本程序是状态机按键写的可以看看哦,挺好用。