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

📄 main.asm

📁 华邦单片机的红外发送源码,已经投入生产。其中的功能主要是把信息通过红外发送到上位机。
💻 ASM
📖 第 1 页 / 共 2 页
字号:


;Updated 2008/12/18 by junson
;1. 按键debounce 从10ms提高到20个ms
 			
;=============================================================
	SEI
	JSR UserInita
	CLI
	LDX #200
	JSR IRDelay
	LDX #200
	JSR IRDelay
	LDX #200
	JSR IRDelay
	LDX #200
	JSR IRDelay
IR_START:
;	JSR F_SendIdle
	JSR F_GetKeyCode	
	JSR F_SendIRCode	
	JSR F_GotoSleep
	JMP IR_START
;========================function:F_GetKeyCode
F_GetKeyCode:
	STZ KeyFlag
    LDA BP0
	AND #(SWING + CODE00+ CODE11 + YELLOW + BLUE + GREEN)
	STA KeyTemp0

    LDA BP1
	AND #(UP + LEFT+ DOWN + RIGHT)
	STA KeyTemp1

	LDA KeyTemp0
	AND #SWING			;?swing key pressed
	BEQ L_GetKey

	STZ Count38k
	LDX #20				;debounce 10 ms
	JSR IRDelay
						;get key code again
	LDA BP0
	AND #(SWING + CODE00+ CODE11 + YELLOW + BLUE + GREEN)
	CMP KeyTemp0
	BNE QuitKeyGet

	LDA BP1
	AND #(UP + LEFT+ DOWN + RIGHT)
	CMP KeyTemp1
	BNE QuitKeyGet
						
	LDA KeyTemp0
	CMP KeyBP0
	BNE L_GetKey			;if oldkey != newkey Set key change flag
	LDA KeyTemp1
	CMP KeyBP1
	BNE	L_GetKey			;if oldkey != newkey Set key change flag

L_QuitKeyGet:				;如果一直有按键被按下,并且被按下的按键不是code00,code11,则需要不停的发码
	LDA KeyTemp0
;***************************************当code00,code11一直保持某个状态时,不再发码。200812/11
	AND #(SWING + YELLOW + BLUE + GREEN)
	CMP #(SWING + YELLOW + BLUE + GREEN)
	BNE L_KeyPressed
;	AND #(CODE00+ CODE11 + YELLOW + BLUE + GREEN)
;	CMP #(CODE00+ CODE11 + YELLOW + BLUE + GREEN)
;	BNE L_KeyPressed
	LDA KeyTemp1
	AND #(UP + LEFT+ DOWN + RIGHT)
	CMP #(UP + LEFT+ DOWN + RIGHT)
	BNE L_KeyPressed
;	JSR F_SendIdle
;	STZ KeyPressedTime
	JMP QuitKeyGet
L_GetKey:				;有键改变
	LDA KeyTemp0	
	STA KeyBP0
	LDA KeyTemp1
	STA KeyBP1
	STZ SleepTime
	STZ SleepTime+1
	lda #1
	sta KeyFlag
;	STZ KeyPressedTime
	JMP QuitKeyGet
L_KeyPressed:			;按键一直被按下
	LDA KeyTemp0	
	STA KeyBP0
	LDA KeyTemp1
	STA KeyBP1 
;	LDX #200
;	JSR IRDelay	
	lda #1
	sta KeyFlag	
QuitKeyGet:	
	RTS

;=======================function:F_SendIRCode
F_SendIRCode:
	lda KeyFlag
	beq L_SendIREnd
	LDA Run_FRIST
	BEQ M_SendIR
	STZ Run_FRIST
	JMP L_SendIREnd
M_SendIR:
	STZ CodeVerify
	LDA KeyBP0	
	ASL A
	ASL A
	STA CodeTmp
	LDX #6
	JSR F_GetVerifyByte
	LDA KeyBP1	
	ASL A
	ASL A
	ASL A
	ASL A
	STA CodeTmp
	LDX #4
	JSR F_GetVerifyByte
	LDA CodeVerify
	CMP #8
	BEQ L_SendIREnd

	LDY #3
