?? swuart.s
字號:
#include "hardware.h"
;variables
.data
.comm rxdata,1,1 ;char var
.comm rxshift,1,1 ;char var
.comm rxbit,2,2 ;short var, aligned
.text
interrupt(TIMERA0_VECTOR) ;register interrupt vector
;interrupt handler to receive as Timer_A UART
.global ccr0 ;place a label afterwards so
ccr0: ;that it is used in the listing
add rxbit, r0
jmp .Lrxstart ;start bit
jmp .Lrxdatabit ;D0
jmp .Lrxdatabit ;D1
jmp .Lrxdatabit ;D2
jmp .Lrxdatabit ;D3
jmp .Lrxdatabit ;D4
jmp .Lrxdatabit ;D5
jmp .Lrxdatabit ;D6
; jmp .Lrxlastbit ;D7 that one is following anyway
.Lrxlastbit: ;last bit, handle byte
bit #SCCI, &CCTL0 ;read last bit
rrc.b rxshift ;and save it
clr rxbit ;reset state
mov #CCIE|CAP|CM_2|CCIS_1|SCS, &CCTL0 ;restore capture mode
mov.b rxshift, rxdata ;copy received data
bic #CPUOFF|OSCOFF|SCG0|SCG1, 0(r1) ;exit all lowpower modes
;here you might do other things too, like setting a flag
;that the wakeup comes from the Timer_A UART. however
;it should not take longer than one bit time, otherwise
;charcetrs will be lost.
reti
.Lrxstart: ;startbit, init
clr rxshift ;clear input buffer
add #(BAUD/2), &CCR0 ;startbit + 1.5 bits -> first bit
mov #CCIE|CCIS_1|SCS, &CCTL0;set compare mode, sample bits
jmp .Lrxex ;set state,...
.Lrxdatabit: ;save databit
bit #SCCI, &CCTL0 ;measure databit
rrc.b rxshift ;rotate in databit
.Lrxex: add #BAUD, &CCR0 ;one bit delay
incd rxbit ;setup next state
reti
; void serPutc(char)
;use an other Capture/Compare than for receiving (full duplex).
;this one is without interrupts and OUTMOD, because only
;this way P1.1 can be used. P1.1 is prefered because the
;BSL is on that pin too.
.global putchar
.type putchar, @function
putchar: ;send a byte
mov #0, &CCTL1 ;select compare mode
mov #10, r13 ;ten bits: Start, 8 Data, Stop
rla r15 ;shift in start bit (0)
bis #0x0200, r15 ;set tenth bit (1), thats the stop bit
mov &TAR, &CCR1 ;set up start time
.Lt1lp: add #BAUD, &CCR1 ;set up for one bit
rrc r15 ;shift data trough carry
jc .Lt1 ;test carry bit
.Lt0: bic.b #TX, &P1OUT ;generate pulse
jmp .Ltc ;
.Lt1: bis.b #TX, &P1OUT ;just use the same amount of time as for a zero
jmp .Ltc ;
.Ltc: bit #CCIFG, &CCTL1 ;wait for compare
jz .Ltc ;loop until the bit is set
bic #CCIFG, &CCTL1 ;clear for next loop
dec r13 ;decrement bit counter
jnz .Lt1lp ;loop until all bits are transmitted
ret
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -