芯片PIC18F4553 (MCHP) -- 8位单片机, 汇编开发单片机

;
;       TEST-GPIO
;
;  FileName:        main.S
;  Dependencies:    p18f4553.inc
;
;  Processor:       PIC18F4553
;
;  Complier:        GPASM
;
;  Company:         xxx
;
;  Date:            2012/03/21
;
;  Author:          Perry.Peng@xxx.com
;
;  just do a demonstration of PIC18F4553.
;
;  Features used:
;     - GPIO
;     - Timer1
;
;  Description:
;       demo program.
;
;  Notes:
;     -

;        nolist
        list r=dec, f=inhx32
        list n=0; suppress list file page breaks
        list ST=off; suppress list file symbol table

        errorlevel -302   ; suppress message 302 from list file
        include "p18f4553.inc"

; ---------------------------------------------------------------------
; Configuration Bits
; ---------------------------------------------------------------------
        CONFIG  PLLDIV    = 3           ;   PLL Prescaler Selection bits
        CONFIG  CPUDIV    = OSC1_PLL2   ;   System Clock Postscaler Selection bits
        CONFIG  USBDIV    = 1           ;   USB Clock Selection bit (used in Full-Speed USB mode only; UCFG:FSEN = 1)
        CONFIG  FOSC      = HSPLL_HS    ;   Oscillator Selection bits
        CONFIG  FCMEN     = OFF         ;   Fail-Safe Clock Monitor Enable bit
        CONFIG  IESO      = OFF         ;   Internal/External Oscillator Switchover bit
        CONFIG  DEBUG     = ON          ;   Background Debugger Enable bit
        CONFIG  XINST     = OFF         ;   Extended Instruction Set Enable bit
        CONFIG  MCLRE     = ON          ;   MCLR Pin Enable bit
        CONFIG  PWRT      = OFF         ;   MCLR Pin Enable bit
        CONFIG  WDT       = OFF         ;   WDT disabled.
        CONFIG  WDTPS     = 128         ;   Watchdog Timer Postscale Select bits(1 to 32768).
        CONFIG  VREGEN    = OFF         ;   USB voltage regulator disabled.
        CONFIG  CCP2MX    = OFF         ;   CCP2 input/output is multiplexed with RB3.
        CONFIG  PBADEN    = OFF         ;   PORTB<4:0> pins are configured as digital I/O on Reset
        CONFIG  LVP       = ON          ;   PORTB<4:0> pins are configured as 

; Instructs gpasm that it should generate an error if there is any
; use of the given RAM locations.

STATUS      equ  0xfd8
WREG        equ  0xfe8
FSR1L       equ  0xfe1
FSR2L       equ  0xfd9
POSTINC1    equ  0xfe6
POSTDEC1    equ  0xfe5
PREINC1     equ  0xfe4
PLUSW2      equ  0xfdb

;----------------------------------------------------------------------
; Variables
;----------------------------------------------------------------------
.data udata

.registers  udata_ovr  0x0000
r0x00  res  1
r0x01  res  1
r0x02  res  1
r0x03  res  1
r0x04  res  1
r0x05  res  1

;----------------------------------------------------------------------
; Program Memory
;----------------------------------------------------------------------
        org       0x0000              ; Reset vector
        nop
        goto      sysboot

        org       0x0008              ; Low-priority vector
        retfie
;        org       0x0018              ; High-priority interrupt vector
;        nop
;        retfie

        org       0x00020             ; Start of Program space

sysboot
        call      SystemClockInit
        
        movlw     0xaa
        movwf     LATD          ; clear PORTB output latch
        bsf       PORTE, RDPU   ; PORTD pull-ups are enabled by individual port latch values
        movlw     0xf8          ; set PORTB[0:2] as outputs
        movwf     TRISD

        clrf      BAUDCON
        clrf      SPBRGH
        movlw     0x4e          ; ((48MHz / 9600) / 64) - 1
        movwf     SPBRG
        movlw     0x20
        movwf     TXSTA
        movlw     0x90
        movwf     RCSTA

        clrf      TMR0L
        clrf      TMR0H
        bcf       INTCON, TMR0IF
        bcf       T0CON, T0PS0
        bsf       T0CON, T0PS1
        bsf       T0CON, T0PS2
        bcf       T0CON, PSA
        bcf       T0CON, T0SE
        bcf       T0CON, T0CS
        bsf       T0CON, T08BIT   ; 16bit mode.
        bsf       T0CON, TMR0ON

Main
        btg       LATD, 0
        btg       LATD, 1
        btg       LATD, 2

        movlw     0x41
        call      putc

        movlw     0x42
        call      putc

        movlw     0x43
        call      putc

        movlw     0x0d
        call      putc

        movlw     0x0a
        call      putc

        btfss     INTCON, TMR0IF
        goto      $ - 1
        bcf       INTCON, TMR0IF

        goto      Main          ; do it all over again

;----------------------------------------------------------------------
; a delay of 98.57mS

Delay
        movlw     0x80
        movwf     r0x01         ; preset
        clrf      r0x00         ; clear counter

Delay1
        decfsz    r0x00, 1      ; decrement counter
        bra       Delay1        ; back to top of loop

        decfsz    r0x01, 1      ; decrement counter
        bra       Delay1        ; back to top of loop

        return

putc:
        btfss     TXSTA, TRMT
        bra       $ - 1
        movwf     TXREG
        return

puts:

        return

OpenUart:
        clrf      BAUDCON
        clrf      SPBRGH
        movlw     0x4e          ; ((48MHz / 9600) / 64) - 1
        movwf     SPBRG
        movlw     0x20
        movwf     TXSTA
        movlw     0x90
        movwf     RCSTA

        return

EnableInterrupt:
;    INTCON
;      R/W-0     R/W-0     R/W-0   R/W-0   R/W-0 R/W-0   R/W-0   R/W-x
;      GIE/GIEH  PEIE/GIEL TMR0IE  INT0IE  RBIE  TMR0IF  INT0IF  RBIF
;      bit7      6         5       4       3     2       1       0
;
;    GIE/GIEH: Global Interrupt Enable bit
;      When IPEN = 0:
;        1= Enables all unmasked interrupts
;        0= Disables all interrupts 
;      When IPEN = 1:
;        1= Enables all high-priority interrupts 
;        0= Disables all interrupts
;    PEIE/GIEL: Peripheral Interrupt Enable bit
;      When IPEN = 0:
;        1= Enables all unmasked peripheral interrupts
;        0= Disables all peripheral interrupts 
;      When IPEN = 1:
;        1= Enables all low-priority peripheral interrupts (if GIE/GIEH = 1) 
;        0= Disables all low-priority peripheral interrupts
;    TMR0IE:TMR0 Overflow Interrupt Enable bit 
;      1= Enables the TMR0 overflow interrupt 
;      0= Disables the TMR0 overflow interrupt
;    INT0IE:INT0 External Interrupt Enable bit 
;      1= Enables the INT0 external interrupt 
;      0= Disables the INT0 external interrupt
;    RBIE:RB Port Change Interrupt Enable bit 
;      1= Enables the RB port change interrupt 
;      0= Disables the RB port change interrupt
;    TMR0IF:TMR0 Overflow Interrupt Flag bit 
;      1= TMR0 register has overflowed (must be cleared in software) 
;      0= TMR0 register did not overflow
;    INT0IF:INT0 External Interrupt Flag bit 
;      1= The INT0 external interrupt occurred (must be cleared in software) 
;      0 = The INT0 external interrupt did not occur
;    RBIF:RB Port Change Interrupt Flag bit
;      1= At least one of the RB7:RB4 pins changed state (must be cleared in software) 
;      0 = None of the RB7:RB4 pins have changed state
;     
;    INTCON2
;      R/W-1 R/W-1   R/W-1   R/W-1   U-0   R/W-1   U-0   R/W-1
;      RBPU  INTEDG0 INTEDG1 INTEDG2 —    TMR0IP  —    RBIP
;      bit7  6       5       4       3     2       1     0
;   
; 
;    INTCON3
;      R/W-1   R/W-1   U-0  R/W-0  R/W-0   U-0   R/W-0   R/W-0
;      INT2IP  INT1IP  —   INT2IE INT1IE  —    INT2IF  INT1IF
;      bit7    6       5     4     3       2     1       0

        bcf       INTCON2, 2
        bsf       INTCON, 5
        bsf       INTCON, 6
        bsf       INTCON, 7
        return

