; ; pad-tx for PIC16F88 ; (old: new xmms Controller for 16F84A(PIC)+MAX232+PAD) ; ; by NaO ; OSC:20MHz(セラロック) ; Version 0.1 2005/4/14 ; 机上設計 ; Version 0.11 2005/4/16 ; debug ; Version 0.20 2005/4/16 ; FM/AMも長押し判定追加 ; Version 0.21 2005/4/17 ; ブザー対応 ; Version 0.22 2005/4/18 ; 取りあえず完成版 LIST P=16F88,ST=OFF,R=DEC,F=INHX8M INCLUDE p16f88.inc ERRORLEVEL -207,-302,-306 ;Program Configuration Register 1 __CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _MCLR_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC ;Program Configuration Register 2 __CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF #define BANK0 bcf STATUS,RP0 #define BANK1 bsf STATUS,RP0 count_100us equ 0x20 ; wait count用 count_1ms equ 0x21 ; wait count用 count_10ms equ 0x21 ; wait count用 count_100ms equ 0x22 ; wait count用 key_data equ 0x23 ; 入力キーデータバッファ long_key_count1 equ 0x24 ; 長押し判定用L long_key_count2 equ 0x25 ; 長押し判定用H wrk1 equ 0x26 wrk2 equ 0x27 wrk3 equ 0x28 flags equ 30h ; 各種フラグ #define long_key_flg flags,0 ; 長押し判定用 TX_BUF equ 0x31 ; 送信バッファ pad_led_bit equ 4 #define pad_led PORTB,4 ; LED0: RB4 pad_bz_bit equ 7 #define pad_bz PORTB,7 ; ブザー: RB7 ; for WAIT VALUE RS232_SPBRG equ 129 ; 20MHz:9600bps LONG_KEY_WAIT1 equ 255 LONG_KEY_WAIT2 equ 8 ; for EEPROM(memo) org 0x2100 de "PAD-TX(PIC16F88) Version 0.22 2005/04/18 19:30" org 0 goto INIT org 4 goto INTR INIT org 8 BANK0 movlw B'00000000' ; PortA 5:- 4:low 3:low 2:low 1:- 0:- movwf PORTA ; MOVLW B'00110000' ; PortB 7:- 6:- 5(TX):High 4:High 3:low 2(RX):- 1:low 0:low MOVWF PORTB ; RB4,5をHigh RB0,1,3,6,7をLo BANK1 movlw B'00000111' ; Comparator Off movwf CMCON movlw B'00000000' ; PortAは全部出力(RA1-3のみ使用) movwf TRISA ; movlw B'00001111' ; PortB 7:Oit 6:- 5(TX):Out 4:- 3:Out 2(RX):In 1:In 0:In movwf TRISB ; RB0〜3を入力に movlw B'00000111' ; PortBは内部プルアップ、PSは1/256 movwf OPTION_REG ; movlw B'00000000' ; PortAは、全部デジタル movwf ANSEL ;; USART設定(BANK1) bsf TXSTA,BRGH ; 高速モード bsf TXSTA,TXEN ; 送信OK movlw RS232_SPBRG ; ボーレート設定 movwf SPBRG BANK0 bsf RCSTA,SPEN ; USART Enable(RB2=RX,RB5=TX) ;; 割込み設定 movlw B'00000000' ; まずは全部オフ movwf INTCON goto MAIN ;; メイン MAIN call wait_100ms ; 100msec待つ call pad_led_on ; led on call beep0 ; ぴっ call wait_100ms main_loop ;; キー入力判定(入力待ち) check_PWR movf PORTA,W movwf wrk1 bcf wrk1,1 ; RA1-Low bcf wrk1,2 ; RA2-Low bsf wrk1,3 ; RA3-High(P2 ON) movf wrk1,W movwf PORTA movf PORTB,W ; RBを退避 movwf wrk2 btfss wrk2,3 ; RB3をチェック High(Off)だったらスキップ goto low_PWR ; Low(On)だったら、LOW_PWRへ check_FM movf PORTA,W movwf wrk1 bcf wrk1,1 ; RA1-Low bcf wrk1,2 ; RA2-Low bsf wrk1,3 ; RA3-High(P2 ON) movf wrk1,W movwf PORTA movf PORTB,W ; RBを退避 movwf wrk2 btfss wrk2,1 ; RB1をチェック High(Off)だったらスキップ goto low_FM ; Low(On)だったら、low_FMへ check_AM movf PORTA,W movwf wrk1 bcf wrk1,1 ; RA1-Low bcf wrk1,2 ; RA2-Low bsf wrk1,3 ; RA3-High(P2 ON) movf wrk1,W movwf PORTA movf PORTB,W ; RBを退避 movwf wrk2 btfss wrk2,0 ; RB0をチェック High(Off)だったらスキップ goto low_AM ; Low(On)だったら、low_AMへ check_NEXT ; "選局(△)" movf PORTA,W movwf wrk1 bcf wrk1,1 ; RA1-Low bsf wrk1,2 ; RA2-High(P1 ON) bcf wrk1,3 ; RA3-Low movf wrk1,W movwf PORTA movf PORTB,W ; RBを退避 movwf wrk2 btfss wrk2,1 ; RB1をチェック High(Off)だったらスキップ goto low_NEXT ; Low(On)だったら、low_NEXTへ check_PREV ; "選局(▽)" movf PORTA,W movwf wrk1 bcf wrk1,1 ; RA1-Low bsf wrk1,2 ; RA2-High(P1 ON) bcf wrk1,3 ; RA3-Low movf wrk1,W movwf PORTA movf PORTB,W ; RBを退避 movwf wrk2 btfss wrk2,0 ; RB0をチェック High(Off)だったらスキップ goto low_PREV ; Low(On)だったら、low_PREVへ check_VOL_UP ; "音量(→)" movf PORTA,W movwf wrk1 bsf wrk1,1 ; RA1-Hogh(P0 ON) bcf wrk1,2 ; RA2-Low bcf wrk1,3 ; RA3-Low movf wrk1,W movwf PORTA movf PORTB,W ; RBを退避 movwf wrk2 btfss wrk2,1 ; RB1をチェック High(Off)だったらスキップ goto low_VOL_UP ; Low(On)だったら、low_VOL_UPへ check_VOL_DOWN ; "音量(←)" movf PORTA,W movwf wrk1 bsf wrk1,1 ; RA1-Hogh(P0 ON) bcf wrk1,2 ; RA2-Low bcf wrk1,3 ; RA3-Low movf wrk1,W movwf PORTA movf PORTB,W ; RBを退避 movwf wrk2 btfss wrk2,0 ; RB0をチェック High(Off)だったらスキップ goto low_VOL_DOWN ; Low(On)だったら、low_VOL_DOWNへ goto main_loop ;; キーオン時判定 low_PWR ; "電源"ボタン "0" or "P" 出力 call wait_10ms movf PORTB,W movwf wrk2 btfsc wrk2,3 ; Low(Onのまま)だったらスキップ goto check_FM ; 次のチェックへ call pad_led_off ; LEDオフ call beep1 low_PWR_1 movlw LONG_KEY_WAIT1 ; カウント回数セット movwf long_key_count1 ; movlw LONG_KEY_WAIT2 movwf long_key_count2 bcf long_key_flg ; フラグリセット low_PWR_2 movf PORTB,W movwf wrk2 btfsc wrk2,3 ; Low(Onのまま)だったらスキップ goto low_PWR_3 ; キーオフ low_PWR_3へ call wait_1ms btfsc long_key_flg ; フラグがセットされていなかったらSkip goto low_PWR_2 ; キーがはなされるまでループ decfsz long_key_count1,F ; カウント1が0になったらSkip goto low_PWR_2 ; キーがはなされるまでループ movlw LONG_KEY_WAIT1 ; カウント1回数リセット movwf long_key_count1 decfsz long_key_count2,F ; カウント2が0になったらSkip(出力処理へ) goto low_PWR_2 ; キーがはなされるまでループ btfss long_key_flg ; フラグがsetされていたらスキップ call send_code_P ; "P"を出力 call beep3 ; "ぴーー" bsf long_key_flg ; フラグセット goto low_PWR_2 ; キーがはなされるまでループ low_PWR_3 btfss long_key_flg ; フラグがセットされてたら(長押し)スキップ call send_code_0 ; "0"を出力 call pad_led_on ; LED ON goto check_FM ; FMチェックへ low_FM ; "FM"ボタン "1"出力 call wait_10ms movf PORTB,W movwf wrk2 btfsc wrk2,1 ; Low(Onのまま)だったらスキップ goto check_AM ; 次のチェックへ call pad_led_off ; LEDオフ call beep1 call send_code_1 ; "1"を出力 low_FM_1 movlw LONG_KEY_WAIT1 ; カウント回数セット movwf long_key_count1 movlw LONG_KEY_WAIT2 movwf long_key_count2 bcf long_key_flg ; フラグリセット low_FM_2 movf PORTB,W movwf wrk2 btfsc wrk2,1 ; Low(Onのまま)だったらスキップ goto low_FM_3 ; キーがはなされるまでループ call wait_1ms btfsc long_key_flg ; フラグがセットされていなかったらSkip goto low_FM_2 ; キーがはなされるまでループ decfsz long_key_count1,F ; カウント1が0になったらSkip goto low_FM_2 ; キーがはなされるまでループ movlw LONG_KEY_WAIT1 ; カウント1リセット movwf long_key_count1 decfsz long_key_count2,F ; カウント2が0になったらSkip(出力) goto low_FM_2 ; キーがはなされるまでループ btfss long_key_flg ; フラグがsetされていたらskip call send_code_F ; 'F'を出力 call beep2 ; "ぴー" bsf long_key_flg ; フラグセット goto low_FM_2 ; キーがはなされるまでループ low_FM_3 call pad_led_on goto check_AM ; AMチェックへ low_AM ; "AM"ボタン "2"出力 call wait_10ms movf PORTB,W movwf wrk2 btfsc wrk2,0 ; Low(Onのまま)だったらスキップ goto check_NEXT ; 次のチェックへ call pad_led_off ; LEDオフ call beep1 call send_code_2 ; "2"を出力 low_AM_1 movlw LONG_KEY_WAIT1 ; カウント回数セット movwf long_key_count1 movlw LONG_KEY_WAIT2 movwf long_key_count2 bcf long_key_flg ; フラグリセット low_AM_2 movf PORTB,W movwf wrk2 btfsc wrk2,0 ; High(Onのまま)だったらスキップ goto low_AM_3 ; キーがはなされるまでループ call wait_1ms btfsc long_key_flg ; フラグがセットされていなかったらSkip goto low_AM_2 ; キーがはなされるまでループ decfsz long_key_count1,F ; カウント1が0になったらSkip goto low_AM_2 ; キーがはなされるまでループ movlw LONG_KEY_WAIT1 ; カウント1リセット movwf long_key_count1 decfsz long_key_count2,F ; カウント2が0になったらSkip(出力) goto low_AM_2 ; キーがはなされるまでループ btfss long_key_flg ; フラグがsetされていたらskip call send_code_A ; 'A'を出力 call beep2 ; "ぴー" bsf long_key_flg ; フラグセット goto low_AM_2 ; キーがはなされるまでループ low_AM_3 call pad_led_on goto check_NEXT ; NEXTチェックへ low_NEXT ; "選局(△)"ボタン "3"出力 call wait_10ms movf PORTB,W movwf wrk2 btfsc wrk2,1 ; Low(Onのまま)だったらスキップ goto check_PREV ; 次のチェックへ call pad_led_off ; LEDオフ call beep1 call send_code_3 ; "3"を出力 low_NEXT_1 movlw LONG_KEY_WAIT1 ; カウント回数セット movwf long_key_count1 movlw LONG_KEY_WAIT2 movwf long_key_count2 bcf long_key_flg ; フラグリセット low_NEXT_2 movf PORTB,W movwf wrk2 btfsc wrk2,1 ; Low(Onのまま)だったらスキップ goto low_NEXT_3 ; キーがはなされるまでループ call wait_1ms btfsc long_key_flg ; フラグがセットされていなかったらSkip goto low_NEXT_2 ; キーがはなされるまでループ decfsz long_key_count1,F ; カウント1が0になったらSkip goto low_NEXT_2 ; キーがはなされるまでループ movlw LONG_KEY_WAIT1 ; カウント1リセット movwf long_key_count1 decfsz long_key_count2,F ; カウント2が0になったらSkip(出力) goto low_NEXT_2 ; キーがはなされるまでループ btfss long_key_flg ; フラグがsetされていたらskip call send_code_N ; 'N'を出力 call beep2 ; "ぴー" bsf long_key_flg ; フラグセット goto low_NEXT_2 ; キーがはなされるまでループ low_NEXT_3 call pad_led_on goto check_PREV ; PREVチェックへ low_PREV ; "選局(▽)"ボタン "4"出力 call wait_10ms movf PORTB,W movwf wrk2 btfsc wrk2,0 ; Low(Onのまま)だったらスキップ goto check_VOL_UP ; 次のチェックへ call pad_led_off ; LEDオフ call beep1 call send_code_4 ; "4"を出力 low_PREV_1 movlw LONG_KEY_WAIT1 ; カウント回数セット movwf long_key_count1 movlw LONG_KEY_WAIT2 movwf long_key_count2 bcf long_key_flg ; フラグリセット low_PREV_2 movf PORTB,W movwf wrk2 btfsc wrk2,0 ; High(キーオフ)だったらスキップ goto low_PREV_3 ; キーがはなされるまでループ call wait_1ms btfsc long_key_flg ; フラグがセットされていなかったらSkip goto low_PREV_2 ; キーがはなされるまでループ decfsz long_key_count1,F ; カウント1が0になったらSkip goto low_PREV_2 ; キーがはなされるまでループ movlw LONG_KEY_WAIT1 ; カウント1リセット movwf long_key_count1 decfsz long_key_count2,F ; カウント2が0になったらSkip(出力) goto low_PREV_2 ; キーがはなされるまでループ btfss long_key_flg ; フラグがsetされていたらskip call send_code_R ; 'R'を出力 call beep2 ; "ぴー" bsf long_key_flg ; フラグセット goto low_PREV_2 ; キーがはなされるまでループ low_PREV_3 call pad_led_on goto check_VOL_UP ; PREVチェックへ low_VOL_UP ; "音量(→)" "5"出力 call wait_1ms movf PORTB,W movwf wrk2 btfsc wrk2,1 ; Low(Onのまま)だったらスキップ goto check_VOL_DOWN ; 次のチェックへ call pad_led_off ; LEDオフ call beep1 call send_code_5 ; "5"を出力 low_VOL_UP_2 movf PORTB,W movwf wrk2 btfss wrk2,1 ; High(キーオフ)だったらスキップ goto low_VOL_UP_2 ; キーがはなされるまでループ call pad_led_on goto check_VOL_DOWN ; PREVチェックへ low_VOL_DOWN ; "音量(←)" "6"出力 call wait_1ms movf PORTB,W movwf wrk2 btfsc wrk2,0 ; Low(Onのまま)だったらスキップ goto check_PWR ; 次のチェックへ call pad_led_off ; LEDオフ call beep1 call send_code_6 ; "6"を出力 low_VOL_DOWN_2 movf PORTB,W movwf wrk2 btfss wrk2,0 ; High(キーオフ)だったらスキップ goto low_VOL_DOWN_2 ; キーがはなされるまでループ call pad_led_on goto check_PWR ; PWRチェックへ goto main_loop ;; LED pad_led_on movf PORTB,W movwf wrk1 bsf wrk1,pad_led_bit movf wrk1,W movwf PORTB return pad_led_off movf PORTB,W movwf wrk1 bcf wrk1,pad_led_bit movf wrk1,W movwf PORTB return ;; 100usec Wait wait_100us movlw 167 movwf count_100us loop_wait_100us decfsz count_100us,F goto loop_wait_100us return ;; 1msec Wait wait_1ms movlw 10 movwf count_1ms loop_wait_1ms call wait_100us decfsz count_1ms,F goto loop_wait_1ms return ;; 10msec Wait wait_10ms movlw 100 movwf count_10ms loop_wait_10ms call wait_100us decfsz count_10ms,F goto loop_wait_10ms return ;; 100msec Wait wait_100ms movlw 10 movwf count_100ms loop_wait_100ms call wait_10ms decfsz count_100ms,F goto loop_wait_100ms return ;; 500msec Wait wait_500ms movlw 50 movwf count_100ms loop_wait_500ms call wait_10ms decfsz count_100ms,F goto loop_wait_500ms return ;; output output_data movf TX_BUF,W movwf TXREG return ;; outputs send_code_P movlw 'P' movwf TX_BUF call output_data return send_code_0 movlw '0' movwf TX_BUF call output_data return send_code_1 movlw '1' movwf TX_BUF call output_data return send_code_2 movlw '2' movwf TX_BUF call output_data return send_code_3 movlw '3' movwf TX_BUF call output_data return send_code_4 movlw '4' movwf TX_BUF call output_data return send_code_5 movlw '5' movwf TX_BUF call output_data return send_code_6 movlw '6' movwf TX_BUF call output_data return send_code_F movlw 'F' movwf TX_BUF call output_data return send_code_A movlw 'A' movwf TX_BUF call output_data return send_code_N movlw 'N' movwf TX_BUF call output_data return send_code_R movlw 'R' movwf TX_BUF call output_data return ;; ブザー beep0 movf PORTB,W movwf wrk1 bsf wrk1,pad_bz_bit movf wrk1,W movwf PORTB call wait_1ms call wait_1ms call wait_1ms call wait_1ms call wait_1ms movf PORTB,W movwf wrk1 bcf wrk1,pad_bz_bit movf wrk1,W movwf PORTB return beep1 movf PORTB,W movwf wrk1 bsf wrk1,pad_bz_bit movf wrk1,W movwf PORTB call wait_10ms movf PORTB,W movwf wrk1 bcf wrk1,pad_bz_bit movf wrk1,W movwf PORTB return beep2 movf PORTB,W movwf wrk1 bsf wrk1,pad_bz_bit movf wrk1,W movwf PORTB call wait_100ms movf PORTB,W movwf wrk1 bcf wrk1,pad_bz_bit movf wrk1,W movwf PORTB return beep3 movf PORTB,W movwf wrk1 bsf wrk1,pad_bz_bit movf wrk1,W movwf PORTB call wait_500ms movf PORTB,W movwf wrk1 bcf wrk1,pad_bz_bit movf wrk1,W movwf PORTB return INTR INTR nop nop nop RETFIE end