题目捏
main.c
#include "init.h"
#include "led.h"
#include "timer.h"
#include "seg.h"
#include "key.h"
#include "onewire.h"
#include "iic.h"
#include "stdio.h"
unsigned char ucLed; //LED状态存放量
unsigned char led_flag=1;
unsigned char seg_buf[8]; //数码管段码
unsigned char seg_string[9]; //数码管缓冲数组
unsigned char pos=0; //数码管位选
unsigned char Key_Value,Key_Down,Key_Old,Key_Up; //三行按键
unsigned int Seg_Slow,Key_Slow;//按键和数码管延时
void Seg_Proc(void);
void Key_Proc(void);
void Led_Proc(void);
void PCF_Proc(void);
unsigned char Seg_Disp_Mode=0; //模式状态选择
unsigned char AD_Mode=1; //0是0x43,1时0x41 在模式选择时创建一个if判断,为真时0x41,否则为0x43
unsigned int freg,freg_old;
unsigned char ad_1,ad_2,ad_old;
unsigned long t_ms,key_ms;
void main(void)
{
All_Init();
Timer1Init();
Timer0Init();
while(1)
{
Seg_Proc();
Key_Proc();
Led_Proc();
PCF_Proc();
}
}
void tm1_isr() interrupt 3
{
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;
if(t_ms % 1000 == 0)
{
freg = (TH0<<8)|TL0;
TH0 = 0;
TL0 = 0;
}
Led_Disp(ucLed);
}
void Key_Proc(void)
{
if(Key_Slow) return;
Key_Slow=1;
Key_Value = Read_Key_BTN();
Key_Down = Key_Value&(Key_Value^Key_Old);//按下过程中
Key_Up = ~Key_Value&(Key_Value^Key_Old);//抬起过程中
Key_Old = Key_Value; //可以理解这两个是相差10ms的值
if(Key_Down==4)
{
if(++Seg_Disp_Mode==3) Seg_Disp_Mode=0; //在0,1,2中切换
}
if(Seg_Disp_Mode==2) //记住切换的只是显示通道
{
if(Key_Down==5)
{
AD_Mode^=1;
}
}
if(Key_Down==6)
{
ad_old = ad_2;
}
if(Key_Down==7)
{
key_ms=t_ms;
}
if(Key_Up==7)
{
if(t_ms - key_ms >=1000 )
{
led_flag ^= 1;
}
else
{
freg_old=freg;
}
}
}
void Seg_Proc(void)
{
if(Seg_Slow) return;
Seg_Slow=1;
if(Seg_Disp_Mode==0)
{
sprintf(seg_string,"F%7d",freg);
}
else if(Seg_Disp_Mode==1)
{
sprintf(seg_string,"N%7d",((unsigned int)1000000/freg));
}
else if(Seg_Disp_Mode==2)
{
if(AD_Mode) sprintf(seg_string,"U-1 %3.2f",ad_1/51.0);
else sprintf(seg_string,"U-2 %3.2f",ad_2/51.0);
}
Seg_Trans(seg_buf,seg_string);
}
void Led_Proc(void)
{
if(led_flag)
{
if(ad_2 > ad_old) ucLed |= 0x01;
else ucLed &= ~0x01;
if(freg > freg_old) ucLed |=0x20;
else ucLed &= ~0x02;
if(Seg_Disp_Mode==0) ucLed |= 0x04;
else ucLed &= ~0X04;
if(Seg_Disp_Mode==1) ucLed |= 0x08;
else ucLed &= ~0X08;
if(Seg_Disp_Mode==2) ucLed |= 0x10;
else ucLed &= ~0X10;
}
else ucLed = 0;
}
void PCF_Proc(void)
{
if(Seg_Slow) return; //和数码管同时刷新
Seg_Slow=1;
if(AD_Mode)
{
PCF8591_ADC(0x41);
ad_1=PCF8591_ADC(0x41);
}
else
{
PCF8591_ADC(0x43);
ad_2=PCF8591_ADC(0x43);
}
}
计数器1
void Timer0Init(void)
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x05;
TL0 = 0; //设置定时初值
TH0 = 0; //设置定时初值
TR0 = 1; //定时器0开始计时
}