- //ICC-AVR application builder : 2/13 20:52:33
- /*******************************************************************************
- * 版权:
- *
- * 单片机: ATMAGE16L
- * 晶振: 外部8MHz
- * 编译器: ICC 7.22
- *
- * 文件名: main.c
- * 作者: 木子工作室
- * 版本: 1.0
- * 完成日期:
- * 功能描述: 在12M晶振下,实现时间和温度的循环显示
- *******************************************************************************/
- //#include
- #include
- #include
- #define LED0 PORTD
- #define LED1 PORTB
- #define BEEL_OFF PORTC |= BIT(0);
- #define BEEL_ON PORTC &= ~BIT(0);
- unsigned char i=0,f=0,n=0,xx=0,fangduan=0,ADC_LL=0,ADC_HH=0;
- unsigned int x = 0,t=0,t1=0,s0=0,s1=0,m0=0,m1=0,h0=0,h1=0,s=0,h=8,m=15,mid=0,a=0,g=240,b=180,c,d,e,o=1,p,q,r,T,ADC_H=0;
- unsigned char tab[16] = {0X3f,0X06,0X5b,0X4f,0X66,0X6d,0X7d,0X07,0X7f,0X6f,0X77,0X7c,0X39,0X5e,0X79,0X71};//正常字模
- unsigned char tab1[10] = {0Xbf,0X86,0Xdb,0Xcf,0Xe6,0Xed,0Xfd,0X87,0Xff,0Xef};//带下小数点字模
- unsigned char tab2[2] = {0X61,0X40};//度C,"-"号
- unsigned int CBM[130] = {19,33,38,44,56,59,61,63,65,67,69,71,73,76,78,81,83,86,89,92,94,98,101,104,108,111,115,119,123,127,131,135,140,145,149,154,160,165,171,176,182,188,194,200,207,214,220,228,235,243,250,258,267,275,284,293,302,311,321,331,341,351,361,372,382,393,405,416,428,439,451,463,475,487,500,512,525,537,550,562,576,588,601,613,626,638,645,651,657,663,675,688,699,711,723,734,746,757,768,779,789,799,809,818,828,837,846,855,863,871,878,886,893,900,907,913,919,925,931,936,941,946,951,952,959,963,967,970,980,990};
- unsigned int CBT[130] = {1190,995,950,900,820,800,790,780,770,760,750,740,730,720,710,700,690,680,670,660,650,640,630,620,610,600,590,580,570,560,550,540,530,519,511,501,490,481,470,460,450,440,430,420,410,400,391,380,371,360,351,341,330,320,310,300,290,281,270,260,250,240,230,220,210,200,190,180,170,160,150,140,130,120,110,100,90,80,70,60,50,40,30,20,10,0,2005,2010,2015,2020,2030,2040,2050,2060,2070,2080,2090,2100,2110,2120,2130,2140,2150,2160,2170,2180,2190,2200,2210,2220,2230,2240,2250,2260,2270,2280,2290,2300,2310,2320,2330,2340,2350,2360,2370,2380,2390,2400,2450,2460};
- /*******************************************************************************
- * 函数名称: WDCB()
- * 入口参数:
- * 出口参数:
- * 功能描述: 温度查表
- *******************************************************************************/
- int WDCB() //用int 类型的函数是想让return命令生效!使一旦查到结果就跳出FOR,节省CPU资源。
- {
- for(c=0;c<129;c++)
- {
- if(CBM[c]==ADC_H)
- {
- d=c;
- T=CBT[d];
- if(T>2000)
- {
- f=1;
- T=(T-2000)/10;
- }
- return ;//使一旦查到结果就跳出FOR,节省CPU资源。
- }
- if(c<=84 & ADC_H>CBM[c] & ADC_H {
- T=CBT[c]-((ADC_H-CBM[c])*((CBT[c]-CBT[c+1])*10/(CBM[c+1]-CBM[c])))/10; //按照CBM[]和CBT[]的区间比例关系折算实际温度,可大幅降低数组容量又不失精确。
- f=0; //判断正负温度
- return ;//用int 类型的函数是想让return命令生效!使一旦查到结果就跳出FOR,节省CPU资源。
- }
- if(c>=85 & ADC_H>CBM[c] & ADC_H {
- T=((CBT[c]+((ADC_H-CBM[c])*((CBT[c+1]-CBT[c])*10/(CBM[c+1]-CBM[c])))/10)-2000)/10; //按照CBM[]和CBT[]的区间比例关系折算实际温度,可大幅降低数组容量又不失精确。
- f=1; //判断正负温度
- return ;//使一旦查到结果就跳出FOR,节省CPU资源。return后面加不加T,好像对返回T值没啥影响。
- }
- }
- }
- /*******************************************************************************
- * 函数名称: Disp_Time()
- * 入口参数:
- * 出口参数:
- * 功能描述: 显示时间
- *******************************************************************************/
- void Disp_Time(void)
- {
- //BEEL_ON;
- for(i=0;i<4;i++)
- {
- PORTD = 0X1F;
- if(xx==1)
- {q=a%30;} //设置闪烁周期
- if(xx==2)
- {r=a%30;}//设置闪烁周期
- if(i==0)
- {
- LED1 = tab[m0];
- if(q<15 | o==0)//q设置亮屏时长,o是按键之后一小段时间内,并上o的条件是让校时操作别闪炼太快。
- {PORTD&= ~BIT(3);}
- else
- {PORTD|= BIT(3);} //黑屏
- }
- if(i==1)
- {
- LED1 = tab[m1];
- PORTD|= BIT(4);//B端口4位置1, ":"号
- if(q<15 | o==0)//q设置亮屏时长,o是按键之后一小段时间内,并上o的条件是让校时操作别闪炼太快。
- {PORTD&= ~BIT(2);}
- else
- {PORTD|= BIT(2);}
- }
- if(i==2)
- {
- LED1 = tab[h0];
- if(r<15 | o==0)//q设置亮屏时长,o是按键之后一小段时间内,并上o的条件是让校时操作别闪炼太快。
- {PORTD&= ~BIT(1);}
- else
- {PORTD|= BIT(1);}
- }
- if(i==3)
- {
- LED1 = tab[h1];
- if(r<15 | o==0)//q设置亮屏时长,o是按键之后一小段时间内,并上o的条件是让校时操作别闪炼太快。
- {PORTD&= ~BIT(0);}
- else
- {PORTD|= BIT(0);}
- }
- delay_ms(60);
- PORTB = 0X00;
- }//FOR尾
- }
- /*******************************************************************************
- * 函数名称: Disp_Wd()
- * 入口参数:
- * 出口参数:
- * 功能描述: 显示温度
- *******************************************************************************/
- void Disp_Wd(void)
- {
- //BEEL_OFF;
- if(f==0) //显示正温度
- {
- for(i=0;i<4;i++)
- {
- //PORTB = 0X00;
- if(i==0)
- {
- LED1 = tab2[0];
- PORTD&= ~BIT(3);
- }
- if(i==1)
- {
- LED1 = tab[m0];
- PORTD&= ~BIT(2);
- }
- if(i==2)
- {
- LED1 = tab1[m1];
- PORTD&= ~BIT(1);
- }
- if(i==3)
- {
- LED1 = tab[h0];
- PORTD&= ~BIT(0);
- }
- PORTD|= BIT(5);//B端口5位置1, "上点"号
- delay_ms(60);
- PORTD = 0X0F;
- }
- }
- else //显示负温度
- {
- for(i=0;i<4;i++)
- {
- //PORTB = 0X0F;
- //PORTB = 0X00;
- if(i==0)
- {
- LED1 = tab2[0];
- PORTD&= ~BIT(3);
- }
- if(i==1)
- {
- LED1 = tab[m0];
- PORTD&= ~BIT(2);
- }
- if(i==2)
- {
- LED1 = tab[m1];
- PORTD&= ~BIT(1);
- }
- if(i==3)
- {
- LED1 = tab2[1];
- PORTD&= ~BIT(0);
- }
- PORTD|= BIT(5);//B端口5位置1, "上点"号
- delay_ms(60);
- PORTD = 0X0F;
- }
- }
- }
|