首先是,对于越界问题,在定义时int型搞成了char型以至于越界,问题出现在,DA转换
对于题目最后出现的LED,一开始搞在了按键,出现的问题是,只有按住才会亮,最后放在数码管位置,问题解决。
对于键盘这部分,仁者见仁智者见智,问题出现在不大。
对于键盘加减这部分,一开始想着在定义一个,后来发现完全没必要,在界面切换部分,使用mode,完全没必要在定义一个。
十二届里面最考验人的,莫过于模式二部分,想了好久,后来参考小蜜蜂代码,详情请浏览WWW.XMF393.com (真心牛的老师)
IIc以及onewier下载在蓝桥杯官网,改动部分,这里就不在赘述了。
接下来,看代码:
<乱码部分,是编辑器之间转换问题,不影响程序运行>
<因为作者英语不是很好,部分函数名是拼音首字母/🤦>
#include "stc15f2k60s2.h"
#include "iic.h"
#include "onewire.h"
sbit R1=P3^2;
sbit R2=P3^3;
sbit C1=P4^4;
sbit C2=P4^2;
#define TSMG 500
unsigned char code SMG_NODOT[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char code SMG_DOT[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
float temp_ds18b20=0;
unsigned char mode=0;
unsigned int smg_ds18b20=0;
unsigned int param=25;//²ÎÊýÉèÖÃ
unsigned char ms=1;
unsigned int adc_val=0;//===============>>
unsigned char star_led=0xff;
//======================Ëø´æÆ÷Ñ¡Ôñ======================================
void Service_HC573(unsigned char channel,unsigned char val)
{
P2=(P2&0x1f)|0x00;
P0=val;
switch(channel)
{
case 4:
P2=(P2&0x1f)|0x80;
break;
case 5:
P2=(P2&0x1f)|0xa0;
break;
case 6:
P2=(P2&0x1f)|0xc0;
break;
case 7:
P2=(P2&0x1f)|0xe0;
break;
}
}
//==========================ÊýÂë¹ÜÏÔʾ================================
void DelaySMG(unsigned int t)
{
while(t--);
}
void DisplaySMG_Bit(unsigned char pos,unsigned char val)
{
Service_HC573(6,0x01<<pos);
Service_HC573(7,val);
DelaySMG(TSMG);
Service_HC573(6,0x01<<pos);
Service_HC573(7,0xff);
}
void DisplaySMG_All(unsigned char val)
{
Service_HC573(6,0xff);
Service_HC573(7,val);
}
void DisplaySMG()
{
switch(mode)
{
case 0:
Service_HC573(4,(star_led|0xfe)&0xfd);
smg_ds18b20=temp_ds18b20*100;
DisplaySMG_Bit(7,SMG_NODOT[smg_ds18b20%10]);
DisplaySMG_Bit(6,SMG_NODOT[(smg_ds18b20/10)%10]);
DisplaySMG_Bit(5,SMG_DOT[(smg_ds18b20/100)%10]);
DisplaySMG_Bit(4,SMG_NODOT[smg_ds18b20/1000]);
DisplaySMG_Bit(0,0xc6);
break;
case 1:
Service_HC573(4,(star_led|0xfe)&0xfb);
DisplaySMG_Bit(7,SMG_NODOT[param%10]);
DisplaySMG_Bit(6,SMG_NODOT[param/10]);
DisplaySMG_Bit(0,0x8c);
break;
case 2:
Service_HC573(4,(star_led|0xfe)&0xf7);
DisplaySMG_Bit(7,SMG_NODOT[adc_val%10]);
DisplaySMG_Bit(6,SMG_NODOT[(adc_val/10)%10]);
DisplaySMG_Bit(5,SMG_DOT[adc_val/100]);
DisplaySMG_Bit(0,0x88);
break;
}
}
//=====================DS18B20==========
void Init_DS18B20_temp()
{
unsigned char LSB,MSB;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
do{
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
LSB=Read_DS18B20();
MSB=Read_DS18B20();
MSB=(MSB<<4)|(LSB>>4);
}while(MSB==85);
}
void Read_DS18B20_temp()
{
unsigned char LSB,MSB;
unsigned int temp=0;
init_ds18b20();
DisplaySMG();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
DisplaySMG();
init_ds18b20();
DisplaySMG();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
LSB=Read_DS18B20();
MSB=Read_DS18B20();
temp=MSB;
temp=(temp<<8)|LSB;
if((temp&0xf800)==0x0000)
{
temp_ds18b20=temp*0.0625;
}
DisplaySMG();
}
//=================Ä£ÄâÁ¿Êä³ö====================
void Set_PCF8591_DAC(unsigned char dat)
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x40);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
//==================ģʽÅжÏ=====================
void MSpd()
{
unsigned char adc_vol=0;
Read_DS18B20_temp();
switch(ms)
{
case 1:
if(smg_ds18b20<(param*100))
{
adc_val=0;
}
if(smg_ds18b20>(param*100))
{
adc_val=500;
}
star_led=star_led&~0x01;
Service_HC573(4,star_led);//==============>>
break;
case 2:
if(smg_ds18b20<2000)
{
adc_val=100;
}
if(smg_ds18b20>4000)
{
adc_val=400;
}
if((smg_ds18b20>2000)&&(smg_ds18b20<4000))
{
adc_val=15*(smg_ds18b20-2000);
adc_val=(adc_val/100)+100;
}
star_led=0xff;
Service_HC573(4,star_led);
break;
}
adc_vol=adc_val*0.51;
Set_PCF8591_DAC(adc_vol);
}
void Delay(unsigned int t)
{
while(t--);
}
void Scan_keys()
{
R1=1;R2=0;
C1=1;C2=1;
if(C1==0)//S4
{
Delay(500);
if(C1==0)
{
switch(mode)
{
case 0://ζÈ
mode=1;
// Service_HC573(4,star_led&(~0x02));
break;
case 1://²ÎÊý
mode=2;
// Service_HC573(4,star_led&(~0x04));
break;
case 2://DACÊä³ö
mode=0;
// Service_HC573(4,star_led&(~0x08));
break;
}
while(C1==0)
{
if(mode==0)
{
Read_DS18B20_temp();
}
DisplaySMG();
}
}
}
R1=0;R2=1;
if(C1==0)//S5
{
Delay(500);
if(C1==0)
{
switch(ms)
{
case 1:
ms=2;
break;
case 2:
ms=1;
break;
}
while(C1==0)
{
DisplaySMG();
}
}
}
if(C2==0)//S9
{
Delay(500);
if(C2==0)
{
if(mode==1)
{
param=param+1;
}
while(C2==0)
{
DisplaySMG();
}
}
}
R1=1;R2=0;
if(C2==0)
{
Delay(500);
if(C2==0);
{
if(mode==1)
{
param=param-1;
}
while(C2==0)
{
DisplaySMG();
}
}
}
}
//===================³õʼ»¯========
void Init_System()
{
Service_HC573(5,0x00);
Service_HC573(4,0xff);
Init_DS18B20_temp();
}
void main()
{
Init_System();
while(1)
{
MSpd();
Read_DS18B20_temp();
DisplaySMG();
Scan_keys();
}
}