发新帖本帖赏金 22.00元(功能说明)我要提问
返回列表
[PIC®/AVR®/dsPIC®产品]

自学PIC汇编笔记

[复制链接]
楼主: GeekyGeek
手机看帖
扫描二维码
随时随地手机跟帖
zhoujunfeng| | 2015-10-23 12:07 | 显示全部楼层
18F系列好像改进了.
有快速操作RAM区不用写bank
MOVLW   B'00000101'
    MOVWF   TRISA
    NOP
    MOVWF   INTCON
    NOP
BANKSEL    ANSELA   
    MOVWF   ANSELA           
    NOP
    MOVWF   CCPR3H
    NOP
    CLRF    CCPR3H
    NOP
    MOVWF   TRISB

使用特权

评论回复
zhoujunfeng| | 2015-10-23 12:07 | 显示全部楼层
一些经常操作的SFR不用写bank了.

使用特权

评论回复
zhoujunfeng| | 2015-10-23 12:13 | 显示全部楼层
最近在用18F45K22
好像有快速RAM和快速FSR

使用特权

评论回复
zhoujunfeng| | 2015-10-23 12:15 | 显示全部楼层
快速RAM和快速FSR不用写banksel
进入非快速RAM和FSR写banksel
再次进入快速RAM和快速FSR也不用写banksel

使用特权

评论回复
zhoujunfeng| | 2015-10-23 12:17 | 显示全部楼层
MOVLW   B'00000101'
    MOVWF   TRISA
    NOP
    MOVWF   INTCON
    NOP
BANKSEL    ANSELA   
    MOVWF   ANSELA           
    NOP
    MOVWF   CCPR3H
    NOP
    CLRF    CCPR3H
    NOP
    MOVWF   TRISB
ANSELA 需要bank一下再转到TRISB不用再写bank了

使用特权

评论回复
GeekyGeek|  楼主 | 2015-10-23 21:41 | 显示全部楼层
mzb2012 发表于 2015-10-23 11:55
赞一个,一直用C,最近在看pic30f的bootloader,汇编写的,确实头大,

一两年前有接过一项目,用XC16写dspic的bootloader。

使用特权

评论回复
mzb2012| | 2015-10-24 11:03 | 显示全部楼层
GeekyGeek 发表于 2015-10-23 21:41
一两年前有接过一项目,用XC16写dspic的bootloader。

楼主水平很高啊

使用特权

评论回复
GeekyGeek|  楼主 | 2015-10-24 16:11 | 显示全部楼层
本帖最后由 GeekyGeek 于 2015-10-24 21:16 编辑

几天没更新了,今天写了Watchdog的wake up功能。
步骤如下,Enable WDT-->Sleep-->Wait wake up
代码如下:
;/******************************************/
;/* Main Program */

;/*-----------------------------------------*/
;/* OSC:        8 MHz (external crystal)    */
;/* Feature:                                */
;/*    LED blinks 5 times (0.4s on,0.4s off)*/
;/*        Sleep                                    */
;/*        WDT wake up                            *
/;/*        Repeat                                    */
;/*******************************************/
LIST P=16F877A#include "p16F877A.inc"
; /*CONFIG BITS*/
; /*__config 0x3F76*/
__CONFIG _FOSC_HS & _WDTE_ON & _PWRTE_ON & _BOREN_ON & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CP_OFF
         CBLOCK 0x20
                TICKS_100US
                TICKS_10MS
                TICKS_400MS
                TICKS_1S
        ENDC
         LOOP_MAX    equ            0x24
REST        CODE            0x0000        ; /*processor reset vector*/
        goto            START        ; /*go to beginning of program*/
MAIN        CODE                        ; /*let linker place main program*/
START
        banksel            OPTION_REG
        bsf            OPTION_REG,PSA
        bsf            OPTION_REG,PS2
        bsf            OPTION_REG,PS1
        bsf            OPTION_REG,PS0
        banksel            LOOP_MAX
        movlw            0AH
        movwf            LOOP_MAX
        banksel     PORTB
        bcf            PORTB, RB7
        banksel            TRISB
        bcf            TRISB, TRISB7
LOOP
        call            Delay400ms
        movlw            80H
        banksel     PORTB
        xorwf            PORTB,1
        banksel            LOOP_MAX
        decfsz            LOOP_MAX
        goto            LOOP
        sleep
        nop
        goto           START      
;/***************************************************************************/
Delay100us
        banksel            TICKS_100US
        movlw            42H
        movwf            TICKS_100US
Tick100us
        decfsz            TICKS_100US
        goto            Tick100us
        return
Delay10ms
        banksel            TICKS_10MS
        movlw            64H
        movwf            TICKS_10MS
Tick10ms
        clrwdt
        call            Delay100us
        decfsz            TICKS_10MS
        goto            Tick10ms
        return
Delay400ms
        banksel            TICKS_400MS
        movlw            28H
        movwf            TICKS_400MS
Tick400ms
        clrwdt
        call            Delay10ms
        decfsz            TICKS_400MS
        goto            Tick400ms
        return
Delay1s
        banksel            TICKS_1S
        movlw            64H
        movwf            TICKS_1STick1s
        call            Delay10ms
        decfsz            TICKS_1S
        goto            Tick1s
        return
;/***************************************************************************/
        END

Proteus 仿真如下:今天又学了四条PIC汇编指令--nop, clrwdt, xorwf, sleep,  total 35条而已,指日可待。



WDT.png

使用特权

评论回复

打赏榜单

21ic小喇叭 打赏了 2.00 元 2015-11-23

GeekyGeek|  楼主 | 2015-10-24 16:53 | 显示全部楼层

呵呵,没有哦,混饭吃而已

使用特权

评论回复
ecoren| | 2015-10-25 20:03 | 显示全部楼层
传说中的汇编,

使用特权

评论回复
GeekyGeek|  楼主 | 2015-10-25 20:57 | 显示全部楼层
本帖最后由 GeekyGeek 于 2015-10-25 21:03 编辑

今天写的代码主要是用定时器实现延时
代码如下:
;/******************************************/
;/* Main Program */
;/*-----------------------------------------*/   
;/* OSC:      8 MHz (external crystal)    */
;/* Feature:      PORTB = LED1                */
;/*                    Delay 500ms                */
;/*                    PORTB = LED2                */
;/*                    Delay 500ms                */
;/*                    PORTB = LED3                */
;/*                    Delay 500ms                */
;/*                    PORTB = LED4                */
;/*                    Delay 500ms                */
;/*                    ... ...                      */
;/*                    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   0x20
      DELAY_MAX res      1
      OFFSET        res      1        
REST      CODE          0x0000      ; /*processor reset vector*/
      goto          START      ; /*go to beginning of program*/
MAIN      CODE                  ; /*let linker place main program*/
START
      banksel          TRISB
      clrf          TRISB
      banksel          PORTB
      clrf          PORTB
      banksel          OFFSET
      movlw          00H
      movwf          OFFSET      
LOOP
      banksel          OFFSET
      movf          OFFSET,W
      incf          OFFSET
      addwf          OFFSET,W
      movwf          PORTB
      call          DELAY
      goto          LOOP      
;/***************************************************************************/
DELAY
      banksel          DELAY_MAX
      movlw          0AH
      movwf          DELAY_MAX
      banksel          T1CON
      movlw          29H
      movwf          T1CON
TICK
      banksel          TMR1
      movlw          58H
      movwf          TMR1
      banksel          TMR1H
      movlw          9EH
      movwf          TMR1H
      banksel          PIR1
      bcf          PIR1,TMR1IF
WAIT
      btfss          PIR1,TMR1IF
      goto          WAIT
      decfsz          DELAY_MAX
      goto          TICK
      return
;/***************************************************************************/
      END

今天学了incf addwf movf btfss 四条新的PIC 汇编指令,35条已经学了一半。

Proteus 仿真结果如下:



DELAY.png

使用特权

评论回复
GeekyGeek|  楼主 | 2015-10-27 21:49 | 显示全部楼层
本帖最后由 GeekyGeek 于 2015-10-27 21:55 编辑

今天写的代码主要是看看andwf, andlw的用法,没什么实际价值。
代码如下:
;/******************************************/
;/* Main Program */;/*-----------------------------------------*/
;/* OSC:      8 MHz (external crystal)    */
;/* Feature:      ;/*            PORTB = Red1 LED          */
;/*            Delay 500ms                     */
;/*            PORTB = Green2 LED       */
;/*            Delay 500ms                    */
;/*            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   0x20
      DELAY_MAX res      1
      MASK        res      1


REST      CODE          0x0000      ; /*processor reset vector*/
      goto          START      ; /*go to beginning of program*/
MAIN      CODE                  ; /*let linker place main program*/
START
      banksel          TRISB
      clrf          TRISB
      banksel          PORTB
      clrf          PORTB


      banksel          MASK
      movlw          66H
      movwf          MASK
LOOP
      movlw          70H
      andwf          MASK,W
      movwf          PORTB
      call          DELAY


      movlw          0FH
      andwf      MASK,W
      andlw          04H
      movwf          PORTB
      call          DELAY
      goto          LOOP
       ;/***************************************************************************/
DELAY
      banksel          DELAY_MAX
      movlw          0AH
      movwf          DELAY_MAX
      banksel          T1CON
      movlw          29H
      movwf          T1CON
TICK
      banksel          TMR1
      movlw          58H
      movwf          TMR1
      banksel          TMR1H
      movlw          9EH
      movwf          TMR1H
      banksel          PIR1
      bcf          PIR1,TMR1IF
WAIT
      btfss          PIR1,TMR1IF
      goto          WAIT
      decfsz          DELAY_MAX
      goto          TICK
      return
;/***************************************************************************/
      END




今天学了两条新的PIC汇编指令:andwf和andlw. 发现如果写成movlw F0H,编译会出错, 后来改成movlw 70H就没问题,是不是movlw是sign char的范围? 还没去细究。
proteus 仿真结果如下:





Colors.png

使用特权

评论回复
GeekyGeek|  楼主 | 2015-10-28 22:14 | 显示全部楼层
今天学了两条新的PIC汇编指令:andwf和andlw. 发现如果写成movlw F0H,编译会出错

知道为什么了, 只需要将movlw F0H 改为movlw 0F0H就可以了。

使用特权

评论回复
zhoujunfeng| | 2015-10-30 08:58 | 显示全部楼层
楼主水平见长

使用特权

评论回复
GeekyGeek|  楼主 | 2015-10-30 23:59 | 显示全部楼层
本帖最后由 GeekyGeek 于 2015-10-31 00:07 编辑

@zhoujunfeng  没长进,今天遇到的问题,到现在还没搞定


今天写的是定时器TMR0中断,每2ms产生一次中断,中断里面TICK_COUNTER++,
MAIN里面判断if  TCIK_COUNTER >= 250, 是就reset TICK_COUNTER, 翻转PORTB.
预期每500ms翻转PORTB, 仿真结果差太大,150us翻转一次。郁闷,哪里错了呢?

代码如下:
;/******************************************/
;/* Main Program */
;/*-----------------------------------------*/
   ;/* OSC:      8 MHz (external crystal)    */
;/* Feature:      TIMR0 timing 2 ms          */
;/*            count++ every timer overflow*/
;/*            if count = 250, swap PORTB  */
;/*            reset count                */
;/*            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      0x20
      TICK_COUNTER res 1
org      000H
      goto START
org      004H
      goto TMR_ISR
TMR_ISR
      banksel INTCON
      btfss  INTCON,TMR0IF
     goto   EXTIN
      bcf      INTCON,TMR0IF
      banksel TICK_COUNTER
      incf      TICK_COUNTER
      banksel TMR0
      movlw  06H
      movwf      TMR0
EXTIN
      retfie


MAIN      CODE
START
        banksel TICK_COUNTER
      movlw      0H
      movwf      TICK_COUNTER


      banksel OPTION_REG
      movlw      07H
      movwf      OPTION_REG


      banksel INTCON
      movlw      0E0H
      movwf      INTCON


      banksel TMR0
      movlw  06H
      movwf      TMR0
      banksel PORTB
      movlw      0F0H
      movwf  PORTB
      banksel TRISB
      clrf      TRISB


LOOP
      banksel TICK_COUNTER
      movlw      0FAH
      subwf      TICK_COUNTER
      btfss      STATUS,C
      goto LOOP
      clrf TICK_COUNTER
      banksel PORTB
      swapf PORTB
      goto LOOP


            END



天接触了retfie,subwf,swapf三个新的PIC汇编指令,可惜还有问题(不是预期的每500ms 翻转PORTB一次,高手们帮忙看看)

仿真如下:




TIMER.png

使用特权

评论回复

打赏榜单

21ic小喇叭 打赏了 3.00 元 2015-11-23

GeekyGeek|  楼主 | 2015-10-31 13:08 | 显示全部楼层
本帖最后由 GeekyGeek 于 2015-10-31 13:19 编辑

可能是没做中断现场保护。

下面的代码就没问题了,
;/******************************************/
;/* Main Program */
;/*-----------------------------------------*/

