📄 lcd.s43
字号:
push R5
push R6
clr.w R4
bit.w #rxdok0,&COMM_FLAG ;Uart0
jnz RCEXIT0
mov.b &U0RXBUF,R4
bit.w #headok0,&COMM_FLAG
jnz RCBYTE00
cmp.b #68H,R4 ;判别帧起始符1(68H)
jnz RCEXIT0
bis.w #headok0,&COMM_FLAG
mov.w #1H,&RXDPTR0
mov.w #RXDBUF0,R5
mov.b R4,0(R5)
mov.b R4,&CS0
jmp RCEXIT0
RCBYTE00
mov.w #RXDBUF0,R5
add.w &RXDPTR0,R5
mov.b R4,0(R5)
inc.w &RXDPTR0
cmp.w #08H,&RXDPTR0
jnz RCBYTE04
cmp.b #68H,R4 ;判别帧起始符8(68H)
jeq RCEXIT0CS
RCBYTE00_0 ;68 xx ... xx 68 A0 A1 A2 A3 A4 A5 68 CTL LEN
cmp.w #1,&RXDPTR0
jeq RCEXITERR0
mov.w #RXDBUF0,R5
add.w &RXDPTR0,R5
mov.b 0(R5),R4
add.w R4,&CS0
mov.w #RXDBUF0,R5
mov.b 0(R5),R4
sub.w R4,&CS0
inc.w R5
mov.w #RXDBUF0,R6
dec.w &RXDPTR0
mov.w &RXDPTR0,R4
RCBYTE00_1
mov.b 0(R5),0(R6)
inc.w R5
inc.w R6
dec.b R4
jnz RCBYTE00_1
mov.w #RXDBUF0,R5
mov.b 0(R5),R4
cmp.b #68H,R4
jne RCBYTE00_0
RCBYTE04
cmp.w #0AH,&RXDPTR0
jnz RCBYTE08
mov.w R4,&RXDLEN0
add.w #0BH,&RXDLEN0
cmp.b #RXDLENMAX,&RXDLEN0
jhs RCEXITERR0
jmp RCEXIT0CS
RCBYTE08
jlo RCEXIT0CS
cmp.w &RXDLEN0,&RXDPTR0
jnz RCBYTE0C
cmp.b R4,&CS0
jeq RCEXIT0CS
jmp RCEXITERR0
RCBYTE0C
jlo RCEXIT0CS
cmp.B #16H,R4
jeq RCEXIT0OK
bic.w #headok0,&COMM_FLAG
RCEXIT0OK
bis.w #rxdok0,&COMM_FLAG
RCEXIT0CS
add.w R4,&CS0
RCEXIT0
pop R6
pop R5
pop R4
reti
RCEXITERR0
bic.w #headok0,&COMM_FLAG
pop R6
pop R5
pop R4
reti
;******************************************************************
; 串行发送中断0
;******************************************************************
TRANSMIT0
push R4
bit.W #txdbegin0,&COMM_FLAG
jz NOTSENBEGIN0
mov.w &TXDPTR0,R4
cmp.w R4,&TXDLEN0
jz SENDOVER0
add.w #TXBUF0,R4
mov.b 0(R4),&U0TXBUF
inc.w &TXDPTR0
pop R4
reti
SENDOVER0
bic.w #txdbegin0,&COMM_FLAG
NOTSENBEGIN0
pop R4
reti
********************************************以下为中断程序********************************************
;-------日历时钟(软件)------------------------------------------
TIMERA_CCR12
ADD &TAIV,PC
reti
jmp TIMMOD1
jmp TIMMOD2
jmp TIMMOD3
jmp TIMMOD4
jmp TIMMOD5
jmp TIMMOD6
jmp TIMMOD7
jmp TIMMOD8
TIMOVH
TIMMOD3
TIMMOD4
TIMMOD5
TIMMOD6
TIMMOD7
TIMMOD8
reti
TIMERA_CCR0
INV.B &P2OUT
inv.b &P1OUT ;采用TA0翻转作为秒脉冲输出
inc.b &Second ;加0.5秒钟
cmp.b #3ch,&Second ;判60秒
jhs TA0_Minute ;>=60秒时,分钟进位
reti
TA0_Minute
clr.b &Second ;清秒
inc.b &Minute ;加1分钟
cmp.b #3ch,&Minute ;判60分
jhs TA0_Hour ;>=60分钟时,小时进位
reti
TA0_Hour
clr.b &Minute ;清分
inc.b &Hour ;加1小时
cmp.b #18h,&Hour ;判24小时
jhs TA0_Day ;>=24小时,日进位
reti
TA0_Day
push R5
clr.b &Hour ;清小时
inc.b &Week ;加星期
and.b #07H,&Week ;
jnz TA0_Week ;
inc.b &Week ;加星期"0->1"
TA0_Week
inc.b &Day ;加日
clr R5
mov.b &Year,R5
and.b #03h,R5
jz TA0_Day_LEAP;判别闰年
TA0_Day_Nor ;闰年
clr R5
mov.b &Month,R5
dec.b R5
cmp.b Tab_Day(R5),&Day
jhs TA0_Month ;
jmp TA0_Exit
TA0_Day_LEAP ;非闰年
clr R5
mov.b &Month,R5
dec.b R5
cmp.b Tab_Day1(R5),&Day
jhs TA0_Month ;
jmp TA0_Exit
TA0_Month
mov.b #1,&Day ;日期=1
inc.b &Month ;月份加1
cmp.b #0Ch,&Month ;判12个月
jhs TA0_Year ;月份>12
jmp TA0_Exit
TA0_Year
mov.b #1,&Month ;月份=1
inc.w &Year ;年份加1
TA0_Exit
pop R5
reti
;-----------星期设置-------------------------
; 日期设置时调用
;--------------------------------------------
Adjust_Week
;1980--2099
;R4 星期
;R5 日
;R6 月
;R7 年
Check_Y cmp.w #07bch,&Year ;1980
jhs Check_Y1
mov.w #07d0h,&Year ;2000
Check_Y1 cmp.w #0834h,&Year ;2100
jlo Check_M
mov.w #07d0h,&Year ;2000
Check_M cmp.b #01h,&Month ;1
jhs Check_M1
mov.b #01h,&Month ;1
Check_M1 cmp.b #0dh,&Month ;13
jlo Check_D
mov.b #01h,&Month ;1
Check_D cmp.b #01h,&Day ;1
jhs Check_D1
mov.b #01h,&Day ;1
Check_D1 cmp.b #020h,&Day ;32
jlo Check_End
mov.b #01h,&Day ;1
Check_End
mov.w &Year,R7
sub.w #1980,R7
mov.w #1,R6
mov.w #1,R5
mov.b Tab_Week(R7),R4
Adjust_0
cmp.b R6,&Month
jne Adjust_2
Adjust_1
cmp.b R5,&Day
jne Adjust_2
jmp Adjust_Exit
Adjust_2
inc.b R5 ;加日
inc.b R4 ;加星期&Week
and.b #07H,R4 ;&Week
jnz Adjust_3 ;
inc.b R4 ;加星期"0->1"&Week
Adjust_3
clr R8
mov.b &Year,R8 ;
and.b #03h,R8
jz Adjust_Day_LEAP ;判别闰年
Adjust_Day_Nor ;闰年
mov.w R6,R8 ;&Month
dec.w R8
cmp.b Tab_Day(R8),R5 ;&Day
jhs Adjust_Month ;
jmp Adjust_Next
Adjust_Day_LEAP ;非闰年
mov.w R6,R8 ;&Month
dec.w R8
cmp.b Tab_Day1(R8),R5 ;&Day
jhs Adjust_Month ;
jmp Adjust_Next
Adjust_Month
mov.b #1,R5 ;日期=1 &Day
inc.b R6 ;月份加1 &Month
Adjust_Next
jmp Adjust_0
Adjust_Exit
mov.b R4,&Week
ret
align 2
Tab_Day DB 32,29,32,31,32,31,32,32,31,32,31,32
Tab_Day1 DB 32,30,32,31,32,31,32,32,31,32,31,32
Tab_Week DB 2,4,5,6,7,2,3,4,5,7 ;1980-1989
DB 1,2,3,5,6,7,1,3,4,5 ;1990-1999
DB 6,1,2,3,4,6,7,1,2,4 ;2000-2009
DB 5,6,7,2,3,4,5,7,1,2 ;2010-2019
DB 3,5,6,7,1,3,4,5,6,1 ;2020-2029
DB 2,3,4,6,7,1,2,4,5,6 ;2030-2039
DB 7,2,3,4,5,7,1,2,3,5 ;2040-2049
DB 1,7,1,3,4,5,6,1,2,3 ;2050-2059
DB 4,1,7,1,2,4,5,6,7,2 ;2060-2069
DB 3,4,5,7,1,2,3,5,6,7 ;2070-2079
DB 1,3,4,5,6,1,2,3,4,6 ;2080-2089
DB 7,1,2,4,5,6,7,2,3,4 ;2090-2099
align 2
TIMMOD1
reti
TIMMOD2
reti
;------------------------------------------------------------------
;ONLY FOR TEST
;-----------FLASH Write
Test_Busy1
bit #BUSY,&FCTL3
jnz Test_Busy1
mov #Fresh_W,&FCTL3
mov #(Fresh_W+WRT),&FCTL1
mov #0EEEEh,&010F0h
Test_Busy12
bit #BUSY,&FCTL3
jnz Test_Busy12
mov #0123h,&01000h
Test_Busy2
bit #BUSY,&FCTL3
jnz Test_Busy2
mov #Fresh_W,&FCTL1
xor #(Fresh_X+LOCK),&FCTL3
Test_Busy3
bit #BUSY,&FCTL3
jnz Test_Busy3
mov #Fresh_W,&FCTL3
mov #(Fresh_W+WRT+SEGWRT),&FCTL1
mov #1234h,&010F0h
Test_Busy4
bit #BUSY,&FCTL3
jnz Test_Busy4
mov #Fresh_W,&FCTL3
mov #(Fresh_W+ERASE),&FCTL1
CLR &0FA00h
Test_Busy5
bit #BUSY,&FCTL3
jnz Test_Busy5
mov #Fresh_W,&FCTL1
xor #(Fresh_X+LOCK),&FCTL3
RET
;-----------I2C WRITE/READ
TST1
MOV.b I2C_R_Addr,R5 ;送出字节地址的低8位
MOV.b I2C_R_Addr+1,R5 ;送出字节地址的低8位
; JMP MAINLOOP1
; JMP RDNBYT
WRNBYT
call #I2C_Sta
mov.b #10100110b,R5
call #I2C_WR_BYT
call #I2C_Ackn
bit.w #BIT0,&StateFlag
jnz WRNBYT
mov.b #00H,R5
call #I2C_WR_BYT
call #I2C_Ackn
bit.w #BIT0,&StateFlag
jnz WRNBYT
mov.b #00h,R5
call #I2C_WR_BYT
call #I2C_Ackn
bit.w #BIT0,&StateFlag
jnz WRNBYT
CLR R5
MOV #00H,R10
WRNBYT1
mov #088h,R5
call #I2C_WR_BYT
call #I2C_Ackn
bit.w #BIT0,&StateFlag
jnz WRNBYT
INC R10
CMP.W #40H,R10
JNE WRNBYT1
call #I2C_Stop
RDNBYT
call #I2C_Sta
mov.b #10100110b,R5
call #I2C_WR_BYT
call #I2C_Ackn
bit.w #BIT0,&StateFlag
jnz RDNBYT
mov.b #00H,R5
call #I2C_WR_BYT
call #I2C_Ackn
bit.w #BIT0,&StateFlag
jnz RDNBYT
mov.b #00H,R5
call #I2C_WR_BYT
call #I2C_Ackn
bit.w #BIT0,&StateFlag
jnz RDNBYT
call #I2C_Sta
mov.b #10100111b,R5
call #I2C_WR_BYT
call #I2C_Ackn
bit.w #BIT0,&StateFlag
jnz RDNBYT
CLR R10
RDNBYT1
call #I2C_RD_BYT
call #I2C_Mack
ADD #10H,R10
; JMP RDNBYT1
call #I2C_RD_BYT
call #I2C_Mack
call #I2C_RD_BYT
nop
call #I2C_MNack
call #I2C_Stop
mov.w #000h,&I2C_R_Addr
TEST0
; MOV #400H,R6
; MOV.B #0FFH,0(R6)
; CALL #I2C_WR_1byte
; CALL #I2C_RD_1byte
; CMP.B #0FFH,R5
; JEQ TEST1
; NOP
TEST1
; INC &I2C_R_Addr
; CMP #100H,I2C_R_Addr
; JL TEST0
RET
;------------------------------------------------------------------------------------------
ORG 0FFE0h ; No Used
DW MAINLOOP
ORG 0FFE2h ; No Used(P2口中断向量)
DW MAINLOOP
ORG 0FFE4h ; 通讯发送 Uart1 Interrup Vector
DW TRANSMIT1
ORG 0FFE6h ; 通讯接收 Uart1 Interrup Vector
DW RECEIVE1
ORG 0FFE8h ; No Used(P1口中断向量)
DW MAINLOOP
ORG 0FFEEh ; No Used(ADCIFG)
DW MAINLOOP
ORG 0FFF0h ; 通讯发送 Uart0 Interrup Vector
DW TRANSMIT1
ORG 0FFF2h ; 通讯接收 Uart0 Interrup Vector
DW RECEIVE1
ORG 0FFF4h ; No Used(WDT)
DW MAINLOOP
ORG 0FFF6h ; No Used(CMPIFG)
DW MAINLOOP
ORG 0FFF8h ; No Used(BCCIFG/TBIFG)
DW MAINLOOP
ORG 0FFEAh ; CCR1/CCR2/TAIFG2 Interrup Vector
DW TIMERA_CCR12
ORG 0FFECh ; CCR0 Interrup Vector
DW TIMERA_CCR0
ORG 0FFFEh ; MSP430 RESET Vector
DW START
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -