考点串写(六) 十一届省赛第一场

#include "init.h"
#include "timer.h"
#include "led.h"
#include "key.h"
#include "seg.h"
#include "iic.h"
#include "stdio.h"

unsigned char ucLed[8]={0,0,0,0,0,0,0,0};
unsigned char seg_string[10],seg_buf[8];
unsigned char pos=0;
unsigned char Key_Val,Key_Down,Key_Up,Key_Old;
unsigned char Key_Slow;
unsigned int Seg_Slow;

void Led_Proc();
void Key_Proc();
void Seg_Proc();

unsigned char Seg_Disp_Mode;
unsigned char counter=0;

float advolt;
float advolt_param=0.0;
unsigned char advolt_save;


long led_ms;
long t_ms;
unsigned char key_error=0;

bit L1_flag=0;
bit L3_flag=0;
bit over_flag=0;
bit down_flag=0;


void main(void)
{
	All_Init();
	Timer5Init();
	EEPROM_Read(&advolt_save,0,1);
	advolt_param=(advolt_save/10)+(advolt_save%10)*0.1;
	
	while(1)
	{
		Led_Proc();
		Seg_Proc();
		Key_Proc();
	}
}


void t2int() interrupt 12
{
	t_ms++;
	
	if(++Seg_Slow==100) Seg_Slow=0;
	if(++Key_Slow==10) Key_Slow=0;
	
	Seg_Disp(seg_buf,pos);
	if(++pos==8) pos=0;
	Led_Disp(pos,ucLed[pos]);
}

void Key_Proc(void)
{
	if(Key_Slow) return;
	Key_Slow=1;
	
	Key_Val = KBD_Read();
	Key_Down = Key_Val & (Key_Val ^ Key_Old);
	Key_Up = ~Key_Val & (Key_Val ^ Key_Old);
	Key_Old = Key_Val;
	
	switch(Key_Down)
	{
		case 12:
			key_error=0;
			if(++Seg_Disp_Mode==3) Seg_Disp_Mode=0;
			if(Seg_Disp_Mode==2)
			{
				advolt_save=advolt_param*10;
				EEPROM_Write(&advolt_save,0,1);
			}
		break;
			
		case 13:
			if(Seg_Disp_Mode==2) 
			{
				counter=0;
				key_error=0;
			}
		  else key_error++;
		break;
		
		case 16:
			if(Seg_Disp_Mode==1)
			{
				key_error=0;
				advolt_param+=0.5;
				if(advolt_param>5.0) advolt_param=0;
			}
			else key_error++;
		break;
			
		case 17:
			if(Seg_Disp_Mode==1)
			{
				key_error=0;
				advolt_param-=0.5;
				if(advolt_param<0.0) advolt_param=5.0;
			}
			else key_error++;
		break;
		
		case 0:  //啥也没按下的时候,不给key_error造成影响,不然L3一直亮
		break;  
		
		default: key_error++; //除此之外,随便按下啥,都加,所以底层需要都写上
	}
}

void Seg_Proc(void)
{
	
	if(Seg_Slow) return;
	Seg_Slow=1;
	
	//需要实时读取
	if((AD_Read(0x43)/51.0)>advolt_param)
	{
		over_flag=1;
	}
	if(((AD_Read(0x43)/51.0)<advolt_param)&&over_flag==1)
	{
		down_flag=1;
	}
	if(over_flag&&down_flag)
	{
		over_flag=down_flag=0;
		counter++;
	}
	

	switch(Seg_Disp_Mode)
	{
		case 0:
			sprintf(seg_string,"U    %3.2f",AD_Read(0x43)/51.0);
		break;
		
		case 1:
			sprintf(seg_string,"P    %3.2f",advolt_param);
		break;
		
		case 2:
			sprintf(seg_string,"N%7d",(unsigned int)counter);
		break;
	}
	
	Seg_Trans(seg_buf,seg_string);
}

void Led_Proc(void)
{
	//Led灯是由按键带动的
	if(Key_Slow)return;
   Key_Slow = 1;
	
	
	advolt = AD_Read(0x43)/51.0;
	
	//两个判断块
	if((advolt<advolt_param)&&(led_ms==0))
	{
		led_ms=t_ms;
	}
	if((advolt<advolt_param)&&((t_ms-led_ms)>5000))
	{
		L1_flag=1;
	}
	if(advolt>advolt_param)
	{
		led_ms=0;
		L1_flag=0;
	}
	
	if(key_error>=3)
	{
		L3_flag=1;
	}
	else L3_flag=0;
	
	ucLed[0]=L1_flag;
	ucLed[1]=(counter%2);
	ucLed[2]=L3_flag;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值