51_LanQiaoBei/题目/真题/11 第十一届省赛_左岚/第一套/第十一届省赛1/User/main.c
2025-04-13 01:02:19 +08:00

193 lines
4.0 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "main.h"
/* 变量声明区 */
uchar Key_Slow_Down; // 按键减速专用变量
uchar Seg_Buf[8] = {10, 10, 10, 10, 10, 10, 10, 10}; // 数码管显示数据存放数组
uchar Seg_Point[8] = {0, 0, 0, 0, 0, 0, 0, 0}; // 数码管小数点数据存放数组
uchar Seg_Pos; // 数码管扫描专用变量
uint Seg_Slow_Down; // 数码管减速专用变量
uchar ucLed[8] = {0, 0, 0, 0, 0, 0, 0, 0}; // Led显示数据存放数组
/* 数据显示 */
uchar Seg_show_mode; // 0数据 1参数 2计数
uint old_vol; // 上一次的电压值
uchar vol_demo; // 参考电压0-50
unsigned long count_down; // 下降沿计数
bit count_down_flag; // 下降沿计数标志位
/* 时间 */
uint time_5s;
uchar error_count;
/* 键盘处理函数 */
void Key_Proc()
{
static uchar Key_Val, Key_Down, Key_Old, Key_Up; // 按键专用变量
if (Key_Slow_Down)
return;
Key_Slow_Down = 1; // 键盘减速程序
Key_Val = Key_Read(); // 实时读取键码值
Key_Down = Key_Val & (Key_Old ^ Key_Val); // 捕捉按键下降沿
Key_Up = ~Key_Val & (Key_Old ^ Key_Val); // 捕捉按键上降沿
Key_Old = Key_Val; // 辅助扫描变量
switch (Key_Down)
{
case 12:
if (Seg_show_mode == 0)
{
EEPROM_Write(&vol_demo, 0, 1);
}
Seg_show_mode = (++Seg_show_mode) % 3;
error_count = 0;
break;
case 16:
if (Seg_show_mode == 1)
vol_demo = (vol_demo + 5 > 50 ? 0 : vol_demo + 5);
error_count = 0;
break;
case 17:
if (Seg_show_mode == 1)
vol_demo = (vol_demo - 5 < 0 ? 50 : vol_demo - 5);
error_count = 0;
break;
case 13:
if (Seg_show_mode == 2)
count_down = 0;
error_count = 0;
break;
case 0:
// 空载用于防止down默认的0造成影响
break;
default:
error_count = (++error_count >= 3) ? 3 : error_count;
break;
}
}
/* 信息处理函数 */
void Seg_Proc()
{
uint real_V;
if (Seg_Slow_Down)
return;
Seg_Slow_Down = 1; // 数码管减速程序
switch (Seg_show_mode)
{
case 0:
/* 数据显示 */
Seg_Buf[0] = 11; // U
real_V = Ad_Read(0x03) * 100 / 51; // 0-255->0-500
// 当检测到下降沿的时候计数+1
if (old_vol > vol_demo * 10 && real_V < vol_demo * 10)
count_down++;
if (real_V < vol_demo * 10)
count_down_flag = 1;
else
count_down_flag = 0;
old_vol = real_V;
Seg_Buf[5] = real_V / 100 % 10; // 百位
Seg_Buf[6] = real_V % 100 / 10; // 十位
Seg_Buf[7] = real_V % 10; // 个位
Seg_Point[5] = 1;
break;
case 1:
/*参数设置*/
Seg_Buf[0] = 12; // P
Seg_Buf[5] = vol_demo / 100 % 10; // 百位
Seg_Buf[6] = vol_demo / 10 % 10; // 十位
Seg_Buf[7] = vol_demo % 10; // 个位
Seg_Point[5] = 1;
break;
case 2:
/*计数界面*/
Seg_Buf[0] = 13; // N
Seg_Buf[1] = count_down / 10000000 % 10;
Seg_Buf[2] = count_down / 1000000 % 10;
Seg_Buf[3] = count_down / 100000 % 10;
Seg_Buf[4] = count_down / 10000 % 10;
Seg_Buf[5] = count_down / 1000 % 10;
Seg_Buf[6] = count_down / 100 % 10;
Seg_Buf[7] = count_down % 10;
break;
}
}
/* 其他显示函数 */
void Led_Proc()
{
ucLed[0] = (time_5s >= 5000);
ucLed[1] = (count_down % 2);
ucLed[2] = (error_count >= 3);
}
/* 定时器0中断初始化函数 */
void Timer0Init(void) // 1毫秒@12.000MHz
{
AUXR &= 0x7F; // 定时器时钟12T模式
TMOD &= 0xF0; // 设置定时器模式
TL0 = 0x18; // 设置定时初始值
TH0 = 0xFC; // 设置定时初始值
TF0 = 0; // 清除TF0标志
TR0 = 1; // 定时器0开始计时
ET0 = 1; // 定时器中断0打开
EA = 1; // 总中断打开
}
/* 定时器0中断服务函数 */
void Timer0Server() interrupt 1
{
if (++Key_Slow_Down == 10)
Key_Slow_Down = 0; // 键盘减速专用
if (++Seg_Slow_Down == 500)
Seg_Slow_Down = 0; // 数码管减速专用
if (++Seg_Pos == 8)
Seg_Pos = 0; // 数码管显示专用
if (count_down_flag)
{
if (++time_5s >= 5000)
time_5s = 5000;
}
else
time_5s = 0;
Seg_Disp(Seg_Pos, Seg_Buf[Seg_Pos], Seg_Point[Seg_Pos]);
Led_Disp(Seg_Pos, ucLed[Seg_Pos]);
}
void Delay750ms() //@12MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 35;
j = 51;
k = 182;
do
{
do
{
while (--k)
;
} while (--j);
} while (--i);
}
/* Main */
void main()
{
// 如果有温度读取的话
rd_temperature();
Delay750ms();
System_Init();
Timer0Init();
EEPROM_Read(&vol_demo, 0, 1);
while (1)
{
Key_Proc();
Seg_Proc();
Led_Proc();
}
}