📄 pic16f877-led.asm
字号:
LIST P=16f877A
#INCLUDE <P16f877A.INC>
;***************************************************
#define dis1 0x7f
#define dis2 0xBf
#define dis3 0xDf
#define dis4 0xEf
#define dis5 0xf7
#define dis6 0xfB
;***************************************************
R1 equ 0x21
R2 equ 0x22
R3 equ 0x23
count equ 0x24
disnum equ 0x25
numg equ 0x26
nums equ 0x27
numb equ 0x28
numq equ 0x30
numw equ 0x30
numsw equ 0x31
num equ 0x32
ADR equ 0x33
;***************************************************
org 0x00
nop
goto START
org 0x04
retfie
;*****************共阴极数码管BCD码显示***********************
GetDisNum:
addwf PCL,f
retlw #3F ;0
retlw #06 ;1
retlw #5B ;2
retlw #4F ;3
retlw #66 ;4
retlw #6D ;5
retlw #7D ;6
retlw #07 ;7
retlw #7F ;8
retlw #67 ;9
;***************************************************
;-------------------PROGRAM------------------------
org 0X40
START:
banksel TRISD
movlw 0x00
movwf TRISD
movwf TRISB
movlw 0xff
movwf TRISC
banksel PORTD
movlw 0xff
movfw PORTD
clrf count
clrf num
clrf numb
clrf nums
clrf numg
goto xx
tt:
movlw .1
call GetDisNum
movwf PORTB
movlw dis1
movwf PORTD
call delay10ms
movlw .2
call GetDisNum
movwf PORTB
movlw dis2
movwf PORTD
call delay10ms
movlw .3
call GetDisNum
movwf PORTB
movlw dis3
movwf PORTD
call delay10ms
movlw .4
call GetDisNum
movwf PORTB
movlw dis4
movwf PORTD
call delay10ms
movlw .5
call GetDisNum
movwf PORTB
movlw dis5
movwf PORTD
call delay10ms
movlw .6
call GetDisNum
movwf PORTB
movlw dis6
movwf PORTD
call delay10ms
goto tt
xx:
call AD_trans
movfw ADR
movwf num
call bintobcd
call displayBCD
goto xx
;***************************************************
;======================按键子程序===================
;***************************************************
key:
btfsc PORTC,0
goto knext1
call delay10ms
btfsc PORTC,0
goto knext1
goto key_back
knext1:
btfsc PORTC,1
goto knext2
call delay10ms
btfsc PORTC,1
goto knext2
call key_add
knext2:
btfsc PORTC,2
goto knext3
call delay10ms
btfsc PORTC,2
goto knext3
call key_sub
knext3:
btfsc PORTC,3
goto knext4
call delay10ms
btfsc PORTC,3
goto knext4
call key_cof
goto key
knext4:
return
key_back:
return
key_add:
incf count,f
return
key_sub:
decf count,f
return
key_cof:
return
;***************************************************
;-------------------显示程序------------------------
;***************************************************
displayBCD:
movfw numb
call GetDisNum
movwf PORTB
movlw dis4
movwf PORTD
call delay10ms
movfw nums
call GetDisNum
movwf PORTB
movlw dis5
movwf PORTD
call delay10ms
movfw numg
call GetDisNum
movwf PORTB
movlw dis6
movwf PORTD
call delay10ms
return
;*************************************************************
;-------------------二进制转BCD码子程序-------------
;***************************************************
bintobcd:
clrf numg
clrf nums
clrf numb
movlw 64H
BAI subwf num,f ;NUM-100>0,则NUMB+1
btfss STATUS,0
goto BAI1
incf numb,f
goto BAI
BAI1 addwf num,f
movlw 0ah
SHI subwf num,f
btfss STATUS,0
goto GE
incf nums,f
goto SHI
GE addwf num,f
movfw num
movwf numg
return
;***************************************************
;-------------------AD采集子程序--------------------
;***************************************************
adinit:
nop
AD_trans:
BSF STATUS,5
MOVLW 0EH
MOVWF ADCON1 ;设RA0为模拟输入,采样结果左对齐
BCF STATUS,5
MOVLW 41H
MOVWF ADCON0 ;选择A/D转换时钟,选择采样通道0,开采样允许位
BSF ADCON0,2 ;采样开始
LOOP_AD:
NOP
BTFSC ADCON0,2 ;采样结束?
GOTO LOOP_AD ;否,转LOOP_AD
MOVF ADRESH,0 ;是,读取采样结果
MOVWF ADR
RETURN
;***************************************************
delay10ms:
movlw 0x02
movwf R2
LOOP01:
movlw 0xfe
movwf R1
LOOP02:
nop
decfsz R1,1
goto LOOP02
decfsz R2,1
goto LOOP01
return
;***************************************************
delay1S:
MOVLW #0AH ;1s DELAY
MOVWF R3
LOOP1: MOVLW #64H
MOVWF R2
LOOP2: MOVLW #0FAH
MOVWF R1
LOOP3: NOP
DECFSZ R1,1
GOTO LOOP3
DECFSZ R2,1
GOTO LOOP2
DECFSZ R3,1
GOTO LOOP1
RETURN
;*************************************************************
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -