list p=16F883 #include W_Temp EQU 0X7E S_Temp EQU 0X7F ;---------------------------------------- TMR0_CNT EQU 0X20 TMR0_CNT1 EQU 0X21 COUNTi EQU 0X22 COUNTj EQU 0X23 led8_buf EQU 0x24 led8_buf1 EQU 0x25 Button_buf EQU 0x26 KEY_BUF EQU 0x27 SEG_DATA_Index EQU 0x28 Disp_STAUS EQU 0x29 Disp_Index EQU 0x2A Seven_Seg_BUF EQU 0x2B Seven_Seg_BUF0 EQU 0x2B Seven_Seg_BUF1 EQU 0x2C Seven_Seg_BUF2 EQU 0x2D Seven_Seg_BUF3 EQU 0x2E Seven_Seg_BUF4 EQU 0x2F CLOCK_COUNT EQU 0X30 CLOCK_COUNT1 EQU 0X31 TASK2_DATA0 EQU 0X32 TASK2_DATA1 EQU 0X33 TASK2_INDEX EQU 0X34 TASK1_DATA0 EQU 0X35 TASK1_DATA1 EQU 0X36 TASK1_STATUS EQU 0X37 FUCTION_SEL_INDEX EQU 0X38 Scan_Button_Index EQU 0X39 KEY_Count_Temp EQU 0X3A K1 EQU 0X3B K1_Re_10s_Push_Status_BtPush EQU 0X3B K1_Count EQU 0X3C K1_10sec_BUF EQU 0X3D K2 EQU 0X3E K2_Re_10s_Push_Status_BtPush EQU 0X3E K2_Count EQU 0X3F K2_10sec_BUF EQU 0X40 K3 EQU 0X41 K3_Re_10s_Push_Status_BtPush EQU 0X41 K3_Count EQU 0X42 K3_10sec_BUF EQU 0X43 K4 EQU 0X44 K4_Re_10s_Push_Status_BtPush EQU 0X44 K4_Count EQU 0X45 K4_10sec_BUF EQU 0X46 K5 EQU 0X47 K5_Re_10s_Push_Status_BtPush EQU 0X47 K5_Count EQU 0X48 K5_10sec_BUF EQU 0X49 K6 EQU 0X4A K6_Re_10s_Push_Status_BtPush EQU 0X4A K6_Count EQU 0X4B K6_10sec_BUF EQU 0X4C ORG 0x000 GOTO START ORG 0x004 MOVWF W_Temp SWAPF STATUS, W MOVWF S_Temp BCF STATUS, RP0 ;Select bank 0 BCF STATUS, RP1 ;Select bank 0 INCF TMR0_CNT, F INCF CLOCK_COUNT INCF K1_Count INCF K2_Count INCF K3_Count INCF K4_Count INCF K5_Count INCF K6_Count MOVLW .9 MOVWF TMR0 BCF INTCON, T0IF SWAPF S_Temp, W MOVWF STATUS SWAPF W_Temp, F SWAPF W_Temp, W RETFIE START: ;----------- I/O Initialization ------------------- BANKSEL PORTA __CONFIG _CONFIG1, _DEBUG_ON & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_ON & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT __CONFIG _CONFIG2, _WRT_OFF & _BOR40V CLRF PORTA ;Init PORTA BANKSEL ANSEL CLRF ANSEL ;digital I/O BANKSEL TRISA MOVLW B'11111111' MOVWF TRISA MOVLW B'10000001' MOVWF TRISB MOVLW B'00000000' MOVWF TRISC MOVLW B'00001000' MOVWF TRISE BANKSEL PORTA MOVLW B'11111111' MOVWF PORTC CLRF led8_buf CLRF led8_buf1 CLRF Button_buf CLRF Seven_Seg_BUF CLRF Disp_STAUS CLRF Disp_Index CLRF SEG_DATA_Index CLRF TASK1_DATA0 CLRF TASK1_DATA1 CLRF TASK1_STATUS CLRF TASK2_DATA0 CLRF TASK2_DATA1 CLRF TASK2_INDEX CLRF Scan_Button_Index CLRF K1_Re_10s_Push_Status_BtPush CLRF K2_Re_10s_Push_Status_BtPush CLRF K3_Re_10s_Push_Status_BtPush CLRF K4_Re_10s_Push_Status_BtPush CLRF K5_Re_10s_Push_Status_BtPush CLRF K6_Re_10s_Push_Status_BtPush BSF led8_buf1,0 MOVLW B'00000001' MOVWF FUCTION_SEL_INDEX ;----------- Timer0 Initialization ----------------------------- BANKSEL OPTION_REG CLRWDT MOVLW B'01010011' MOVWF OPTION_REG BCF STATUS, RP0 ;Selsect Bank 0 MOVLW .0 MOVWF TMR0 MOVLW B'10100000' MOVWF INTCON CLRF TMR0_CNT ;--------------------------------------------------------------- CALL SEG_DATA main_loop: CLRWDT MOVLW HIGH EH722L_Driver MOVWF PCLATH CALL Disp_Scan CALL OneShot MOVLW HIGH main_loop_END MOVWF PCLATH CALL FUCTION_SEL CALL TASK0 CALL TASK1 CALL TASK2 main_loop_END: GOTO main_loop ;------------------------------------------------------------------- FUCTION_SEL: BTFSS K5_Re_10s_Push_Status_BtPush,5 GOTO FUCTION_SEL_END RLF FUCTION_SEL_INDEX BTFSS FUCTION_SEL_INDEX,2 GOTO FUCTION_SEL_END MOVLW B'00000001' MOVWF FUCTION_SEL_INDEX FUCTION_SEL_END: RETURN ;-------------------------------------------------------------------- TASK0: BTFSS K3_Re_10s_Push_Status_BtPush,6 GOTO Key_Fun_Check BTFSC Button_buf,3 GOTO SET_Button_buf3_0 BSF Button_buf,3 GOTO Disp_Button SET_Button_buf3_0: BCF Button_buf,3 Disp_Button: CALL Disp_Button_buf Key_Fun_Check: BTFSC Button_buf,3 GOTO TASK0_end CALL LED8_RLF TASK0_end: RETURN ;--------------------------------------------------------------------- TASK1: BTFSS FUCTION_SEL_INDEX,0 GOTO TASK1_END BTFSS K4_Re_10s_Push_Status_BtPush,4 GOTO Disp_Hundred MOVLW TASK1_DATA0 MOVWF FSR INCF INDF BTFSS INDF,3 GOTO Disp_One BTFSS INDF,1 GOTO Disp_One CLRF INDF INCF FSR INCF INDF BTFSS INDF,3 GOTO Disp_Hundred BTFSS INDF,1 GOTO Disp_Hundred CLRF INDF DECF FSR CLRF INDF Disp_Hundred: MOVFW TASK1_DATA1 MOVWF Seven_Seg_BUF1 BSF Seven_Seg_BUF1,7 Disp_One: MOVFW TASK1_DATA0 MOVWF Seven_Seg_BUF0 BSF Seven_Seg_BUF0,7 MOVLW Seven_Seg_BUF2 MOVWF FSR CLRF INDF INCF FSR CLRF INDF INCF FSR CLRF INDF TASK1_END: RETURN ;------------------------------------------------------------------- TASK2: MOVFW CLOCK_COUNT SUBLW B'11111101' BCF STATUS,C MOVWF CLOCK_COUNT1 DECFSZ CLOCK_COUNT1 GOTO DiSP_CLOCK CLRF CLOCK_COUNT CLRF TASK2_INDEX MOVLW TASK2_DATA0 MOVWF FSR INCF INDF Judge: BTFSS INDF,3 GOTO DiSP_CLOCK BTFSS INDF,1 GOTO DiSP_CLOCK MOVLW B'00000110' ADDWF INDF BTFSS INDF,6 GOTO DiSP_CLOCK BTFSS INDF,5 GOTO DiSP_CLOCK CLRF INDF INCF FSR INCF INDF INCF TASK2_INDEX BTFSS TASK2_INDEX,1 GOTO Judge DiSP_CLOCK: BTFSS FUCTION_SEL_INDEX,1 GOTO TASK2_END MOVLW B'10010000' MOVWF Seven_Seg_BUF2 BTFSC CLOCK_COUNT,7 CLRF Seven_Seg_BUF2 Update_Minute: MOVFW TASK2_DATA1 ANDLW B'00001111' IORLW B'10000000' MOVWF Seven_Seg_BUF3 SWAPF TASK2_DATA1,W ANDLW B'00000111' IORLW B'10000000' MOVWF Seven_Seg_BUF4 Update_Second: MOVFW TASK2_DATA0 ANDLW B'00001111' IORLW B'10000000' MOVWF Seven_Seg_BUF0 SWAPF TASK2_DATA0,W ANDLW B'00000111' IORLW B'10000000' MOVWF Seven_Seg_BUF1 TASK2_END: RETURN ;------------------------------------------------------------------- Disp_Button_buf: MOVLW B'00001111' ANDWF led8_buf SWAPF Button_buf,W IORWF led8_buf RETURN ;------------------------SEVEN SEG Initialization----------------------- SEG_DATA: ;CLRF SEG_DATA_Index MOVLW Seven_Seg_BUF MOVWF FSR SET_DATA_LOOP: MOVLW B'10000000' MOVWF INDF INCF FSR INCF SEG_DATA_Index BTFSS SEG_DATA_Index,2 GOTO SET_DATA_LOOP BTFSS SEG_DATA_Index,0 GOTO SET_DATA_LOOP SEG_DATA_END: RETURN ;-------------------------------------------------------------------- LED8_RLF: MOVF TMR0_CNT,W SUBLW B'11110110' BCF STATUS,C MOVWF TMR0_CNT1 DECFSZ TMR0_CNT1 GOTO LED8_RLF_END CLRF TMR0_CNT BTFSC led8_buf1,3 goto reset_led8_buf RLF led8_buf1 GOTO LED8_RLF_END0 reset_led8_buf: MOVLW B'00000001' MOVWF led8_buf1 LED8_RLF_END0: MOVLW B'11110000' ANDWF led8_buf MOVF led8_buf1,W IORWF led8_buf LED8_RLF_END: return ;=============================================================== ORG 0x500 EH722L_Driver: ;=================================================================== Disp_Scan: BANKSEL PORTA BTFSC Disp_STAUS,0 ;Disp_STAUS第一位元是否為0 GOTO Disp_CHECK_X1_STATE ;為1! CHECK_X1_STATE BTFSC Disp_STAUS,1 ;為0! 偵測第二位元 GOTO Disp_STATE_10 Disp_STATE_00: CALL Led8_Display BSF PORTB,6 BSF Disp_STAUS,0 ;有狀態為01 GOTO Disp_Scan_END Disp_CHECK_X1_STATE: BTFSC Disp_STAUS,1 GOTO Disp_STATE_11 Disp_STATE_01: BCF PORTB,6 BSF Disp_STAUS,1 GOTO Disp_Scan_END Disp_STATE_11: MOVLW Seven_Seg_BUF ADDWF Disp_Index,W MOVWF FSR BTFSS INDF,7 GOTO OFF_7_seg MOVLW HIGH FONT_CONVERT MOVWF PCLATH MOVF INDF,W ANDLW B'01111111' CALL FONT_CONVERT MOVWF PORTC MOVLW HIGH Disp_STATE_11 MOVWF PCLATH GOTO SEL_7_seg OFF_7_seg: MOVLW B'11111111' MOVWF PORTC GOTO EXIT_STATE_10 SEL_7_seg: RLF Disp_Index,W ;X2 ADDWF PCL,F ;Jump BSF PORTB,5 GOTO EXIT_STATE_11 BSF PORTB,1 GOTO EXIT_STATE_11 BSF PORTB,2 GOTO EXIT_STATE_11 BSF PORTB,3 GOTO EXIT_STATE_11 BSF PORTB,4 GOTO EXIT_STATE_11 EXIT_STATE_11: BCF Disp_STAUS,0 GOTO Disp_Scan_END Disp_STATE_10: RLF Disp_Index,W ADDWF PCL,F BCF PORTB,5 GOTO EXIT_STATE_10 BCF PORTB,1 GOTO EXIT_STATE_10 BCF PORTB,2 GOTO EXIT_STATE_10 BCF PORTB,3 GOTO EXIT_STATE_10 BCF PORTB,4 GOTO EXIT_STATE_10 EXIT_STATE_10: BTFSC Disp_Index,2 GOTO Disp_Set_State_00 INCF Disp_Index,F BSF Disp_STAUS,0 GOTO Disp_Scan_END Disp_Set_State_00: CLRF Disp_Index BCF Disp_STAUS,0 BCF Disp_STAUS,1 Disp_Scan_END: RETURN ;-------------------------------------------------------------- OneShot: BANKSEL PORTA CALL CLR_Re_10s_Push RLF Scan_Button_Index,W ADDWF Scan_Button_Index,W ADDLW K1_Re_10s_Push_Status_BtPush MOVWF FSR Detect_STATE: BTFSC INDF,1 GOTO OneShot_CHECK_XX1_STATE BTFSC INDF,2 GOTO OneShot_CHECK_X10_STATE OneShot_STATE_000: CALL Scan_Button BTFSS INDF,0 GOTO OneShot_END BSF INDF,1 INCF FSR CLRF INDF GOTO OneShot_END OneShot_CHECK_XX1_STATE: BTFSC INDF,2 GOTO OneShot_CHECK_X11_STATE OneShot_STATE_001: CALL Scan_Button BTFSS INDF,0 GOTO OneShot_RESET_KEY_STATE INCF FSR BTFSS INDF,4 GOTO OneShot_END DECF FSR BSF INDF,2 GOTO OneShot_END OneShot_CHECK_X11_STATE: BTFSC INDF,3 GOTO OneShot_STATE_111 OneShot_STATE_011: BSF INDF,4 BCF INDF,1 MOVLW D'2' ADDWF FSR CLRF INDF GOTO OneShot_END OneShot_CHECK_X10_STATE: BTFSC INDF,3 GOTO OneShot_STATE_110 OneShot_STATE_010: CALL Scan_Button BTFSS INDF,0 GOTO SET_Release_KEY INCF FSR MOVFW INDF SUBLW B'11111101' BCF STATUS,C MOVWF KEY_Count_Temp DECFSZ KEY_Count_Temp GOTO OneShot_END CLRF INDF INCF FSR INCF INDF BTFSS INDF,3 GOTO OneShot_END BTFSS INDF,1 GOTO OneShot_END DECF FSR DECF FSR BSF INDF,3 GOTO OneShot_END OneShot_STATE_110: BSF INDF,1 BSF INDF,5 GOTO OneShot_END OneShot_STATE_111: CALL Scan_Button BTFSS INDF,0 GOTO SET_Release_KEY GOTO OneShot_END SET_Release_KEY: BSF INDF,6 OneShot_RESET_KEY_STATE: BCF INDF,3 BCF INDF,2 BCF INDF,1 OneShot_END: INCF Scan_Button_Index BTFSS Scan_Button_Index,2 GOTO OneShot_END0 BTFSS Scan_Button_Index,1 GOTO OneShot_END0 CLRF Scan_Button_Index OneShot_END0: RETURN ;-------------------------------------------------------------------------- Scan_Button: BANKSEL PORTA MOVFW Scan_Button_Index ADDWF PCL GOTO Scan_K1 GOTO Scan_K2 GOTO Scan_K3 GOTO Scan_K4 GOTO Scan_K5 GOTO Scan_K6 Scan_K1: BTFSC PORTB,7 BCF INDF,0 BTFSS PORTB,7 BSF INDF,0 GOTO Scan_Button_END Scan_K2: BTFSC PORTE,3 BCF INDF,0 BTFSS PORTE,3 BSF INDF,0 GOTO Scan_Button_END Scan_K3: BTFSC PORTA,6 BCF INDF,0 BTFSS PORTA,6 BSF INDF,0 GOTO Scan_Button_END Scan_K4: BTFSC PORTA,7 BCF INDF,0 BTFSS PORTA,7 BSF INDF,0 GOTO Scan_Button_END Scan_K5: BTFSC PORTA,5 BCF INDF,0 BTFSS PORTA,5 BSF INDF,0 GOTO Scan_Button_END Scan_K6: BTFSC PORTA,4 BCF INDF,0 BTFSS PORTA,4 BSF INDF,0 GOTO Scan_Button_END Scan_Button_END: RETURN ;-------------------------------------------------------------------- CLR_Re_10s_Push: BTFSC Scan_Button_Index,2 GOTO EX_KEY BTFSC Scan_Button_Index,1 GOTO EX_KEY BTFSC Scan_Button_Index,0 GOTO EX_KEY MOVLW D'5' MOVWF Scan_Button_Index GOTO CLEAN_KEY EX_KEY: DECF Scan_Button_Index CLEAN_KEY: RLF Scan_Button_Index,W ADDWF Scan_Button_Index,W ADDLW K1_Re_10s_Push_Status_BtPush MOVWF FSR MOVLW B'00001111' ANDWF INDF BTFSS Scan_Button_Index,2 GOTO Recover_Button_Index BTFSS Scan_Button_Index,0 GOTO Recover_Button_Index CLRF Scan_Button_Index GOTO CLR_Re_10s_Push_END Recover_Button_Index: INCF Scan_Button_Index CLR_Re_10s_Push_END: RETURN ;-------------------------------------------------------------------- BUTTON_Check: BANKSEL PORTA BTFSS KEY_BUF,1 BCF Button_buf,1 BTFSC KEY_BUF,1 BSF Button_buf,1 ;BTFSS PORTE,3 ;BSF Button_buf,1 ;BTFSC PORTE,3 ;BCF Button_buf,1 MOVLW B'00001111' ANDWF led8_buf SWAPF Button_buf,W IORWF led8_buf RETURN ;-------------------------------------------------------------------- Led8_Display: BTFSC led8_buf,0 BCf PORTC,0 BTFSS led8_buf,0 BSf PORTC,0 BTFSC led8_buf,1 BCf PORTC,7 BTFSS led8_buf,1 BSf PORTC,7 BTFSC led8_buf,2 BCf PORTC,3 BTFSS led8_buf,2 BSf PORTC,3 BTFSC led8_buf,3 BCf PORTC,4 BTFSS led8_buf,3 BSf PORTC,4 BTFSC led8_buf,4 BCf PORTC,5 BTFSS led8_buf,4 BSf PORTC,5 BTFSC led8_buf,5 BCf PORTC,2 BTFSS led8_buf,5 BSf PORTC,2 BTFSC led8_buf,6 BCf PORTC,6 BTFSS led8_buf,6 BSf PORTC,6 BTFSC led8_buf,7 BCf PORTC,1 BTFSS led8_buf,7 BSf PORTC,1 RETURN ;-------------------------------------------------------------------------------- ORG 0X07EE FONT_CONVERT: ADDWF PCL,F RETLW B'11000000' ; 0 RETLW B'11111001' ; 1 RETLW B'10100100' ; 2 RETLW B'10110000' ; 3 RETLW B'10011001' ; 4 RETLW B'10010010' ; 5 RETLW B'10000010' ; 6 RETLW B'11011000' ; 7 RETLW B'10000000' ; 8 RETLW B'10010000' ; 9 RETLW B'10001000' ; A RETLW B'10000011' ; B RETLW B'11000110' ; C RETLW B'10100001' ; D RETLW B'10000110' ; E RETLW B'10001110' ; F RETLW B'10111111' ; - ;============================================================================== End