首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MPLab汇编语言延迟

MPLab汇编语言延迟
EN

Stack Overflow用户
提问于 2011-12-06 07:06:25
回答 1查看 2.2K关注 0票数 1

到目前为止,我编写的代码只是不停地闪烁,不管哪个开关是高的还是低的。我似乎不知道如何使一个开关比其他开关更快,因为它要么以相同的速度闪烁所有开关,要么保持稳定(不眨眼)。有人能帮我吗?

任务:

编写一个程序,扫描开关设置和调整闪烁率和LED根据这些开关设置。

您的任务是编写一个程序来检测开关设置,并减缓LED的闪烁,因为每个开关都是从低到高设置的。你的程序应该是这样的。注意: ICSA.asm和switches.asm包含您需要的部分内容。

  1. 扫描开关

如果开关1是高的,那么改变闪烁计时器,使它闪慢。

如果开关2是高的,那么改变闪烁计时器,使它闪慢。

如果开关3是高的,那么改变闪烁计时器,使它闪慢。

如果开关4是高的,那么改变闪烁计时器,使它闪慢。

如果开关5是高的,那么改变闪烁计时器,使它闪慢。

如果开关6是高的,那么改变闪烁计时器,使它闪慢。

如果开关7是高的,那么改变闪烁计时器,使它闪慢。

如果开关8较高,则更改闪烁计时器,使其闪烁速度较慢的

  • 闪烁LED

  • Goto以扫描开关

我的守则:

代码语言:javascript
运行
复制
;=============================================================================
;   Assembled using MPASM 7.4
;   Modified for 20Mhz at 9600 baud
;=============================================================================
;   Include Files:  p16f873A.inc    V1.00
;=============================================================================
;   The program 
;   1.  Turns RB7 on and off
;   2.  Transmits characters
;
;=============================================================================

list p=16f873A, st=OFF, x=OFF, n=0
errorlevel -302
#include <p16f873A.inc>
__CONFIG _BODEN_OFF & _CP_OFF & _PWRTE_ON & _WDT_OFF &  _HS_OSC & _DEBUG_OFF & _CPD_OFF & _LVP_ON
;
;-----------------------------------------------------------------------------
; RS232 Constants
RTS_OUTPUT  EQU 1   ;Port B Pin 1 output for flow control
CTS_INPUT   EQU 2   ;Port B Pin 2 input for flow control
BAUD_CONSTANT   EQU 0x81    ;Constant for baud generator for 9600 baud 20MHz


;-----------------------------------------------------------------------------
;Variables in bank0

    CBLOCK  0x20

    counter1:   1   ;delay counter
    counter2:   1
    counter3:   1

    ENDC

;=============================================================================
;Reset vector code

    ORG 0x0000 

ResetVector 
    pagesel Init_RS232      ;select page for Init_RS232 
    goto    Init_RS232      ;go to Init_RS232

;=============================================================================
;Start of code 
    ORG 0x0600      ;Use page 6

;Set up USART for asynchronous comms
;Routine is only called once and can be placed in-line saving a call and return
;This routine returns in bank0

Init_RS232
    banksel PORTB           ;change to PORTB bank
    bsf PORTB, RTS_OUTPUT   ;set RTS off before setting as output
    banksel TRISB           ;change to TRISB bank
    bcf TRISB, RTS_OUTPUT   ;enable RTS pin as output
    movlw   BAUD_CONSTANT   ;set baud rate 
    movwf   SPBRG
    bsf TXSTA, BRGH         ;baud rate high speed option
    bsf TXSTA, TXEN         ;enable transmission
    banksel RCSTA           ;change to RCSTA bank
    bsf RCSTA, CREN         ;enable reception
    bsf RCSTA, SPEN         ;enable serial port

Init_TRISA

Init_TRISB
    banksel TRISB       ;set i/o port data direction
    bcf TRISB, 0x07     ;output=0

Send
    banksel RCSTA
    bcf RCSTA, CREN         ;disable reception - clear reception
    bsf RCSTA, CREN         ;enable reception

    pagesel Blink
    call Blink

check

    pagesel Send
    goto Send

;----------------------------------------------------------------------------
Check_switches

;output 0 to decoder
    banksel PORTB
    bcf PORTB, 0x04     ;output=0=RB4=decoder input A (low order)
    bcf PORTB, 0x05     ;output=0=RB5=decoder input B
    bcf PORTB, 0x06     ;output=0=RB6=decoder input C (high order)      
    nop                 ;NOPs - 1 micro second delay to compensate for 4051 chips with slightly slower specifications
    nop
    nop 
    nop                 
    nop
    pagesel delay01
    banksel PORTC
    btfsc PORTC,0x05    ;RC5
    call delay01

;output 1 to decoder
    banksel PORTB
    bsf PORTB, 0x04     ;output=0=RB4=decoder input A (low order)
    bcf PORTB, 0x05     ;output=0=RB5=decoder input B
    bcf PORTB, 0x06     ;output=0=RB6=decoder input C (high order)      
    nop                 ;NOPs to compensate for chips with slightly slower specifications
    nop 
    nop
    nop 
    nop
    pagesel delay01
    banksel PORTC
    btfsc PORTC,0x05    ;RC5
    call delay01

;output 2 to decoder
    banksel PORTB
    bcf PORTB, 0x04     ;output=0=RB4=decoder input A (low order)
    bsf PORTB, 0x05     ;output=0=RB5=decoder input B
    bcf PORTB, 0x06     ;output=0=RB6=decoder input C (high order)      
    nop                 ;NOPs to compensate for chips with slightly slower specifications
    nop 
    nop 
    nop
    nop
    pagesel delay01
    banksel PORTC
    btfsc PORTC,0x05    ;RC5
    call delay01

;output 3 to decoder
    banksel PORTB
    bsf PORTB, 0x04     ;output=0=RB4=decoder input A (low order)
    bsf PORTB, 0x05     ;output=0=RB5=decoder input B
    bcf PORTB, 0x06     ;output=0=RB6=decoder input C (high order)      
    nop                 ;NOPs to compensate for chips with slightly slower specifications
    nop
    nop 
    nop 
    nop
    pagesel delay01
    banksel PORTC
    btfsc PORTC,0x05    ;RC5
    call delay01

;output 4 to decoder
    banksel PORTB
    bcf PORTB, 0x04     ;output=0=RB4=decoder input A (low order)
    bcf PORTB, 0x05     ;output=0=RB5=decoder input B
    bsf PORTB, 0x06     ;output=0=RB6=decoder input C (high order)      
    nop                 ;NOPs to compensate for chips with slightly slower specifications
    nop 
    nop
    nop 
    nop
    pagesel delay01
    banksel PORTC
    btfsc PORTC,0x05    ;RC5
    call delay01

;output 5 to decoder
    banksel PORTB
    bsf PORTB, 0x04     ;output=0=RB4=decoder input A (low order)
    bcf PORTB, 0x05     ;output=0=RB5=decoder input B
    bsf PORTB, 0x06     ;output=0=RB6=decoder input C (high order)      
    nop                 ;NOPs to compensate for chips with slightly slower specifications
    nop
    nop 
    nop 
    nop
    pagesel delay01
    banksel PORTC
    btfsc PORTC,0x05    ;RC5
    call delay01

;output 6 to decoder
    banksel PORTB
    bcf PORTB, 0x04     ;output=0=RB4=decoder input A (low order)
    bsf PORTB, 0x05     ;output=0=RB5=decoder input B
    bsf PORTB, 0x06     ;output=0=RB6=decoder input C (high order)      
    nop                 ;NOPs to compensate for chips with slightly slower specifications
    nop
    nop 
    nop 
    nop
    pagesel delay01
    banksel PORTC
    btfsc PORTC,0x05    ;RC5
    call delay01

;output 7 to decoder
    banksel PORTB
    bsf PORTB, 0x04     ;output=0=RB4=decoder input A (low order)
    bsf PORTB, 0x05     ;output=0=RB5=decoder input B
    bsf PORTB, 0x06     ;output=0=RB6=decoder input C (high order)      
    nop                 ;NOPs to compensate for chips with slightly slower specifications
    nop
    nop 
    nop 
    nop
    pagesel delay01
    banksel PORTC
    btfsc PORTC,0x05    ;RC5
    call delay01

    pagesel Check_switches
    goto Check_switches

;----------------------------------------------------------------------------       
Blink
    pagesel Light_on
    call Light_on
    pagesel delay01
    call delay01
    pagesel Light_off
    call Light_off
    pagesel delay01
    call delay01
    return 

Light_on
    banksel PORTB
    bsf PORTB, 0x07     ;RB7 = power on high
    return

Light_off
    banksel PORTB
    bcf PORTB, 0x07     ;RB7 = power off low
    return      

;----------------------------------------------------------------------------
delay01                     ;152ms counter1=00, counter2=00
    movlw 0x00
    banksel counter1
    movwf counter1
    movlw 0x00
    banksel counter2
    movwf counter2
    movlw 0x05  
    banksel counter3
    movwf counter3

delay02 
    banksel counter1    ;1
    nop                 ;1 
    decfsz counter1     ;1
    goto delay02
    decfsz counter2
    goto delay02
    decfsz counter3
    goto delay02
    return

;-----------------------------------------------------------------------------
;Transmit byte in W register to USART
; transmit_data_in_w
;   check for PORTB CTS_INPUT, clear to send with btfsc
;   check for PIR1 TXIF, transmit buffer empty with btfss
;   move w to TXREG to transmit byte

transmit_data_in_w
    banksel PORTB       ;change bank to PORTB
    ;btfsc  PORTB, CTS_INPUT    ;check CTS to see if data can be sent
    ;goto   $-1
    btfss   PIR1, TXIF  ;check that buffer is empty
    goto    $-1
    movwf   TXREG       ;transmit byte
    return

receive_data_in_w
    banksel PORTB       ;change bank to PORTB
    bcf     PORTB,RTS_OUTPUT ;set RTS on for data to be received
    ;btfss  PIR1,RCIF   ;check if data received
    ;goto   $-1     ;wait until new data
    movf    RCREG,W     ;get received data into W
    return

    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop

    end
EN

回答 1

Stack Overflow用户

发布于 2012-04-05 17:31:35

似乎你从来没有扫描过开关。无限循环执行眨眼,切换UART接收器的启用,然后重复。您需要调用Check_Switches子例程。

代码语言:javascript
运行
复制
Send
    banksel RCSTA
    bcf RCSTA, CREN         ;disable reception - clear reception
    bsf RCSTA, CREN         ;enable reception

    pagesel Blink
    call Blink

check

    pagesel Send
    goto Send
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8396408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档