先上完整代码文件(自己写的,如果不足请评论区指教)
链接:https://pan.baidu.com/s/1_mdV1GQSQFg86EAKvMGnEQ
提取码:ag6i
1、题目要求
题目有点长,越长反而要求说的越明确,不怕代码不会写,就怕要求读不懂
2、主函数
#include<iic.h>
#include<smg.h>
#include<config.h>
u8 key,key_flag,dis=1;
u8 buf[9],duanma[8],i;
u8 led=0xff;
u32 k;
void Count0Init() //定时器0计数模式初始化,计数脉冲引脚P3.4
{
TMOD = TMOD|0x05;//计数器模式工作方式1,TL0作为低八位,TH0作为高八位
TL0 = 0;
TH0 = 0;
TF0 = 0;
TR0 = 1;
ET0 = 1;
EA = 1;
}
void Timer1Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x40; //定时器时钟1T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0xCD; //设置定时初值
TH1 = 0xD4; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
EA = 1;
ET1 = 1;
}
void close()
{
P2 = (P2&0X1F)|0X80;
P0 = 0xff;
P2 = (P2&0X1F)|0XA0;
P0 = 0x00;
P2 &= 0X1F;
}
void LED(u8 i)
{
P2 = (P2&0X1F)|0X80;
P0 = i;
P2 &= 0X1F;
}
u8 readkey()
{
static u8 key_count,key_return;
u8 key_press;
static bit key_flag=0;
key_press = P3&0x0f;
if(key_press!=0x0f)key_count++;
else key_count=0;
if(key_count==2)
{
key_count=0;
key_flag=1;
switch(key_press)
{
case 0x0e:key_return=7;break;
case 0x0d:key_return=6;break;
case 0x0b:key_return=5;break;
case 0x07:key_return=4;break;
}
}
if(key_press==0x0f&&key_flag==1)
{
key_flag=0;
return key_return;
}
return 0;
}
void main()
{
float temp;
u8 L1,L3,L4,L5;
bit mode,dis_flag=0,DC_flag=1,LED_flag=1;
Timer1Init();close();
Count0Init();
while(1)
{
//按键扫描处理
if(key_flag==1)
{
key_flag=0;
temp=read_rb(3)/51.0;
key=readkey();
if(key!=0)
{
switch(key)
{
case 7: dis_flag=~dis_flag;break;
case 6: LED_flag=~LED_flag;break;
case 5: DC_flag=~DC_flag;break;
//“显示界面切换”按键,按下 S4 按键,切换选择频率显示界面和电压显示界面
case 4: mode=~mode;break;
}
}
}
if(DC_flag)
{write_DAC(102);}
else{write_DAC(temp*51);}
//led处理
if(LED_flag)
{
if(dis_flag)L1 = 0xfe;else L1 = 0xfd;
if(temp<=1.5)L3=0XFF;else if(temp<2.5)L3=0xfb;else if(temp<3.5)L3=0XFF;else L3=0xfb;
if(k<1000)L4=0xff;else if(k<5000)L4 =0XF7;else if(k<10000)L4 =0xff;else L4 = 0xf7;
if(DC_flag)L5=0xff;else L5=0xef;
led=L1&L3&L4&L5;
}else led=0xff;
LED(led);
if(dis==1)
{
dis=0;
//数码管显示
if(dis_flag)
{
if(mode==0){sprintf(buf,"U%8.2f",temp);}
else{sprintf(buf,"F%7ld",k);}
}
else sprintf(buf," ");
conversion(&buf,&duanma);
}
}
}
void Timer1() interrupt 3
{
static u8 m;
static u16 n;
if(++m==10){key_flag=1;m=0;}
if(++i==8){i=0;}display(i,&duanma);
if(++n%500==0)
{
dis=1;
}
//每一秒更新一次频率
if(n==1000)
{
k=TH0*256+TL0;
TH0=0;TL0=0;
n=0;
}
}