⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.asm

📁 用凌阳单片机的普通IO口
💻 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 + -