?? 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 + -