list p=16f877a #include p16f877a.inc variable env env = _BODEN_ON env &= _CP_OFF env &= _HS_OSC env &= _PWRTE_ON env &= _WDT_OFF env &= _LVP_OFF env &= _WRT_OFF env &= _CPD_OFF __config env #define number_of_waves b'11111111' #define time0 b'00010100' #define time1 b'00010010' #define time2 b'00001001' #define time3 b'00111111' #define count_signal b'00001000' #define reception_signal PORTD,7 #define send_signal PORTD,6 #define sw_signal PORTD,5 cblock 0x20 w_temp status_temp wa wa1 counter send_data count_asmsignal endc org 0x000 goto start org 0x004 ;************* ;割り込み処理 ;************* movwf w_temp movf STATUS,w movwf status_temp ;ISR Codes movf status_temp,w movwf STATUS swapf w_temp,f swapf w_temp,w retfie ;************** ;プログラム開始 ;************** start bcf STATUS,RP1 bsf STATUS,RP0 ;バンク1 movlw 0x07 movwf CMCON ;コンパレータを使用しない movlw b'11111111' movwf TRISB movlw b'10100000' movwf TRISD bcf STATUS,RP0 ;バンク0 clrf PORTB clrf PORTD clrf counter clrf send_data clrf count_asmsignal main btfsc sw_signal ;PORTD,5 call wait_sendtime goto main ;************************************ ;* 時間をおいて8bitデータを送る * ;************************************ wait_sendtime call wait_receive ;********************* ;* 信号選び * ;********************* send_signalmain call send_start_parity call send_signaldata1 call send_start_parity call send_soliddata call send_start_parity call send_PRBdata call send_stop call wait_receive call send_start_parity call send_signaldata2 call send_start_parity call send_soliddata call send_start_parity call send_PRBdata call send_stop goto start ;********************************************** ;* start,パリティ,stop信号 * ;********************************************** send_start_parity call carrier_wave_on1 return send_stop call carrier_wave_on1 return ;********************* ;* 信号選び 決定 * ;********************* send_signaldata1 ;コマンド1 movlw b'11000100' movwf send_data call send_signal_data1 return send_signaldata2 ;コマンド2 movlw b'11100100' movwf send_data call send_signal_data1 return send_soliddata ;個体識別 movlw b'00000001' movwf send_data call send_signal_data1 return send_PRBdata movf PORTB,w movwf send_data call send_signal_data1 return ;********************* ;* 信号送信所 * ;********************* send_signal_data1 movlw count_signal movwf count_asmsignal send_signal_data2 btfsc send_data,0 ;0ならskip call carrier_wave_on1 btfss send_data,0 ;1ならskip call carrier_wave_off1 rrf send_data decfsz count_asmsignal,1 goto send_signal_data2 rrf send_data ;C flag分 return ;*********************** ;* 送信するon,off信号 * ;*********************** carrier_wave_on1 ;1クロック分 movlw number_of_waves movwf counter carrier_wave_on2 bsf send_signal call wait_on bcf send_signal call wait_off decfsz counter,f goto carrier_wave_on2 return carrier_wave_off1 ;1クロック分 movlw number_of_waves movwf counter carrier_wave_off2 bcf send_signal call wait_on bcf send_signal call wait_off decfsz counter,f goto carrier_wave_off2 return ;********************* ;* wait集 * ;********************* ;********************* ;* 38kHzのためのwait * ;********************* wait_on movlw time0 movwf wa wait0 decfsz wa,1 goto wait0 return wait_off movlw time1 movwf wa wait1 decfsz wa,1 goto wait1 return ;************************ ;* 時間稼ぎのためのwait * ;************************ wait_delay ;半クロックずらして信号の真ん中を取る movlw time2 movwf wa wait2 decfsz wa,1 goto wait2 return wait_receive ;1回目の信号と2回目信号の間 bcf send_signal movlw time3 movwf wa wait3 decfsz wa,1 goto wait3 wait4 decfsz wa1,1 goto wait3 return end