📄 source.asm
字号:
LIST P=16F877A
INCLUDE "P16F877A.INC"
;*************************************************
RANDOM EQU 20H
CLOCK1 EQU 21H
CLOCK2 EQU 22H
COUNTERL EQU 23H
COUNTERH EQU 24H
CNT1 EQU 25H
CNT2 EQU 26H
CNT EQU 27H
TEMP1 EQU 28H
TEMP2 EQU 29H
TEMP3 EQU 2AH
RLT EQU 2BH
LED0 EQU 2CH
LED1 EQU 2DH
LED2 EQU 2EH
LED3 EQU 2FH
;*************************************************
ORG 00H
GOTO START
; nop
START
BSF STATUS,RP0
BCF STATUS,RP1
CLRF TRISB
CLRF TRISC
CLRF TRISD
MOVLW 0FFH
MOVWF TRISA
MOVLW 06H
MOVWF ADCON1
BCF STATUS,RP0
LOOP2
MOVLW 00H
MOVWF PORTC
MOVWF PORTD
MOVWF COUNTERL ;计数位初始化,清零
MOVWF COUNTERH
LOOP1
INCF RANDOM,1 ;得随机数,共256种可能性
BTFSS PORTA,0
GOTO LOOP1 ;扫描按钮开关
MOVLW 0FFH ;按键后灯灭
MOVWF PORTD
MOVLW 00H
MOVWF PORTB
CALL DELAY ;延时随机时间
MOVLW 00H
MOVWF PORTD ;重新发光
;***************************************************
LOOP3
BTFSC PORTA,0
GOTO LOOP4 ;从loop4跳出到LED输出
INCFSZ COUNTERL,F
GOTO TIME
INCF COUNTERH,F
TIME
CALL TIMER
GOTO LOOP3
LOOP4
CALL BCD
CALL GETLED
LOOP5
MOVLW 01H ;led输出
MOVWF PORTC
MOVF LED0,0
CALL TABLE
MOVWF PORTB
CALL TIMER
MOVLW 02H
MOVWF PORTC
MOVF LED1,0
CALL TABLE
MOVWF PORTB
CALL TIMER
MOVLW 04H
MOVWF PORTC
MOVF LED2,0
CALL TABLE
MOVWF PORTB
CALL TIMER
MOVLW 08H
MOVWF PORTC
MOVF LED3,0
CALL TABLE
MOVWF PORTB
CALL TIMER
; BTFSC PORTA,0
; GOTO LOOP2
GOTO LOOP5
;**************************************************
; 子程序
;**************************************************
;*******************随机时间产生*******************
DELAY
D2 MOVLW 0FFH
MOVWF CLOCK2
D1 MOVLW 05FH
MOVWF CLOCK1 ;first TURN
D3 DECFSZ CLOCK1
GOTO D3
DECFSZ CLOCK2
GOTO D1
decfsz RANDOM
goto D2
RETURN
;*******1ms延时程序**************
TIMER
MOVLW D'09'
MOVWF CNT2
LO2
MOVLW D'33' ;1ms延时
MOVWF CNT1
LO1
DECFSZ CNT1,1
GOTO LO1
DECFSZ CNT2,1
GOTO LO2
RETURN
;********BCD转换*****************
BCD
MOVF COUNTERL,W
MOVWF TEMP2
MOVF COUNTERH,W
MOVWF TEMP3
CLRF COUNTERL
CLRF COUNTERH
CLRF RLT
BCF STATUS,C
MOVLW 10H
MOVWF CNT
LOOPC
RLF TEMP2,F
RLF TEMP3,F
RLF COUNTERL,F
RLF COUNTERH,F
RLF RLT,F
DECFSZ CNT,F
GOTO ADJDEC
RETLW 0
ADJDEC
MOVLW COUNTERL
MOVWF FSR
CALL ADJBCD
MOVLW COUNTERH
MOVWF FSR
CALL ADJBCD
MOVLW RLT
MOVWF FSR
CALL ADJBCD
GOTO LOOPC
ADJBCD
MOVLW 03H
ADDWF INDF,W
MOVWF TEMP1
BTFSC TEMP1,3
MOVWF INDF
MOVLW 30H
ADDWF INDF,W
MOVWF TEMP1
BTFSC TEMP1,7
MOVWF INDF
RETLW 0
;********获得LED片选偏移****************
GETLED
MOVF COUNTERL,W
MOVWF LED0
MOVWF LED1
SWAPF LED1,F
MOVF COUNTERH,W
MOVWF LED2
MOVWF LED3
SWAPF LED3,F
MOVLW 0FH
ANDWF LED0,F
ANDWF LED1,F
ANDWF LED2,F
ANDWF LED3,F
RETURN
;**************数码管编码********************
TABLE
addwf PCL,F ;相对寻址法
retlw 3FH
retlw 06H
retlw 5BH
retlw 4FH
retlw 66H
retlw 6DH
retlw 7DH
retlw 07H
retlw 7FH
retlw 6FH
;*************LED片选编码*********************
;TABLE2
; ADDWF PCL,F
; RETLW 0EH
; RETLW 0DH
; RETLW 0BH
; RETLW 07H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -