蓝桥杯第十四届省赛代码参考

#include "STC15F2K60S2.h"

#include "Init.h"

#include "Seg.h"

#include "Key.h"

#include "Led.h"

#include "iic.h"

#include "ds1302.h"

unsigned char Seg_Slow_Down;

unsigned char Key_Slow_Down;

unsigned char Key_Val,Key_Old,Key_Down,Key_Up;

unsigned char Seg_Pos;

unsigned char Seg_Buf8={10,10,10,10,10,10,10,10};

unsigned char Seg_Point8 ={0,0,0,0,0,0,0,0};

unsigned char ucLed8 = {0,0,0,0,0,0,0,0};

unsigned int Timer1s;

unsigned int Freq;

float temp;

unsigned char Seg_Disp_Mode;//0-频率 1-参数 2-时间 3-回显

unsigned char Param_Mode;

int Param_Max =2000;

int Param_Disp=200;

int Param_Ctrol=200;

unsigned char ucRtc3 ={0x20,0x23,0x22};

unsigned int Freq_Max =0;

unsigned char ucRtc_Max\[\] = {0x00,0x00,0x00};

unsigned char Choice_Index;

unsigned char Timer_200ms;

bit Star_Flag;

float Vol;

void Key_Proc()

{

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 4:

if(++Seg_Disp_Mode==4) Seg_Disp_Mode =0;

if(Seg_Disp_Mode == 2) Param_Mode=0;

if(Seg_Disp_Mode==0) Choice_Index=0;

break;

case 5:

if(Seg_Disp_Mode == 1)

{

if(++Param_Mode == 2) Param_Mode=0;

}

else if(Seg_Disp_Mode==3)

{

if(++Choice_Index == 2) Choice_Index=0;

}

break;

case 8: // 加法操作按键

if(Seg_Disp_Mode ==1)

{

if(Param_Mode == 0)

{ if(Param_Max<9000&&Param_Max>-9000)

Param_Max +=1000;

}

else

{

Param_Disp +=100;

Param_Ctrol =Param_Disp;

}

}

break;

case 9: // 减法操作按键

if(Seg_Disp_Mode ==1)

{

if(Param_Mode == 0)

{ if(Param_Max<9000&&Param_Max>-9000)

Param_Max -=1000;

}

else

{if(Param_Disp<900&&Param_Disp>-900)

Param_Disp -=100;

Param_Ctrol =Param_Disp;

}

}

break;

}

}

void Seg_Proc()

{

unsigned char i=0;

if(Seg_Slow_Down)return;

Seg_Slow_Down = 1;

Read_Rtc(ucRtc);

temp =AD_Read(0x03) /51.0;

DA_Write(Vol);

if(Freq_Max<=Freq)

{

Freq_Max = Freq;

for(i=0;i<3;i++){

ucRtc_Maxi =ucRtci;

}

}

switch (Seg_Disp_Mode)

{

case 0:

for(i=0;i<8;i++)

{

Seg_Bufi =10;

Seg_Pointi=0;

}

if(Freq<0) {Seg_Buf6 = Seg_Buf7 = 20;

}

else{

Seg_Buf0 =16;

Seg_Buf3 =Freq>10000?Freq/10000%10:10;

Seg_Buf4 = Freq/1000%10;

Seg_Buf5 =Freq/100%10;

Seg_Buf6 =Freq/10%10;

Seg_Buf7 =Freq%10;}

break;

case 1:

for(i=0;i<8;i++)

{

Seg_Bufi =10;

Seg_Pointi=0;

}

Seg_Buf0 = 17;

Seg_Buf1 = Param_Mode+1;

switch(Param_Mode){

case 0:

if(Param_Max>0){

Seg_Buf4 =Param_Max/1000%10;

Seg_Buf5 =Param_Max/100%10;

Seg_Buf6 =Param_Max/10%10;

Seg_Buf7 =Param_Max%10;}

if(Param_Max<0){

Seg_Buf3 =18;

Seg_Buf4 =-Param_Max/1000%10;

Seg_Buf5 =-Param_Max/100%10;

Seg_Buf6 =-Param_Max/10%10;

Seg_Buf7 =-Param_Max%10;

}

if(Param_Max==0) Seg_Buf7 = 0;

break;

case 1:

if(Param_Disp>0){

Seg_Buf5 =Param_Disp/100%10;

Seg_Buf6 =Param_Disp/10%10;

Seg_Buf7 =Param_Disp%10;

}

else if(Param_Disp==0) Seg_Buf7 =0;

else if(Param_Disp<0){

Seg_Buf4 =18;

Seg_Buf5 =-Param_Disp/100%10;

Seg_Buf6 =-Param_Disp/10%10;

Seg_Buf7 =-Param_Disp%10;

}

break;

}

break;

case 2:

for(i=0;i<8;i++)

{

Seg_Bufi =10;

Seg_Pointi=0;

}

Seg_Buf2 =Seg_Buf5 = 18;

for(i=0;i<3;i++)

{

Seg_Buf3\*i =ucRtci/16%10;

Seg_Buf3\*i+1 =ucRtci%16;

}

break;

case 3:

if(Choice_Index ==0){

for(i=0;i<8;i++)

{

Seg_Bufi =10;

Seg_Pointi=0;

}

Seg_Buf0 =19;

Seg_Buf1 =16;

Seg_Buf3 =Freq_Max>10000?Freq_Max/10000%10:10;

Seg_Buf4 = Freq_Max/1000%10;

Seg_Buf5 =Freq_Max/100%10;

Seg_Buf6 =Freq_Max/10%10;

Seg_Buf7 =Freq_Max%10;}

else if(Choice_Index == 1)

{

for(i=0;i<8;i++)

{

Seg_Bufi =10;

Seg_Pointi=0;

}

Seg_Buf0 =19;

Seg_Buf1 =14;

for(i=1;i<4;i++)

{

Seg_Buf2\*i =ucRtc_Maxi-1/16%10;

Seg_Buf2\*i+1 = ucRtc_Maxi-1%16;

}

}

break;

}

}

