📄 main.asm
字号:
;==================================================================================
; The information contained herein is the exclusive property of
; Sunplus Technology Co. And shall not be distributed, reproduced,
; or disclosed in whole in part without prior written permission.
; (C) COPYRIGHT 2004 SUNPLUS TECHNOLOGY CO.
; ALL RIGHTS RESERVED
; The entire notice above must be reproduced on all authorized copies.
;==================================================================================
;==================================================================================
; Project Name :
; Applied Body : SPMC65P2404A
; Firmware version:
; Programer :
; Date : 2004-11-10
; Description : Communication between master and two slave(IIC).
;
; Hardware Connect:
; Link File :
; IDE Version : V1.6.5
; BODY Version : V1.0.0A
;==================================================================================
.SYNTAX 6502 ;Process standard 6502 addressing syntax
.LINKLIST ;Generate linklist information
.SYMBOLS ;Generate symbolic debug information
;************************************************************************************
;* *
;* System Register Define *
;* *
;************************************************************************************
;************************************************************************************
.INCLUDE SPMC65P2404A.inc ;Define all hardware,Registers and ports.
;************************************************************************************
;************************************************************************************
;* *
;* Data memory Define *
;* *
;************************************************************************************
.PAGE0 ;Define values in the range from 00h to FFh
;************************************************************************************
.DATA ;Define data storage section
;************************************************************************************
;* *
;* Program Area *
;* *
;************************************************************************************
.CODE
.INCLUDE Subprogram.asm
.INCLUDE LED_4Disp.asm
;************************************************************************************
;* *
;* Power on Reset Process *
;* *
;************************************************************************************
.PUBLIC V_Reset
V_Reset:
sei ;Disable interrupt
ldx #C_STACK_BOTTOM ;Initial stack pointer at $00FF
txs
lda #C_T0FCS_Div_4
sta GP_IIC_BitRate ;select the Prescaler of Timer0
jsr F_IO_Init ;initialize the I/O for display
jsr F_Timer2_Init ;initialize the Timer0 for main loop
jsr F_Sys_Init ;initialize the I/O,Timer and clock for communication
cli
L_MainLoop:
jsr F_Start ;occur the start signal
jsr F_CheckStop ;check the stop signal
jsr F_LED_4Disp ;display
?L_Wait:
jsr F_WrData ;dispose when send the data
lda P_INT_Flag1
and #C_INT_T2OIF ;time 704us ?
beq ?L_Wait ;no
lda #C_INT_T2OIF
sta P_INT_Flag1
inc GB_CSCnt
lda GB_CSCnt
cmp #8
bcc L_MainLoop
lda #0
sta GB_CSCnt
sta GB_TxCnt
sta GB_INT_Cnt
M_BitSet GB_Flag,7;
jmp L_MainLoop
;************************************************************************************
;* *
;* Interrupt Service Process *
;* *
;************************************************************************************
V_IRQ:
pha
txa
pha
;===============================================================================
; Timer0 INT
;===============================================================================
lda P_INT_Flag1
and #C_INT_T0OIF
beq ?L_IRQ1_INT
M_ClrSCL; ;clear SCL
asl GP_IIC_TxBuf
bcs ?L_OutputH
M_ClrSDA; ;SDA export '0'
jmp ?L_Rising
?L_OutputH:
M_SetSDA; ;SDA export '1'
?L_Rising:
inc GB_INT_Cnt
lda GB_INT_Cnt
cmp #8
bcc ?L_SetSCL
lda #0
sta GB_INT_Cnt
M_DisableT1; ;disable the Timer1
M_BitClr GB_Flag,6;
M_SDA_Input; ;set free the SDA
M_SCL_Input;
lda #C_IRQOpt1_IRQ1ES ;select rising edge trigger
sta P_IRQ_Opt1
sta P_IRQ_Opt1
lda #C_INT_IRQ1IE
sta P_INT_Ctrl0
lda #C_INT_IRQ1IF
sta P_INT_Flag0
?L_SetSCL:
M_SetSCL; ;set SCL
lda #C_INT_IRQ1IF
sta P_INT_Flag0
jmp ?L_INT_rti
;===============================================================================
; IRQ1 INT
;===============================================================================
?L_IRQ1_INT:
lda P_INT_Flag0
and #C_INT_IRQ1IF
beq ?L_IRQ2_Rti
lda #$FF
sta P_INT_Flag0
lda GB_INT_Cnt
cmp #8
bcc ?L_CheckStop
cmp #9
bcs ?L_SetFree
?L_RxData:
M_SDA_Output;
M_RxData; ;read the data from transmitter
inc GB_RxCnt
inc GB_INT_Cnt
M_ClrSDA; ;send ACK
?L_IRQ2_Rti:
jmp ?L_INT_rti
?L_SetFree:
M_SDA_Input;
lda #C_IRQOpt1_IRQ1ES ;select rising edge trigger(PB5)
sta P_IRQ_Opt1
sta P_IRQ_Opt1
lda #0
sta GB_INT_Cnt
jmp ?L_INT_rti
?L_CheckStop:
cmp #0
bne ?L_StopBit
M_BitSet GB_Flag,1; ;clear the flag for check stop bit
jmp ?L_Receive
?L_StopBit:
lda P_IOB_Data
and #%00010000
bne ?L_Receive
M_BitClr GB_Flag,1; ;set the flag for check stop bit
?L_Receive:
lda P_IOB_Data ;\
and #%00010000 ; \
rol a ; + = catch one bit
rol a ; /
rol a ;/
rol a
rol GP_IIC_RxBuf
inc GB_INT_Cnt
lda GB_INT_Cnt
cmp #8 ;catch 8 bit ?
bcc ?L_INT_rti ;no
lda #00 ;select falling edge trigger
sta P_IRQ_Opt1
sta P_IRQ_Opt1
lda #C_INT_IRQ1IE
sta P_INT_Ctrl0
lda #C_INT_IRQ1IF
sta P_INT_Flag0
?L_INT_rti:
lda #C_INT_IRQ1IF
sta P_INT_Flag0
lda #C_INT_T0OIF
sta P_INT_Flag1
lda #0
sta GB_CSCnt
pla
tax
pla
rti
V_NMI:
rti
;************************************************************************************
;* *
;* Interrupt Vector Table *
;* *
;************************************************************************************
VECTOR .SECTION
DW V_NMI ;Non-mask interrupt vector(no use)
DW V_Reset ;Reset vector
DW V_IRQ ;IRQ interrupt vector
;************************************************************************************
;* *
;* End of Interrupt Vector Table *
;* *
;************************************************************************************
.END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -