- //*****************************************************************************
- //
- //*****************************************************************************
- //MCU:EM78P153B
- //Oscillator:IRC 4MHz 2Clock
- //WDT:enable
- //編譯軟件:eUIDE version 1.07.32.23
- //按鍵:短按設置功率值,長按確定所設的值,同時蜂鳴器響0.5s
- //數碼管顯示30~90,共7檔功率值,若檢測功率值不在所設的值附近,蜂鳴器響紅燈亮。正常則蜂鳴器不響綠燈亮
- //-----------------------------------------------------------------------------
- #include "EM78P372N.H" //EM78P372N的頭文件
- #define DISI() _asm{disi}
- #define WDTC() _asm{wdtc}
- #define NOP() _asm{nop}
- #define ENI() _asm{eni}
- #define SLEP() _asm{slep}
- #define uchar unsigned char
- #define KEY P66
- #define LED_R P60
- #define LED_G P61
- #define BUZZER P67
- #define D1 P50
- #define D2 P51
- #define D3 P52
- #define D4 P53
- #define D5 P54
- #define D6 P55
- bit f_ad;
- bit f_pwm;
- bit f_p_pwm;
- bit f_key_short;
- bit f_key_lock;
- bit f_led_change; //
- bit f_buz;
- bit f_en;
- bit f_set;
- bit f_set_over;
- uchar check_ad_cnt;
- uchar ad_channel;
- uchar set_value;
- unsigned short ad_value;
- uchar cnt_led;
- uchar cnt_bai;
- uchar cnt_shi;
- uchar cnt_ge;
- unsigned short cnt_pwm;
- unsigned char cnt_key;
- unsigned char cnt_key1;
- uchar set_time=0;
- uchar set_time1=0;
- //-------------------------------------------------------------------
- extern int IntVecIdx; //occupied 0x10:rpage 0
- //----------------------------------------------
- void Sys_init(void);
- void Gpio_init(void);
- void Timer_init(void);
- void Sleep(void);
- void Check_ad(void);
- void Check_key(void);
- void Led_pro(void);
- void Adc_init(void);
- void Pwm_init(void);
- void delay_10ms(void);
- void AD_CALI_P(void);
- void Pro_buzzer(void);
- //---------------------------------------------
- void main()
- {
- WDTC();
- DISI();
- //--------------------------------------
- cnt_pwm=0;
- cnt_key=0;
- f_set=0;
- f_set_over=0;
- f_ad=0;
- f_pwm=0;
- f_p_pwm=0;
- f_key_short=0;
- f_key_lock=0;
- f_led_change=0;
- check_ad_cnt=0;
- ad_channel=0;
- set_value=0;
- ad_value=0;
- cnt_led=0;
- cnt_bai=0;
- cnt_shi=0;
- cnt_ge=0;
- //-------------------------------------
- Sys_init();//SCR=0X7F; //選擇4MHz
- Gpio_init();
- Pwm_init();
- Adc_init();
- _asm
- {
- mov a,@0x0A //1MS 仿真器內部晶振固定為16M不可調
- //mov a,@0x0a
- contw
- }
- TCC=6; //tcc賦初值
- IMR=1; //使能TCC中斷
- ISR1=0;
- ISR2=0;
-
-
- ENI(); //開總中斷
- //------------------------------------
- while(1)
- {
- WDTC();
- Check_ad();
- //Check_key();
- Led_pro();
- Pro_buzzer();
- }
- }
- //----------------------------------------------------------------------------------------
- //----------------------------------------------------------------------------------------
- void _intcall ALLInt(void) @ int
- {
- switch(IntVecIdx)
- {
- case 0xA:
- if(TCIF==1) //TCC中斷嗎?
- {
- ISR2&=0XFE; //清TCC中斷標志
- TCC+=6; //TCC賦初值
- //--------------------------------------------------------------------1ms
- //----------------------------------------------------------------------------------------3ms enable check ad
- check_ad_cnt++;
- if(check_ad_cnt>2) {check_ad_cnt=0;f_ad=1;}
- //---------------------------------------------------------------------------------D1~D6
- switch(set_value)
- {
- case 0:cnt_bai=0;cnt_shi=3;break;
- case 1:cnt_bai=0;cnt_shi=4;break;
- case 2:cnt_bai=0;cnt_shi=5;break;
- case 3:cnt_bai=0;cnt_shi=6;break;
- case 4:cnt_bai=0;cnt_shi=7;break;
- case 5:cnt_bai=0;cnt_shi=8;break;
- case 6:cnt_bai=0;cnt_shi=9;break;
- case 7:cnt_bai=1;cnt_shi=0;break;
- }
- cnt_led++;if(cnt_led>23) {cnt_led=0;}
- D1=0;D2=0;D3=0;D4=0;D5=0;D6=0;P5CR=0XFF;
- //--------------------------------------
- //if(cnt_led==1) {if(cnt_bai==1) {P5CR &=0XEB;D3=1;}}//1B
- //else if(cnt_led==2) {if(cnt_bai==1) {P5CR &=0XED;D5=1;}}//1C
- if(cnt_led==6) {if(cnt_bai==1) {P5CR &=0XEB;D5=1;}}//1G
- else if(cnt_led==8) {if((cnt_shi!=1)&&(cnt_shi!=4)&&(cnt_bai==0)) {P5CR &=0XF9;D3=1;}}//2A
- else if(cnt_led==9) {if((cnt_shi!=5)&&(cnt_shi!=6)&&(cnt_bai==0)) {P5CR &=0XF5;D2=1;}}//2B
- else if(cnt_led==10) {if((cnt_shi!=2)&&(cnt_bai==0)) {P5CR &=0XF9;D2=1;}}//2C
- else if(cnt_led==11) {if((cnt_shi!=1)&&(cnt_shi!=4)&&(cnt_shi!=7)&&(cnt_bai==0)) {P5CR &=0XF3;D3=1;}}//2D
- else if(cnt_led==12) {if(((cnt_shi==0)||(cnt_shi==2)||(cnt_shi==6)||(cnt_shi==8))&&(cnt_bai==0)) {P5CR &=0XF6;D4=1;}}//2E
- else if(cnt_led==13) {if((cnt_shi!=1)&&(cnt_shi!=2)&&(cnt_shi!=3)&&(cnt_shi!=7)&&(cnt_bai==0)) {P5CR &=0XF3;D4=1;}}//2F
- else if(cnt_led==14) {if((cnt_bai==1)||((cnt_shi!=0)&&(cnt_shi!=1)&&(cnt_shi!=7))) {P5CR &=0XF5;D4=1;}}//2G
- else if(cnt_led==16) {if(cnt_bai==0) {P5CR &=0XDE;D1=1;}}//3A
- else if(cnt_led==17) {if(cnt_bai==0) {P5CR &=0XF6;D1=1;}}//3B
- else if(cnt_led==18) {if(cnt_bai==0) {P5CR &=0XFC;D1=1;}}//3C
- else if(cnt_led==19) {if(cnt_bai==0) {P5CR &=0XFA;D3=1;}}//3D
- else if(cnt_led==20) {if(cnt_bai==0) {P5CR &=0XFA;D1=1;}}//3E
- else if(cnt_led==21) {if(cnt_bai==0) {P5CR &=0XFC;D2=1;}}//3F
- else if(cnt_led==22) {if(cnt_bai==1) {P5CR &=0XDD;D2=1;}}//3G
- //--------------------------------------------------------------------------------
- f_p_pwm=1;//1ms timer count
- //-----------------------------------------------------------------------------------key
- if(!KEY)
- {
- if(!f_key_lock)
- {
- cnt_key++;
- if(cnt_key==10) {f_key_short=1;f_en=0;f_pwm=0;f_led_change=1;PWM1E=0;BUZZER=0;f_set_over=0;}
- if(cnt_key>200)
- {
- cnt_key=0;cnt_key1++;
- if(cnt_key1>18)
- {
- f_key_short=0;f_key_lock=1;cnt_key1=0;
- f_en=1;f_set=1;set_time=0;set_time1=0;
- }
- }
- }
- }
- else
- {
- cnt_key=0;cnt_key1=0;f_key_lock=0;
- if(f_key_short)
- {
- f_key_short=0;
- set_value++;if(set_value>7) {set_value=0;}
- }
- }
- //----------------------------------------------------------------------------
- if(f_set)
- {
- if(set_time1<2) {if(!PWM1E) {PWM1E=1;}}
- else {if(PWM1E) {PWM1E=0;BUZZER=0;}}
- set_time++;
- if(set_time>249)
- {
- set_time=0;set_time1++;
- if(set_time1==8)
- {
- set_time1=0;f_set=0;f_set_over=1;
- }
- }
- }
- //----------------------------------------------------------------------------
- }
- break;
- }
- }
- //-------------------------------------------------------------------------------
- void Pro_buzzer(void)
- {
- if((f_pwm)&&(f_p_pwm)&&(f_set_over))
- {
- cnt_pwm++;
- if(cnt_pwm>450) {cnt_pwm=0;}
- if(cnt_pwm>250) {if(PWM1E) {PWM1E=0;BUZZER=0;}}
- else if(cnt_pwm>150) {if(!PWM1E) {PWM1E=1;}}
- else if(cnt_pwm>100) {if(PWM1E) {PWM1E=0;BUZZER=0;}}
- else {if(!PWM1E) {PWM1E=1;}}
- f_p_pwm=0;
- }
- }
- //-----------------------------------------------------------------------
- /*void Check_key(void)
- {
- if(KEY)
- {
- if(f_key_down)
- {
- delay_10ms();
- if(KEY) {f_key_down=0;}
- }
- }
- else
- {
- if(!f_key_down)
- {
- delay_10ms();
- if(!KEY)
- {
- f_key_down=1;
- set_value++;if(set_value>7) {set_value=0;}
- }
- }
- }
- }*/
- //------------------------------------------------------------------------
- void Led_pro(void) //led
- {
- if(f_led_change)
- {
- if(f_pwm)
- {
- LED_R=1;LED_G=0;
- }
- else
- {
- LED_R=0;LED_G=1;
- }
- f_led_change=0;
- }
- }
- //-----------------------------------------------------------------------
- void Check_ad(void) //檢AD
- {
- if(f_ad&&f_en)
- {
- uchar i=0;unsigned short addatah=0;
- ad_value=0;
- for(i=0;i<16;i++)
- {
- ADDATA1H=0;ADDATA1L=0;addatah=0;
- ADRUN=1;
- while(ADRUN);
- addatah=ADDATA1H;
- ad_value+=(addatah<<8)+ADDATA1L;
- }
- ad_value &=0xfffe;
- ad_value>>=1;
- ad_value &=0xfffe;
- ad_value>>=1;
- ad_value &=0xfffe;
- ad_value>>=1;
- ad_value &=0xfffe;
- ad_value>>=1;
- f_ad=0;
-
- //--------------------------------------------------
- switch(set_value)
- {
- case 0://30W
- if((ad_value>1353)||(ad_value<1181))
- {
- if(!f_pwm) {f_pwm=1;f_led_change=1;cnt_pwm=0;}
- }
- else if(f_pwm)
- {f_pwm=0;f_led_change=1;cnt_pwm=0;PWM1E=0;BUZZER=0;}
- break;
-
- case 1://40W
- if((ad_value>1783)||(ad_value<1611))
- {
- if(!f_pwm) {f_pwm=1;f_led_change=1;cnt_pwm=0;}
- }
- else if(f_pwm)
- {f_pwm=0;f_led_change=1;cnt_pwm=0;PWM1E=0;BUZZER=0;}
- break;
-
- case 2://50W
- if((ad_value>2212)||(ad_value<2040))
- {
- if(!f_pwm) {f_pwm=1;f_led_change=1;cnt_pwm=0;}
- }
- else if(f_pwm)
- {f_pwm=0;f_led_change=1;cnt_pwm=0;PWM1E=0;BUZZER=0;}
- break;
-
- case 3://60W
- if((ad_value>2642)||(ad_value<2470))
- {
- if(!f_pwm) {f_pwm=1;f_led_change=1;cnt_pwm=0;}
- }
- else if(f_pwm)
- {f_pwm=0;f_led_change=1;cnt_pwm=0;PWM1E=0;BUZZER=0;}
- break;
-
- case 4://70W
- if((ad_value>3072)||(ad_value<2900))
- {
- if(!f_pwm) {f_pwm=1;f_led_change=1;cnt_pwm=0;}
- }
- else if(f_pwm)
- {f_pwm=0;f_led_change=1;cnt_pwm=0;PWM1E=0;BUZZER=0;}
- break;
-
- case 5://80W
- if((ad_value>3502)||(ad_value<3330))
- {
- if(!f_pwm) {f_pwm=1;f_led_change=1;cnt_pwm=0;}
- }
- else if(f_pwm)
- {f_pwm=0;f_led_change=1;cnt_pwm=0;PWM1E=0;BUZZER=0;}
- break;
-
- case 6://90W
- if((ad_value>3931)||(ad_value<3759))
- {
- if(!f_pwm) {f_pwm=1;f_led_change=1;cnt_pwm=0;}
- }
- else if(f_pwm)
- {f_pwm=0;f_led_change=1;cnt_pwm=0;PWM1E=0;BUZZER=0;}
- break;
-
- case 7://100W 100W對應電壓值超過4V,此case無效,只作演示
- if(ad_value>4094)
- {
- if(!f_pwm) {f_pwm=1;f_led_change=1;cnt_pwm=0;}
- }
- else if(f_pwm)
- {f_pwm=0;f_led_change=1;cnt_pwm=0;PWM1E=0;BUZZER=0;}
- break;
- default:break;
- }
- }
- }
- //--------------------------------------------------------------------------------------
- //-------------------------------------------------------------------------------
- //-------------------------------------------------------------------------------
- void Sys_init(void)
- {
- SCR=0X6F; //4MHz
- WDTCR=0X80; //enable WDT 分頻比1:1
- }
- //--------------------------------------------------------------
- void Timer_init(void)
- {
- _asm{MOV A,0x0a};
- _asm{CONTW} //4*4*(256-6)/4M=1ms
- ISR1=0;
- ISR2=0;
- IMR=0X01;
- }
- //---------------------------------------------------------------
- void Pwm_init(void)
- {
- PWMCON=0X00; //pwm1
- TMRCON=0XD3;
- PRD1=185;
- DT1=92;
- //PWM1E=1;
- }
- //---------------------------------------------------------------
- void Gpio_init(void)
- {
- P5CR=0XFF; //P5 INPUT
- P6CR=0X40; //P66(KEY)
- P7CR=0X01; //P70(ADC5)
-
- P5PDCR=0X00; //P5 enable pull down
- P6ODCR=0X00; //P6 disable Open-drain
- P5PHCR=0XFF; //P5 disable pull up
- P6PHCR=0XBF; //P66 pull up
-
- AISR=0X20; //enable ADC5
-
- PORT5=0;
- PORT6=0;
- PORT7=0;
-
- LED_G=1;
- }
- //---------------------------------------------------------------
- void Adc_init(void)
- {
- ADCON=0X0D; //16分頻 ADC正常功耗運行 ADC5
- ADOC=0X02; //4V
- }
- //---------------------------------------------------------------
- void delay_10ms(void)
- {
- _asm
- {
- mov a,@18
- mov 0x3f,a// de_1,a
- delay_lp5:
- mov a,@250
- mov 0x3e,a//de_2,a
- delay_lp4:
- nop
- djz 0x3e//de_2
- jmp delay_lp4
- djz 0x3f//de_1
- jmp delay_lp5
- }
- }
- void _intcall TCC_l(void) @ 0x09:low_int 2
- {
- _asm{MOV A,0x2};
- }
復制代碼 |