L_SendIRCodeLP:
;	JSR SendStartCode
	JSR SendIRCode0
	JSR SendIRCode1
	JSR SendVerifyCode
	JSR SendStopCode			;send stop bit code for stop the transmit
	LDX #20
	JSR IRDelay
	DEY
	TYA
	BNE L_SendIRCodeLP
L_SendIREnd:
	RTS
;=======================function:F_GoToSleep
F_GotoSleep:
	LDA SleepTime+1
	SEC
	SBC #2
	BCS _NeedSleep
	JMP _ExitSleep
_NeedSleep:
	SEI
	LDA !BP0EN_F
	PHA		
;	LDA #(YELLOW + BLUE + GREEN)
;	STA !BP0EN_F	;CODE00+ CODE11 + SWING key cann't wake up unit 
	LDA #(CODE00+ CODE11 +YELLOW + BLUE + GREEN) ;SWING key cann't wake up unit 
	STA !BP0EN_F
	LDA #(UP + LEFT+ DOWN + RIGHT)
	STA !BP1EN_F
    CLI
    LDA #01H 					;sleep		
    STA STOP
    NOP	
	NOP
	PLA
	STA !BP0EN_F
	STZ !BP1EN_F	
	STZ SleepTime
	STZ SleepTime+1
_ExitSleep:
	RTS


;=======================function:F_SendIdle
F_SendIdle:
	LDA KeyFlag
	BNE QiutIdle
	SEI
	LDA #(CODE00+ CODE11 + SWING + YELLOW + BLUE + GREEN)
	STA !BP0EN_F	 
	LDA #(UP + LEFT+ DOWN + RIGHT)
	STA !BP1EN_F
    CLI
    LDA #01H 					;sleep		
    STA STOP
    NOP	
	NOP
	LDA #SWING
	STA !BP0EN_F
	STZ !BP1EN_F
QiutIdle:
	RTS


;=======================function:F_GetVerifyByte
F_GetVerifyByte:
GetVerifyLP:
	CLC
	ASL CodeTmp	
	BCS L_GetVerifyLP
	INC CodeVerify
;	LDA CodeVerify
;	EOR #80H
;	STA CodeVerify
L_GetVerifyLP:
	DEX
	BNE GetVerifyLP
	RTS

;=======================function:SendStartCode  ;send Start code:0
SendStartCode:
	STZ IRCode
	LDX #1
	JSR SendIRCode
	RTS
;=======================function:SendIRCode0    ;send code (SWING + CODE00+ CODE11 + YELLOW + BLUE + GREEN)
SendIRCode0:
	LDA KeyBP0
	ASL A
	ASL A
	STA IRCode
	LDX #6
	JSR SendIRCode
	RTS
;=======================function:SendIRCode1	;send code 	(UP + LEFT+ DOWN + RIGHT)
SendIRCode1:
	LDA KeyBP1
	ASL A
	ASL A
	ASL A
	ASL A	
	STA IRCode
	LDX #4
	JSR SendIRCode
	RTS
;=======================function:SendVerifyCode  ;send Verify code
SendVerifyCode:
	LDA CodeVerify
	ASL A
	ASL A
	ASL A
	ASL A 
	ASL A
	STA IRCode
	LDX #3
	JSR SendIRCode
	RTS
;=======================function:SendStopCode    ;send Stop code: 0
SendStopCode:
	LDA #1
	STA IRCode
	LDX #1
	JSR SendIRCode
	RTS
;=======================function:SendIRCode
SendIRCode:

SND_LP:				;
	LDA #80H
	TSB BP0C
	STZ Count38k
	CLC
	ASL IRCode	
	BCC SND_CODE_L
SND_CODE_H:				;为1 高:低 = 1:1	
	LDA Count38k
	SEC
	SBC #46										;46/2=23, 1t = 23*(1/38khz)=600us
	BCC SND_CODE_H
	LDA #80H
	TRB BP0C	
	STZ Count38k
SND_LP1:
	LDA Count38k
	SEC
	SBC #46										;46/2=23, 1t = 23*(1/38khz)=600us  
	BCC SND_LP1
	JMP SND_GO

SND_CODE_L:				;为0 高:低 = 1:2
	LDA Count38k
	SEC
	SBC #46									;46/2=23, 1t = 23*(1/38khz)=600us
	BCC SND_CODE_L
	LDA #80H
	TRB BP0C	
	STZ Count38k
SND_LP2:
	LDA Count38k
	SEC
	SBC #92										;92/2=46, 1t = 46*(1/38khz)=1200us
	BCC SND_LP2
SND_GO:	
	DEX
	BNE SND_LP

	RTS
;=============================function:UserInita
UserInita:
	LDA #FFH
	STA BP0D
	STA BP1D
	STA BP0M
	STA BP1M
	STZ !IEF0
	STZ !IEF1

	LDA #0FH		;BP00~BP05 AS INPUT
	TSB BP0M
	TSB BP0D

	LDA #07H		;BP10~BP13 AS INPUT
	TSB BP1M		
	TSB BP1D

	LDA #10H		;BP07 AS IR OUT BP06 AS IO OUT  
	TSB BP0M
	lda #10H
	TRB BP0D

	LDA #C0H
	TSB BP0


;	LDA #(SWING + CODE00+ CODE11 + YELLOW + BLUE + GREEN)
;	TSB !BP0EN_F
;	LDA #(UP + LEFT+ DOWN + RIGHT)
;	TSB !BP1EN_F
;	LDA #SWING
;	TSB !BP0EN_F
	LDA #01H
	TSB !IEF0
	

	LDA #0BH
	STA TMG0C
	LDA #(FCLK/(4*8192)-1)			;4HZ=250ms for timeout counter
	STA TMG0V
	LDA #01H
	TSB TMG0C
	LDA #08H
	TSB !IEF0	


	LDA #01H
	STA TM1C
	LDA #(FCLK/(2*38000*2)-1)			;38KHZ
	STA TM1V
	LDA #01H
	TSB TM1C

	LDA #04H					;Open Timer1 interrput for Count38k
	TSB IEF0

	LDA #80H
	TRB BP0C							;平时关IR_LED
	TRB BP0								;平时为低

;	LDA #3FH
;	STA KeyBP0
	
	
;	LDA #0FH
;	STA KeyBP1
	LDA #1
	STA Run_FRIST


	RTS	

	
;=======================function:IRDelay 1ms* X = X ms
IRDelay:	
IRDelayLP:
	STZ Count38k
Dey1ms:
	LDA Count38k
	SEC
	SBC #76										;76/2=38, 1t = 38*(1/38khz)=1ms
	BCC Dey1ms	
	DEX			
	BNE IRDelayLP 
	RTS


	ENDS



;==========================================================================
;	ASSIGN INTERRUPT VECTORS INSIDE THIS SECTION
;==========================================================================
	VECTOR:	SECTION
	ORG	1000H
	DW	0040H			;DO NOT REMOVE
	DW	0000H			;DO NOT REMOVE

	ORG	100EH
	DW	0990H			;IV OF BRK
	
	ORG	1010H
	DW	TM0_ISR			;TIMER 0 ISR   ;DO NOT REMOVE
	DW 	TM1_ISR			;TIMER 1 ISR   ;DO NOT REMOVE
	DW 	TMG0_ISR		;TIEMRG 0 ISR  ;DO NOT REMOVE
	DW 	TMG1_ISR		;TIMERG 1 ISR 
	DW	PORT_ISR		;DO NOT REMOVE
	
	ORG 	101AH
	DW	0000H
	DW	MAIN_START		;IV OF RESET
	DW 	IRQ_ISR			;IV OF IRQ
	
	ORG 	102EH
	DW	0584H			;DO NOT REMOVE

	ENDS


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -