- /*
- 2017/11/6
- 版本:v1.00
- by 王均偉
- 日照
- */
- #define s1_display_en 1
- #define s1_display_dis 0
- #define s2_display_en 1
- #define s2_display_dis 0
- #define s3_display_en 1
- #define s3_display_dis 0
- #define s4_display_en 1
- #define s4_display_dis 0
- #define s5_display_en 1
- #define s5_display_dis 0
- #define p_display_en 1
- #define p_display_dis 0
- void ad_process(uint16_t ad_data,uint16_t *p);//ad數據處理
- /*
- static uint8_t tick;//計數變量
- static uint16_t seg1_display;//COM1的掃描顯存
- static uint16_t seg2_display;//COM2的掃描顯存
- static uint16_t seg3_display;//COM3的掃描顯存
- static uint16_t seg4_display;//COM4的掃描顯存
- */
- uint16_t ad_date;
- uint16_t dis_number;
- /*
- 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)
- {
- ad_date=_adrh;
- ad_date<<=8;
- ad_date+=_adrl;
- ad_date>>=4;
- _emi=1;
- _ade=1;//開啟AD轉換使能。
-
- }
- /*
- #pragma vector ISR_tmr0 @ 0x08
- void ISR_tmr0(void)
- {
- tick++;
- 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: seg2_display|=0x0100;seg4_display|=0x100; break;//顯示1
-
- case 2:seg2_display|=0x0300;seg3_display|=0x300;seg4_display|=0x0200; break;
-
-
- case 3:seg2_display|=0x0300;seg3_display|=0x100;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:seg1_display&=0xfff7;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:seg2_display&=0xff3;seg3_display&=0xff3;seg4_display&=0xfff3;break;
-
- case 1: seg2_display|=0x02;seg4_display|=0x2; break;//顯示1
-
- case 2:seg2_display|=0x03;seg3_display|=0x3;seg4_display|=0x01; break;
-
- case 3:seg2_display|=0x03;seg3_display|=0x2;seg4_display|=0x03; break;
-
- default:seg2_display&=0xff3;seg3_display&=0xff3;seg4_display&=0xfff3;
- }
-
-
-
- }
-
- */
-
- void ad_process(uint16_t ad_data,uint16_t *p)//ad數據處理
- {
- uint8_t i;
- uint8_t n;
-
- if(ad_data<*p){dis_number=0;return ;}//如果小于0度,按照0度處理
-
-
-
- for(i=0;i<23;i++)//1攝氏度到23攝氏度
- {
- if(*p==ad_data)//如果相等,那么直接返回點溫度值
- {
-
- dis_number=i;//整數度
- return ;
- }
- else
- if((*p<ad_data)&&(*(p+1)>ad_data))
- {
- dis_number=i;//整數度
- dis_number<<=8;//整數度
-
-
- //小數點按照線性計算,就相當于p和P++之間進行求差值,然后用1除
- n=*(p+1)-*p;
- n=100/n;//現行小數點,100,是為了使結果變成整數,其實是1,
- dis_number+=n;
-
- return ;
-
- }
-
-
- p++;
- }
-
-
-
-
-
-
- }
- void main()
- {
- uint8_t i;
- 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*/};
- /*
- 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;
- */
- //中斷配置
- _emi=1;//使能全局開關
- //_t0e=1;//使能tim0中斷
- _ade=1;//開啟AD轉換使能。
- //ad轉換
- _adcr=0x48;//選擇AN0通道的PA0口作為模擬輸入,但是并未開啟轉換
- _acsr=0x80;//開啟AD電源,4MHZ時轉換速度是500ns
- //定時器定義
- _tmr0c=0x87;
- _tmr0=(256-100);
- //_t0on=1;//開始定時
- //tick=0;//清除計時
- //display_s1_s2_s3_s4_s5_p(0,1,0,1,1,1);
- //Dispaly_SEGD3(3);
- //Dispaly_SEGD4(9);
- //Dispaly_SEGD5(6);
- //Dispaly_SEGD2(5);
- //Dispaly_SEGD1(1);
- while(1){
-
- _start=0;
- _start=1;
- _start=0;
- _delay(250000);
- ad_process(ad_date, ad_temp_tab);//ad數據處理
-
- }
- }
復制代碼
|