本帖最后由 GeekyGeek 于 2015-11-7 16:44 编辑
又有好多天没更新了,不是在偷懒,是最近写的一个汇编程序碰到古怪的问题,
目前有workround的方法,运行的很好。
实现的是轮询是否按键被按下,按下了灯就全灭,释放了灯就全亮,带防抖功能,
代码如下:
;/******************************************/
;/* Main Program */
;/*-----------------------------------------*/
;/* OSC: 8 MHz (external crystal) */
;/* Feature: TIMR0 timing 1 ms */
;/* debounce KEY(RB0) input */
;/* KEY pressed, PORTD output 0x00 */
;/* KEY release, PORTD output 0xFF */
;/* Repeat */
;/*******************************************/
LIST P=16F877A#include "p16F877A.inc"
; /*CONFIG BITS*/
; /*__config 0x3F32*/
__CONFIG _FOSC_HS & _WDTE_OFF & _PWRTE_ON & _BOREN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CP_OFF
UDATA 0xA0
FLAG res 1
STATE_KEY res 1
TEMP res 1
COUNTER res 1
START res 1
LOW_TH res 1
HIGH_TH res 1
CBLOCK 0x70
W_TEMP
STATUS_TEMP
PCLATH_TEMP
FSR_TEMP
ENDC
TIME_ EQU H'00'
DEBOUNCE_ EQU H'01'
KEY_ EQU H'01'
org 00H
goto MAIN
org 04H
goto TMR_ISR
TMR_ISR
banksel W_TEMP
movwf W_TEMP
swapf STATUS,W
clrf STATUS
movwf STATUS_TEMP
movf FSR,W
movwf FSR_TEMP
movf PCLATH,W
movwf PCLATH_TEMP
clrf PCLATH
banksel INTCON
bcf INTCON,TMR0IF
banksel TMR0
movlw 06H
movwf TMR0
banksel FLAG
;bsf FLAG,TIME_
movf FLAG,W
iorlw 01H
movwf FLAG
EXTIN
banksel PCLATH_TEMP
movf PCLATH_TEMP,W
movwf PCLATH
movf FSR_TEMP,W
movwf FSR
movf STATUS_TEMP,W
movwf STATUS
swapf W_TEMP,F
swapf W_TEMP,W
retfie
MAIN
banksel FLAG
movlw 00H
movwf FLAG
movlw 32H
movwf START
movlw 64H
movwf HIGH_TH
movlw 0H
movwf LOW_TH
movf START,W
movwf COUNTER
banksel PORTB
movf PORTB,W
andlw 02H
banksel STATE_KEY
movwf STATE_KEY
banksel OPTION_REG
movlw 02H
movwf OPTION_REG
banksel TMR0
movlw 06H
movwf TMR0
banksel INTCON
clrf INTCON
bsf INTCON, TMR0IE
bsf INTCON, GIE
banksel TRISD
clrf TRISD
banksel PORTD
clrf PORTD
LOOP
banksel FLAG
btfss FLAG,TIME_
goto LOOP
bcf FLAG,TIME_
btfss FLAG,DEBOUNCE_
goto Check_Debounce_
nop
goto Do_Debounce_
nop
LED
btfss STATE_KEY,KEY_
goto LED_OFF
nop
goto LED_ON
nop
goto LOOP
LED_ON
banksel PORTD
movlw 0FFH
movwf PORTD
goto LOOP
LED_OFF
banksel PORTD
movlw 00H
movwf PORTD
goto LOOP
Check_Debounce_
banksel PORTB
movf PORTB,W
banksel STATE_KEY
andlw 02H
xorwf STATE_KEY,W
movwf TEMP
btfss TEMP,KEY_
goto LED
nop
;bsf FLAG,DEBOUNCE_
movf FLAG,W
iorlw 02H
movwf FLAG
nop
goto LED
Do_Debounce_
banksel PORTB
btfsc PORTB,KEY_
goto Count_Up
goto LED
goto Count_Dw
goto LED
Count_Up
banksel COUNTER
incf COUNTER
movf HIGH_TH,W
subwf COUNTER,W
banksel STATUS
btfss STATUS,Z
goto LED
banksel START
movf START,W
movwf COUNTER
;bsf STATE_KEY, KEY_
movf STATE_KEY
movlw 02H
movwf STATE_KEY
;bcf FLAG,DEBOUNCE_
movf FLAG
andlw 0FDH
movwf FLAG
goto LED
Count_Dw
banksel COUNTER
decf COUNTER
movf LOW_TH,W
subwf COUNTER,W
banksel STATUS
btfss STATUS,Z
goto LED
movf START,W
movwf COUNTER
;bcf STATE_KEY,KEY_
movf STATE_KEY
andlw 0FDH
movwf STATE_KEY
;bcf FLAG,DEBOUNCE_
movf FLAG
andlw 0FDH
movwf FLAG
goto LED
END
新学了iorlw,btfsc,decf 三条PIC汇编指令
上面的代码UDATA那段如果0xA0改成0x20,运行怎么都不对,按下键,灯不灭。大家有没有遇到类似问题啊?虽然改成0xA0没问题了,但是还是不知道什么原因造成的。
仿真结果如下
|