;/* OSC:      8 MHz (external crystal)    */
;/* Feature:      TIMR0 timing 2 ms          */
;/*            count++ every timer overflow*/
;/*            if count = 250, swap PORTB  */
;/*            reset count                */
;/*            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

cblock  0x20
      TICK_COUNTER
endc

org      000H
      goto START
org      004H
      goto TMR_ISR
TMR_ISR
      bcf      INTCON,TMR0IF
      banksel TMR0
      movlw  06H
      movwf      TMR0


      banksel TICK_COUNTER
      incf      TICK_COUNTER
      banksel STATUS
      bcf      STATUS,Z
      banksel TICK_COUNTER
      movlw      0FAH
      subwf      TICK_COUNTER
      banksel STATUS
      btfss      STATUS,Z
      goto    EXTIN
      banksel TICK_COUNTER
      clrf      TICK_COUNTER
      banksel PORTB
      swapf PORTB
EXTIN
      retfie
   
MAIN      CODE


START
        banksel TICK_COUNTER
      movlw      0H
      movwf      TICK_COUNTER
      banksel OPTION_REG
      movlw      03H
      movwf      OPTION_REG
      banksel INTCON
      movlw      0E0H
      movwf      INTCON
      banksel TMR0
      movlw  06H
      movwf      TMR0
      banksel PORTB
      movlw      0F0H
      movwf  PORTB
      banksel TRISB
      clrf      TRISB
      
LOOP
      goto LOOP
            
      END
仿真如下:


TMR0.png

使用特权

评论回复
duxingkei| | 2015-10-31 21:26 | 显示全部楼层
我也讨厌汇编,虽然 松翰 PIC AVR都会用,基本用的少,还是用C爽,写程序都舒服,不用那么烧脑筋,
汇编唯一的好处就是运行看得见。
如果楼主没有实际项目必须要有汇编,建议别浪费时间!!!!

使用特权

评论回复
GeekyGeek|  楼主 | 2015-11-1 13:27 | 显示全部楼层
本帖最后由 GeekyGeek 于 2015-11-1 13:36 编辑

上一篇的代码虽然没问题了,但是实际上是避开中断现场保护,是一种偷懒的做法。逃避不是最好的办法,
下面的代码就带中断现场保护:
;/******************************************/;/* Main Program */
;/*-----------------------------------------*/
;/* OSC:      8 MHz (external crystal)    */
;/* Feature:      TIMR0 timing 2 ms          */
;/*            count++ every timer overflow*/
;/*            if count = 250, swap PORTB  */
;/*            reset count                */
;/*            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

CBLOCK          0x70
          TICK_COUNTER
          W_TEMP
          STATUS_TEMP
          PCLATH_TEMP
         FSR_TEMP
ENDC
org          00H
          goto    START
org          04H
          goto    TMR_ISR
TMR_ISR
      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          TICK_COUNTER
      incf          TICK_COUNTER

      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    CODE
START
        banksel          TICK_COUNTER
      movlw      0H
      movwf      TICK_COUNTER
      banksel          OPTION_REG
      movlw      03H
      movwf      OPTION_REG

      banksel    TMR0
      movlw          06H
      movwf      TMR0
      banksel          INTCON
      clrf          INTCON
      bsf          INTCON, TMR0IE
      bsf          INTCON, GIE
      banksel          PORTB
      movlw      0F0H
      movwf          PORTB
      banksel          TRISB
      clrf          TRISB


LOOP
      movlw      0FAH
      subwf      TICK_COUNTER,W
      btfss      STATUS,Z
      goto          LOOP
     movlw          0H
      bcf         INTCON,GIE
      movwf          TICK_COUNTER
      bsf          INTCON,GIE
      banksel          PORTB
      swapf          PORTB
      goto          LOOP

      END


加个中断现场保护,调试了好久了,仿真结果一直不OK, 开始一直怀疑保护没弄好,
后来将subwf      TICK_COUNTER 改为 subwf      TICK_COUNTER, W 就OK了,
不知道是为什么。

仿真如下


TMR0.png

使用特权

评论回复
它山之石| | 2015-11-3 14:01 | 显示全部楼层
本帖最后由 它山之石 于 2015-11-3 14:02 编辑
GeekyGeek 发表于 2015-11-1 13:27
上一篇的代码虽然没问题了,但是实际上是避开中断现场保护,是一种偷懒的做法。逃避不是最好的办法,
下面 ...
与楼主一起学习啦。:)
subwf      TICK_COUNTER 相当于subwf TICK_COUNTER,1,将减法完成的结果存入TICK_COUNTER,这样你每次循环时候TICK_COUNTER的值就被你人为的改变了。  
subwf      TICK_COUNTER, W 是将减法结果存入W,因为你每次循环开始都会对W重新赋值,所以没有影响,结果是对的。

使用特权

评论回复
GeekyGeek|  楼主 | 2015-11-6 22:21 | 显示全部楼层
本帖最后由 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没问题了,但是还是不知道什么原因造成的。
仿真结果如下






Debounce.png

使用特权

评论回复

打赏榜单

21ic小喇叭 打赏了 3.00 元 2015-11-23

发新帖 本帖赏金 22.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则