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