void Led_Proc()

{

if(Freq<500) Vol =1.0;

else if(Freq>Param_Max) Vol =5.0;

else if(Freq<Param_Max&&Freq>500)

Vol = (Freq-500)*4/(Param_Max-500)+1;

if(Seg_Disp_Mode==0)

ucLed0 = Star_Flag?1:0;

if(Freq>Param_Max)

ucLed1 =Star_Flag?1:0;

if(Freq<0) ucLed1 =1;

}

void Timer0_Init(void) //1毫秒@12.000MHz

{

AUXR &= 0x7F; //定时器时钟12T模式

TMOD &= 0xF0; //设置定时器模式

TMOD |=0x05;

TL0 = 0; //设置定时初始值

TH0 = 0; //设置定时初始值

TF0 = 0; //清除TF0标志

TR0 = 1; //定时器0开始计时

}

void Timer1_Init(void) //1毫秒@12.000MHz

{

AUXR &= 0xBF; //定时器时钟12T模式

TMOD &= 0x0F; //设置定时器模式

TL1 = 0x18; //设置定时初始值

TH1 = 0xFC; //设置定时初始值

TF1 = 0; //清除TF1标志

TR1 = 1; //定时器1开始计时

ET1 =1;

EA =1;

}

void Timer1_Server() interrupt 3

{

if(++Key_Slow_Down == 20) Key_Slow_Down =0;

if(++Seg_Slow_Down == 500) Seg_Slow_Down =0;

if(++Seg_Pos == 8) Seg_Pos=0;

Seg_Disp(Seg_Pos,Seg_BufSeg_Pos,Seg_PointSeg_Pos);

Led_Disp(Seg_Pos,ucLedSeg_Pos);

if(++Timer1s ==1000)

{

Timer1s =0;

Freq =TH0<<8|TL0;

Freq +=Param_Ctrol;

TH0 =TL0 =0;

}

if(++Timer_200ms == 200)

{

Timer_200ms =0;

Star_Flag ^=1;

}

}

void main()

{

Set_Rtc(ucRtc);

System_Init();

Timer0_Init();

Timer1_Init();

while(1)

{

Key_Proc();

Seg_Proc();

Led_Proc();

}

}

相关推荐
Ronin-Lotus1 小时前
蓝桥杯篇---EEPROM内部存储地址
职场和发展·蓝桥杯·c·eeprom·keil
计算机小白一个1 小时前
蓝桥杯 Java B 组之哈希表应用(两数之和、重复元素判断)
java·数据结构·算法·蓝桥杯
万物皆智能2 小时前
AI合规面试:AI合规常见面试题与答题思路
人工智能·面试·职场和发展
Forever Nore4 小时前
LeetCode 1 两数之和
算法·leetcode·职场和发展
星轨初途14 小时前
LeetCode 热题 100——day6 三数之和
数据结构·c++·算法·leetcode·职场和发展
鹿角片ljp14 小时前
LeetCode 53. 最大子数组和
算法·leetcode·职场和发展
城管不管1 天前
第六次面试2026.8.5北京一面已OC
面试·职场和发展
无bug代码搬运工1 天前
LeetCode 42 接雨水:双指针解法详解
算法·leetcode·职场和发展