Timer0Init:
;   T0CON register
;     R/W-1   R/W-1   R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1
;     TMR0ON  T08BIT  T0CS  T0SE  PSA   T0PS2 T0PS1 T0PS0
;     bit7    6       5     4     3     2     1     0
; 
;   TMR0ON: Timer0 On/Off Control bit 
;     1= Enables Timer0 
;     0= Stops Timer0
; 
;   T08BIT: Timer0 8-Bit/16-Bit Control bit 
;     1= Timer0 is configured as an 8-bit timer/counter 
;     0= Timer0 is configured as a 16-bit timer/counter 
; 
;   T0CS: Timer0 Clock Source Select bit 
;     1= Transition on T0CKI pin 
;     0= Internal instruction cycle clock (CLKO) 
; 
;   T0SE: Timer0 Source Edge Select bit
;     1= Increment on high-to-low transition on T0CKI pin 
;     0= Increment on low-to-high transition on T0CKI pin 
; 
;   PSA: Timer0 Prescaler Assignment bit 
;     1= TImer0 prescaler is NOT assigned. Timer0 clock input bypasses prescaler. 
;     0= Timer0 prescaler is assigned. Timer0 clock input comes from prescaler output.
; 
;   T0PS2:T0PS0: Timer0 Prescaler Select bits 
;     111= 1:256 Prescale value
;     110= 1:128 Prescale value
;     101= 1:64 Prescale value
;     100= 1:32 Prescale value
;     011= 1:16 Prescale value
;     010= 1:8 Prescale value
;     001= 1:4 Prescale value
;     000= 1:2 Prescale value

        clrf      TMR0L
        clrf      TMR0H
        bcf       INTCON, TMR0IF
        bsf       T0CON, T0PS0
        bsf       T0CON, T0PS1
        bsf       T0CON, T0PS2
        bcf       T0CON, PSA
        bcf       T0CON, T0SE
        bcf       T0CON, T0CS
        bsf       T0CON, T08BIT   ; 16bit mode.
        bsf       T0CON, TMR0ON
        return  

SystemClockInit:
;    OSCCON register
;      R/W-0 R/W-1 R/W-0 R/W-0 R     R-0   R/W-0 R/W-0
;      IDLEN IRCF2 IRCF1 IRCF0 OSTS  IOFS  SCS1  SCS0
;      bit7  6     5     4     3     2     1     0
;
;    IDLEN: Idle Enable bit
;      1= Device enters Idle mode on SLEEP instruction
;      0= Device enters Sleep mode on SLEEP instruction
;
;    IRCF2:IRCF0:  Internal Oscillator Frequency Select bits
;      111= 8 MHz (INTOSC drives clock directly)
;      110= 4 MHz 
;      101= 2 MHz 
;      100= 1 MHz (Default output frequency of INTOSC on Reset.)
;      011= 500 kHz 
;      010= 250 kHz
;      001= 125 kHz
;      000= 31 kHz (from either INTOSC/256 or INTRC directly)
;    
;    OSTS:Oscillator Start-up Time-out Status bit (Depends on the state of the IESO Configuration bit)
;      1= Oscillator Start-up Timer time-out has expired; primary oscillator is running
;      0= Oscillator Start-up Timer time-out is running; primary oscillator is not ready
;
;    IOFS:INTOSC Frequency Stable bit 
;      1= INTOSC frequency is stable
;      0= INTOSC frequency is not stable
;      
;    SCS1:SCS0:System Clock Select bits
;      1x= Internal oscillator
;      01= Timer1 oscillator
;      00= Primary oscillator

        bcf       OSCCON, SCS0
        bcf       OSCCON, SCS1
        bsf       OSCCON, IRCF0
        bsf       OSCCON, IRCF1
        bsf       OSCCON, IRCF2
        bcf       OSCCON, IDLEN
;        btfss     OSCCON, 2
;        bra       $ - 1
        return

;----------------------------------------------------------------------
; End of program
;----------------------------------------------------------------------
        end


完。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值