我是初学PIC的,下面是我个人第一个程序,不过哪个延时子程序是在网上下的 请拍磚指教.
;红绿蓝LED循環控制 LIST P=16F877A INCLUDE "P16F877A.INC" COUNTER EQU 25H ;定義25H为計數器 ORG 0000H NOP 主程序 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; BSF STATUS,5 ;选择体1 MOVLW 0F8H ;設置RC低3位为輸出 MOVWF TRISC MOVLW 04H ;設置RB2为输入 MOVWF TRISB BCF STATUS,5 ;选择体0 MOVLW 00H ;設置RC低3位初始化后为0 MOVWF PORTC MOVLW 0FFH ;設置RB2位初始化后为1 CLRF COUNTER ;計數器清0 CYC CALL SWITCH ;调用開關控制子程序 GOTO CYC ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 按键控制子程序 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SWITCH BTFSC PORTB,2 ;檢測RB2有否按下,有跳过下一条指令 GOTO BO ;否,繼續檢測 PAGESEL TIME10MS ;转入TIME10MS延时子程序页 CALL TIME10MS ;调用TIME10MS延時子程序 PAGESEL SWITCH ;转回SWITCH程序页 BTFSC PORTB,2 ;再次檢測RB2有否按下,有跳过下一条指令 GOTO BO ;否,继续檢測 TOFF BTFSS PORTB,2 ;檢測RB2有否放开,有跳过下一条指令 GOTO TOFF ;否,繼續檢測 PAGESEL TIME10MS ;转入TIME10MS延时子程序页 CALL TIME10MS ;调用TIME10MS延時子程序 PAGESEL SWITCH ;转回SWITCH程序页 BTFSS PORTB,2 ;再檢測RB2有否放开,有跳过下一条指令 GOTO TOFF ;否,繼續檢測 INCF COUNTER ;計數器加1为0跳过下一条指令 MOVLW 03H ;屏蔽計數器高6位 ANDWF COUNTER,W ;檢測計數器 ADDWF PCL,F ;根据計數器值狀態调用相應子程序 GOTO LED4 GOTO LED1 GOTO LED2 GOTO LED3 BO NOP RETURN ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 第1种亮灯模式子程序 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; LED1 MOVLW 04H ;点亮RED LED MOVWF PORTC PAGESEL TIME1S ;转入TIME1S延时子程序页 CALL TIME1S ;延時1秒 PAGESEL LED1 ;转回LED1程序页 CALL SWITCH ;檢測按键狀態 GOTO LED1 ;繼續返回点亮RED LED ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 第2种亮灯模式子程序 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; LED2 MOVLW 02H ;点亮GREEN LED MOVWF PORTC PAGESEL TIME1S ;转入TIME1S延时子程序页 CALL TIME1S ;延時1秒 PAGESEL LED2 ;转回LED2程序页 CALL SWITCH ;檢測按键狀態 GOTO LED2 ;繼續返回点亮GREEM LED ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 第3种亮灯模式子程序 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; LED3 MOVLW 01H ;点亮BLUE LED MOVWF PORTC PAGESEL TIME1S ;转入TIME1S延时子程序页 CALL TIME1S ;延時1秒 PAGESEL LED3 ;转回LED3程序页 CALL SWITCH ;檢測按键狀態 GOTO LED3 ;繼續返回点亮BLUE LED ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 第4种亮灯模式子程序 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; LED4 INCF PORTC ;順序点亮B,G,B+G,R,R+B,R+G PAGESEL TIME1S ;转入TIME1S延时子程序页 CALL TIME1S ;延時1秒 PAGESEL LED4 ;转回LED4程序页 CALL SWITCH ;檢測按键狀態 GOTO LED4 ;繼續順序点亮B,G,B+G,R,R+B,R+G ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 延時10MS子程序 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; TIME10MS MOVLW 04H ; MOVWF 23H L1 MOVLW 0FFH MOVWF 24H L2 DECFSZ 24H GOTO L2 DECFSZ 23H GOTO L1 RETURN ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 延時1S子程序 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; TIME1S MOVLW 06H MOVWF 20H LOOP1 MOVLW 0EBH MOVWF 21H LOOP2 MOVLW 0ECH MOVWF 22H LOOP3 DECFSZ 22H GOTO LOOP3 CALL SWITCH DECFSZ 21H GOTO LOOP2 DECFSZ 20H GOTO LOOP1 RETURN END |