- /*******************************************************************************************************************
- * 程序版本:HT-V1.0
- * 作者:小ARM菜菜
- * 時間:2017年11月8日
- * 功能:打歪子釣鱉!正事我不干!
- * 描述:基于合泰的HT46R66B的測溫,熱敏電阻分壓得到電壓,進入模數轉換后進行查表校正,
- * 采用了溫度點校正,區間采用近似線性法計算,開模液晶LCD顯示!39段
- *
- *******************************************************************************************************************/
- #include "HT46R066B.h"
- #define uint32_t unsigned long
- #define uint8_t unsigned char
- #define uint16_t unsigned int
- #define get_bit(a,b) (a>>b)&1
- #define K1 0x01
- #define K2 0x02
- #define K3 0x04
- #define K4 0x08
- #define GET_K1 _pa1
- #define GET_K2 _pa2
- #define GET_K3 _pa3
- #define GET_K4 _pa4
- void ad_process(uint16_t ad_data,uint16_t *p);//ad數據處理
- void Dispaly_SEGD2( uint8_t number);
- void Dispaly_SEGD1( uint8_t number);
- //按鍵檢測的
- unsigned char Trg;
- unsigned char Cont;
- unsigned char button_data;//
- static uint8_t tick;//計數變量
- uint8_t count_tick; //定時器AD 的
- static uint16_t seg1_display;//COM1的掃描顯存
- static uint16_t seg2_display;//COM2的掃描顯存
- static uint16_t seg3_display;//COM3的掃描顯存
- static uint16_t seg4_display;//COM4的掃描顯存
- uint8_t set_tem;
- void set_bit_16(uint16_t *a,uint8_t b)
- {
- uint8_t *c;
- if(b<=7)
- {
- c=(uint8_t*)a;
- (*c)|=(1<<b);
- }
- else
- {
- c=(uint8_t*)a;
- c++;
- (*c)|=(1<<(b-8));
-
- }
- }
- void clr_bit_16(uint16_t *a,uint8_t b)
- {
- uint8_t *c;
- if(b<=7)
- {
- c=(uint8_t*)a;
- (*c)&=(~(1<<b));
- }
- else
- {
- c=(uint8_t*)a;
- c++;
- (*c)&=(~(1<<(b-8)));
-
- }
- }
- //中斷服務程序入口
- /*
- uint16_t display_ram , 顯存
- uint8_t f,標志位
- uint8_t d,是否是COM1標志
- */
- void display_com(uint16_t display_ram,uint8_t f,uint8_t d)
- {
- //掃描COM1口的所有的SEG
- uint8_t count;
-
- if(f)
- {
- for(count=0;count<10;count++)//掃描9次
- {
-
- switch (count)
- {//
-
- case 0:if(get_bit(display_ram,count)&&d){_pc1=0;}else{_pc1=1;}break;
- case 1:if(get_bit(display_ram,count)){_pc0=0;}else{_pc0=1;}break;
- case 2:if(get_bit(display_ram,count)){_pc7=0;}else{_pc7=1;}break;
- case 3:if(get_bit(display_ram,count)){_pc6=0;}else{_pc6=1;}break;
- case 4:if(get_bit(display_ram,count)){_pb4=0;}else{_pb4=1;}break;
- case 5:if(get_bit(display_ram,count)){_pb5=0;}else{_pb5=1;}break;
- case 6:if(get_bit(display_ram,count)){_pc2=0;}else{_pc2=1;}break;
- case 7:if(get_bit(display_ram,count)){_pc3=0;}else{_pc3=1;}break;
- case 8:if(get_bit(display_ram,count)){_pc4=0;}else{_pc4=1;}break;
- case 9:if(get_bit(display_ram,count)){_pc5=0;}else{_pc5=1;}break;
-
-
-
- }
-
-
- }
- }
- else
- {
-
- for(count=0;count<10;count++)//掃描9次
- {
- switch (count)
- {//
- case 0:if(get_bit(display_ram,count)&&d){_pc1=1;}else{_pc1=0;}break;
- case 1:if(get_bit(display_ram,count)){_pc0=1;}else{_pc0=0;}break;
- case 2:if(get_bit(display_ram,count)){_pc7=1;}else{_pc7=0;}break;
- case 3:if(get_bit(display_ram,count)){_pc6=1;}else{_pc6=0;}break;
- case 4:if(get_bit(display_ram,count)){_pb4=1;}else{_pb4=0;}break;
- case 5:if(get_bit(display_ram,count)){_pb5=1;}else{_pb5=0;}break;
- case 6:if(get_bit(display_ram,count)){_pc2=1;}else{_pc2=0;}break;
- case 7:if(get_bit(display_ram,count)){_pc3=1;}else{_pc3=0;}break;
- case 8:if(get_bit(display_ram,count)){_pc4=1;}else{_pc4=0;}break;
- case 9:if(get_bit(display_ram,count)){_pc5=1;}else{_pc5=0;}break;
-
- }
-
-
- }
-
-
-
-
-
- }
-
- }
- #pragma vector ISR_AD @ 0x10//ad轉換
- void ISR_AD(void)
- {
- uint16_t ad_date;
- /*。。。。。熱敏電阻的真值表。。。。。*/
- uint16_t ad_temp_tab[]={
- 1077,1112,1147,1182,1218,1254,1289,1325,1361,1398,1434,1438,1455,1482,1517,
- 1558,1604,1652,1702,1753,1805,1856,1906,1954,2002,2048,2092,2135,2176,2216,
- 2255,2293,2330,2366/*,2410,2436,2470,2504,2537,2570,2603*/};
- ad_date=_adrh;
- ad_date<<=8;
- ad_date+=_adrl;
- ad_date>>=4;
- ad_process(ad_date, ad_temp_tab);//ad數據處理
- _emi=1;
- _ade=1;//開啟AD轉換使能。
-
- }
-
- void KeyRead( void )
- {
- unsigned char ReadData=0;
-
- /*大神級按鍵算法,逆天了!201210月22日,日照,小ARM菜菜*/
- if(! GET_K1)
- {button_data=0xfe;}//生成按鍵值
- else
- if(! GET_K2)
- {button_data=0xfd;}
- else
- if(! GET_K3)
- {button_data=0xfb;}
- else
- if(! GET_K4)
- {button_data=0xf7;}
- else
- {
- button_data=0xff;
- }
- ReadData = button_data^0xff; // 1
- Trg = ReadData & (ReadData ^ Cont); // 2
- Cont = ReadData; // 3
- }
- void KeyProc(void)
- {
- if (Trg & K1) // 如果按下的是K1
- {
-
-
- if(set_tem<32)
- {
- set_tem++;
-
- }
- else
- {
-
- set_tem=32;
- }
- Dispaly_SEGD2( set_tem%10);
- Dispaly_SEGD1( set_tem/10);
-
- }
- if (Trg & K2) // 如果按下的是K2
- {
-
- if(set_tem>10)
- {
- set_tem--;
-
- }
- else
- {
-
- set_tem=10;
- }
- Dispaly_SEGD2( set_tem%10);
- Dispaly_SEGD1( set_tem/10);
-
- }
- if (Trg & K3) // 如果按下的是K3
- {
-
-
- }
- if (Trg & K4) // 如果按下的是K4
- {
-
-
- }
-
-
- }
- #pragma vector ISR_tmr0 @ 0x08
- void ISR_tmr0(void)
- {
- tick++;
- count_tick++;
- if(count_tick==255)
- {
- count_tick=0;
- _start=0;
- _start=1;//ad轉換
- _start=0;
- }
- KeyRead();
- KeyProc();
- switch(tick)
- { //scom1的掃描
- case 1: _scomc=0x3e;_pb0=1; display_com(seg1_display,1,0); break;//掃描COM1口所有的SEG
- case 2: _scomc=0x3e;_pb0=0; ; display_com(seg1_display,0,0); break;
- //scom2的掃描
- case 3: _scomc=0x3d;_pb1=1; display_com(seg2_display,1,1); break;
- case 4: _scomc=0x3d; _pb1=0; display_com(seg2_display,0,1); break;
-
-
- //scom3的掃描
- case 5: _scomc=0x3b; _pb2=1; display_com(seg3_display,1,1); break;
- case 6: _scomc=0x3b;_pb2=0; display_com(seg3_display,0,1); break;
-
-
-
- //scom4的掃描
- case 7: _scomc=0x37; _pb3=1; display_com(seg4_display,1,1); break;
- case 8: _scomc=0x37; _pb3=0; display_com(seg4_display,0,1); tick=0; break;
-
-
- }
- _emi=1;
- _t0e=1;//使能tim0中斷
- }
- void display_s1_s2_s3_s4_s5_p(uint8_t s1,uint8_t s2,uint8_t s3,uint8_t s4,uint8_t s5,uint8_t p)
- {
-
- if(s1) {set_bit_16(&seg1_display,6);}else{clr_bit_16(&seg1_display,6);}
- if(s2) {set_bit_16(&seg1_display,4);}else{clr_bit_16(&seg1_display,4);}
- if(s3) {set_bit_16(&seg1_display,9);}else{clr_bit_16(&seg1_display,9);}
- if(s4) {set_bit_16(&seg1_display,8);}else{clr_bit_16(&seg1_display,8);}
- if(s5) {set_bit_16(&seg1_display,1);}else{clr_bit_16(&seg1_display,1);}
- if(p) {set_bit_16(&seg1_display,3);}else{clr_bit_16(&seg1_display,3);}
- }
- void Dispaly_SEGD3(uint8_t a)//顯示斷碼
- {
-
-
- switch (a)
- {
-
- case 0:seg2_display&=0xfcff;seg3_display&=0xfcff;seg4_display&=0xfcff;break;
-
- case 1: set_bit_16(&seg2_display,8);clr_bit_16(&seg2_display,9); clr_bit_16(&seg3_display,8);clr_bit_16(&seg3_display,9); set_bit_16(&seg4_display,8);clr_bit_16(&seg4_display,9); break;//顯示1
-
- case 2:set_bit_16(&seg2_display,8);set_bit_16(&seg2_display,9);set_bit_16(&seg3_display,8);set_bit_16(&seg3_display,9);set_bit_16(&seg4_display,9);clr_bit_16(&seg4_display,8); break;
-
- case 3:seg2_display|=0x0300;set_bit_16(&seg3_display,8);clr_bit_16(&seg3_display,9);seg4_display|=0x0300; break;
-
- default:seg2_display&=0xfcff;seg3_display&=0xfcff;seg4_display&=0xfcff;
- }
-
- }
- void Dispaly_SEGD4(uint8_t a)//顯示斷碼
- {
-
-
- switch (a)
- {
- case 0:seg1_display|=0x0080;seg2_display|=0x00c0;set_bit_16(&seg3_display,7);clr_bit_16(&seg3_display,6);seg4_display|=0x00c0;break;//顯示0
-
- case 1: clr_bit_16(&seg1_display,7);set_bit_16(&seg2_display,6);clr_bit_16(&seg2_display,7);seg3_display&=0xff3f;set_bit_16(&seg4_display,6);clr_bit_16(&seg4_display,7); break;//顯示1
-
- case 2:seg1_display|=0x0080;set_bit_16(&seg2_display,6);clr_bit_16(&seg2_display,7);seg3_display|=0x00c0;clr_bit_16(&seg4_display,6);set_bit_16(&seg4_display,7);break;
-
- case 3:seg1_display|=0x0080;set_bit_16(&seg2_display,6);clr_bit_16(&seg2_display,7);set_bit_16(&seg3_display,6);clr_bit_16(&seg3_display,7);seg4_display|=0x00c0; break;
-
- case 4:seg1_display&=0xff7f;seg2_display|=0x00c0;set_bit_16(&seg3_display,6);clr_bit_16(&seg3_display,7);set_bit_16(&seg4_display,6);clr_bit_16(&seg4_display,7);break;
-
- case 5:seg1_display|=0x0080;seg2_display|=0x00c0;seg3_display|=0x0080; set_bit_16(&seg2_display,7);clr_bit_16(&seg2_display,6);set_bit_16(&seg3_display,6);clr_bit_16(&seg3_display,7); seg4_display|=0x00c0; break;
-
- case 6:seg1_display|=0x0080;seg2_display|=0x00c0; set_bit_16(&seg2_display,7);clr_bit_16(&seg2_display,6); seg3_display|=0x00c0;seg4_display|=0x00c0;break;
-
- case 7:seg1_display|=0x0080;set_bit_16(&seg2_display,6);clr_bit_16(&seg2_display,7);seg3_display&=0xff3f; set_bit_16(&seg4_display,6);clr_bit_16(&seg4_display,7); break;
-
- case 8:seg1_display|=0x0080;seg2_display|=0x00c0;seg3_display|=0x00c0;seg4_display|=0x00c0; break;
-
- case 9:seg1_display|=0x0080;seg2_display|=0x00c0;set_bit_16(&seg3_display,6);clr_bit_16(&seg3_display,7);seg4_display|=0x00c0; break;
-
- default:seg1_display|=0x0080;seg2_display|=0x00c0;set_bit_16(&seg3_display,7);clr_bit_16(&seg3_display,6);seg4_display|=0x00c0;
-
-
- }
-
- }
-
- void Dispaly_SEGD5(uint8_t number)
- {
-
- switch (number)
- {
- case 0:seg1_display|=0x0020;seg2_display|=0x0030;set_bit_16(&seg3_display,5);clr_bit_16(&seg3_display,4);seg4_display|=0x0030;break;//顯示0
-
- case 1: clr_bit_16(&seg1_display,5);set_bit_16(&seg2_display,4);clr_bit_16(&seg2_display,5);seg3_display&=0xffcf;set_bit_16(&seg4_display,4);clr_bit_16(&seg4_display,5); break;//顯示1
-
- case 2:seg1_display|=0x0020;set_bit_16(&seg2_display,4);clr_bit_16(&seg2_display,5);seg3_display|=0x0030;clr_bit_16(&seg4_display,4);set_bit_16(&seg4_display,5);break;
-
- case 3:seg1_display|=0x0020;set_bit_16(&seg2_display,4);clr_bit_16(&seg2_display,5);set_bit_16(&seg3_display,4);clr_bit_16(&seg3_display,5);seg4_display|=0x0030; break;
-
- case 4:seg1_display&=0xffdf;seg2_display|=0x0030;set_bit_16(&seg3_display,4);clr_bit_16(&seg3_display,5);set_bit_16(&seg4_display,4);clr_bit_16(&seg4_display,5);break;
-
- case 5:seg1_display|=0x0020;seg2_display|=0x0030;seg3_display|=0x0020; set_bit_16(&seg2_display,5);clr_bit_16(&seg2_display,4);set_bit_16(&seg3_display,4);clr_bit_16(&seg3_display,5); seg4_display|=0x0030; break;
-
- case 6:seg1_display|=0x0020;seg2_display|=0x0030; set_bit_16(&seg2_display,5);clr_bit_16(&seg2_display,4); seg3_display|=0x0030;seg4_display|=0x0030;break;
-
- case 7:seg1_display|=0x0020;set_bit_16(&seg2_display,4);clr_bit_16(&seg2_display,5);seg3_display&=0xffcf; set_bit_16(&seg4_display,4);clr_bit_16(&seg4_display,5); break;
-
- case 8:seg1_display|=0x0020;seg2_display|=0x0030;seg3_display|=0x0030;seg4_display|=0x0030; break;
-
- case 9:seg1_display|=0x0020;seg2_display|=0x0030;set_bit_16(&seg3_display,4);clr_bit_16(&seg3_display,5);seg4_display|=0x0030; break;
-
- default:seg1_display|=0x0020;seg2_display|=0x0030;set_bit_16(&seg3_display,5);clr_bit_16(&seg3_display,4);seg4_display|=0x0030;
-
-
- }
-
- }
- void Dispaly_SEGD2(uint8_t number)
- {
- switch (number)
- {
- case 0:seg1_display|=0x0004;seg2_display|=0x000c;set_bit_16(&seg3_display,2);clr_bit_16(&seg3_display,3);seg4_display|=0x000c;break;//顯示0
-
- case 1: clr_bit_16(&seg1_display,2);set_bit_16(&seg2_display,3);clr_bit_16(&seg2_display,2);seg3_display&=0xfff3;set_bit_16(&seg4_display,3);clr_bit_16(&seg4_display,2); break;//顯示1
-
- case 2:seg1_display|=0x0004;set_bit_16(&seg2_display,3);clr_bit_16(&seg2_display,2);seg3_display|=0x000c;clr_bit_16(&seg4_display,3);set_bit_16(&seg4_display,2);break;
-
- case 3:seg1_display|=0x004;set_bit_16(&seg2_display,3);clr_bit_16(&seg2_display,2);set_bit_16(&seg3_display,3);clr_bit_16(&seg3_display,2);seg4_display|=0x00c; break;
-
- case 4:clr_bit_16(&seg1_display,2);seg2_display|=0x00c;set_bit_16(&seg3_display,3);clr_bit_16(&seg3_display,2);set_bit_16(&seg4_display,3);clr_bit_16(&seg4_display,2);break;
-
- case 5:seg1_display|=0x004;seg2_display|=0x00c;seg3_display|=0x004; set_bit_16(&seg2_display,2);clr_bit_16(&seg2_display,3);set_bit_16(&seg3_display,3);clr_bit_16(&seg3_display,2); seg4_display|=0x00c; break;
-
- case 6:seg1_display|=0x004;seg2_display|=0x00c; set_bit_16(&seg2_display,2);clr_bit_16(&seg2_display,3); seg3_display|=0x00c;seg4_display|=0x00c;break;
-
- case 7:seg1_display|=0x004;set_bit_16(&seg2_display,3);clr_bit_16(&seg2_display,2);seg3_display&=0xfff3; set_bit_16(&seg4_display,3);clr_bit_16(&seg4_display,2); break;
-
- case 8:seg1_display|=0x004;seg2_display|=0x00c;seg3_display|=0x00c;seg4_display|=0x00c; break;
-
- case 9:seg1_display|=0x004;seg2_display|=0x00c;set_bit_16(&seg3_display,3);clr_bit_16(&seg3_display,2);seg4_display|=0x00c; break;
-
- default:seg1_display|=0x0004;seg2_display|=0x00c;set_bit_16(&seg3_display,2);clr_bit_16(&seg3_display,3);seg4_display|=0x00c;
-
- }
-
- }
- void Dispaly_SEGD1(uint8_t number)
- {
-
- switch (number)
- {
-
-
- case 0:clr_bit_16(&seg2_display,1);clr_bit_16(&seg2_display,0);clr_bit_16(&seg3_display,1);clr_bit_16(&seg3_display,0);clr_bit_16(&seg4_display,1);clr_bit_16(&seg4_display,0);break;
-
- case 1: set_bit_16(&seg2_display,1);clr_bit_16(&seg2_display,0); clr_bit_16(&seg3_display,0);clr_bit_16(&seg3_display,1); set_bit_16(&seg4_display,1);clr_bit_16(&seg4_display,0); break;//顯示1
-
- case 2:set_bit_16(&seg2_display,0);set_bit_16(&seg2_display,1);set_bit_16(&seg3_display,1);set_bit_16(&seg3_display,0);set_bit_16(&seg4_display,0);clr_bit_16(&seg4_display,1); break;
-
- case 3:set_bit_16(&seg2_display,0);set_bit_16(&seg2_display,1);set_bit_16(&seg3_display,1);clr_bit_16(&seg3_display,0); set_bit_16(&seg4_display,1);set_bit_16(&seg4_display,0); break;
-
-
- }
-
-
-
- }
-
-
-
- void ad_process(uint16_t ad_data,uint16_t *p)//ad數據處理
- {
- uint8_t i;
- uint8_t n;
-
- if(ad_data<*p){return ;}//如果小于0度,按照0度處理
-
-
-
- for(i=0;i<33;i++)//1攝氏度到32攝氏度
- {
- if(*p==ad_data)//如果相等,那么直接返回點溫度值
- {
-
- Dispaly_SEGD3(i/10);
- Dispaly_SEGD4(i%10);
- return ;
- }
- else
- if((*p<ad_data)&&(*(p+1)>ad_data))
- {
-
- Dispaly_SEGD3(i/10);
- Dispaly_SEGD4(i%10);
-
-
- //小數點按照線性計算,就相當于p和P++之間進行求差值,然后用1除
- n=*(p+1)-*p;
- n=n/10;//現行小數點,100,是為了使結果變成整數,其實是1,
-
- ad_data=ad_data-*p;
- n=ad_data/n;
-
-
- Dispaly_SEGD5(n);
- return ;
-
- }
-
-
- p++;
- }
-
-
-
-
-
-
-
-
- }
-
-
-
- void main()
- {
- uint8_t i;
- seg1_display=0;
- seg2_display=0;
- seg3_display=0;
- seg4_display=0;
- //SEG口定義
- _pbc=0;
- _pbpu=0x0f;//上啦
- _pcc=0;//設置為輸出
- _pcpu=0x0f;//上啦
- //設置PB口為COM口
- _pbc0=0;
- _pbc1=0;
- _pbc2=0;//output
- _pbc3=0;
- _pac1=1;
- _pac2=1;
- _pac3=1;//設置為輸入
- _pac4=1;
- _papu1=1;
- _papu2=1;
- _papu3=1;
- _papu4=1;
- //中斷配置
- _emi=1;//使能全局開關
- _t0e=1;//使能tim0中斷
- _ade=1;//開啟AD轉換使能。
- //ad轉換
- _adcr=0x48;//選擇AN0通道的PA0口作為模擬輸入,但是并未開啟轉換
- _acsr=0x82;//開啟AD電源,4MHZ時轉換速度是500ns
- //定時器0定義
- _tmr0c=0x87;
- _tmr0=(256-100);
- _t0on=1;//開始定時
- tick=0;//清除計時
- set_tem=23;
- display_s1_s2_s3_s4_s5_p(0,1,0,1,1,1);
- Dispaly_SEGD3(2);
- Dispaly_SEGD4(9);
- Dispaly_SEGD5(6);
- Dispaly_SEGD2(set_tem%10);
- Dispaly_SEGD1(set_tem/10);
- while(1);//什么也不做,天天耍,奧 。。。 我就耍你怎么著? 莫脾氣!
- /**/
- }
復制代碼
|