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

📄 sub.inc

📁 用汇编语言实现时间和姓名在LCD上实现的程式
💻 INC
📖 第 1 页 / 共 2 页
字号:
;;##########################################################################
;Function: Transfer Bin into BCD
;Input: rBcdBuffer,rBcdBuffer+1  十六进制数放入
;Input Data Format: Low byte-->rResult;High byte-->rResult+1
;Output:rBcdBuffer+1,rBcdBuffer  BCD十进制数放入
;Output Data Format: Low byte-->rBcdBuffer;High byte-->rBcdBuffer+3
;Example:FFB1(Hex) --> 65457(BCD)
;        rResult=B1,rResult+1=FF
;        rBcdBuffer=57,rBcdBuffer+1=54,rBcdBuffer+2=06
;Used Register and RAM:x,a,rResult,rResult+1
;called subroutine: none
;By: Tony Kuai 2007/10/14
;;############################################################################
F_HexToBcd:
		lda	rBcdBuffer
		sta	rResult
		lda	rBcdBuffer+1
		sta	rResult+1				;save input data
		sed									; Switch to decimal mode
		ldx	#16
		lda	#0
		sta	rBcdBuffer
		sta	rBcdBuffer+1
		sta	rBcdBuffer+2		;clear result regs
		clc
LoopGetBCD:		
		rol	rResult					; Shift out one bit
		rol	rResult+1				; Shift out one bit
		lda	rBcdBuffer			; And add into result
		adc	rBcdBuffer
		sta	rBcdBuffer
		lda	rBcdBuffer+1		; And add into result
		adc	rBcdBuffer+1
		sta	rBcdBuffer+1		   	
		lda	rBcdBuffer+2		; And add into result
		adc	rBcdBuffer+2                                 
		sta	rBcdBuffer+2                                 	
		dex									; And repeat for next bit
		bne		LoopGetBCD
		cld									; Back to binary
		rts 
;;***********************************************************
;;Function: Diaplay the Result,Include Digital and Unit
;;input:    rBcdBuffer,rBcdBuffer+1,rBcdBuffer+2
;;***********************************************************
F_Display_hour: 
		lda	rHourData
		sta	rBcdBuffer
		lda	#InitializationValue	;;display the minutes
    sta	rBcdBuffer+1
    jsr	F_HexToBcd
    lda	rBcdBuffer
		ror	a
		ror	a
		ror	a
		ror	a							
		and	#$0fh
		sta	rBcdBuffer+2			    		
		lda	rBcdBuffer					;;rBcdBuffer+2--0;rBcdBuffer+1--1
		and	#$0fh
		sta	rBcdBuffer+1
lDisplayNineBit:	
		lda	#Digital_9
 		ldx	rBcdBuffer+1				;;	    lcd 8 9
 		jsr	F_ShowDigital 		  ;;show hour 0 1 :
lDisplayEightBit:
		lda	#Digital_8
 		ldx	rBcdBuffer+2
 		jsr	F_ShowDigital 
 	
		rts 
;;***********************************************************
;;subroutine: S_DisplayInitializeSecondesOnLCD
;;Function: Display InitializeSecondes on LCD
;;input:    rBcdBuffer,rTimingValue
;;Output:	
;;Action:
;;Destroy:
;;Notes:
;;***********************************************************	
F_DisplayInitializeSecondes:
  	lda	rTimingValue
		sta	rBcdBuffer
		jsr	S_DisplaySecondes
	
		rts
;;***********************************************************
;;subroutine: S_DisplayInitializeSecondesOnLCD
;;Function: Display InitializeSecondes on LCD
;;input:    rTimingValue
;;Output:	
;;Action:
;;***********************************************************
S_DisplayZeroOnSec:		
		lda	#rTiming_Initialize_Sec
 		sta	rTimingValue
 		jsr	S_DisplaySecondes
 		 	
 		rts
;;***********************************************************
;;subroutine: S_DisplayYearlOnLCD
;;Function: Display year on LCD
;;input:    rBcdBuffer,rBcdBuffer+1
;;Output:	
;;Action:
;;Destroy:
;;Notes:
;;***********************************************************	
S_DisplayNameOnLCD:
L_DisplayFirstDigital:	
		lda	#Digital_1
 		ldx	#NumberR
 		jsr	F_ShowDigital 
L_DisplaySecondDigital:
		lda	#Digital_2
 		ldx	#Numberi
 		jsr	F_ShowDigital 
 L_DisplayThirdDigital:	
		lda	#Digital_3
 		ldx	#NumberC
 		jsr	F_ShowDigital 
L_DisplayFourDigital:
		lda	#Digital_4
 		ldx	#Numberk
 		jsr	F_ShowDigital
 		
 		rts
;;***********************************************************
;;Function: Diaplay the Result,Include Digital and Unit
;;input:    rBcdBuffer,rBcdBuffer+1,rBcdBuffer+2
;;***********************************************************
F_DisplayResult_minutes:
		lda	rMinutesData
		sta	rBcdBuffer
		lda	#InitializationValue	;;display the minutes
    sta	rBcdBuffer+1
    jsr	F_HexToBcd
    lda	rBcdBuffer
		ror	a
		ror	a
		ror	a
		ror	a							
		and	#$0fh
		sta	rBcdBuffer+2			    		
		lda	rBcdBuffer					;;rBcdBuffer+2--0;rBcdBuffer+1--1
		and	#$0fh
		sta	rBcdBuffer+1				  			
lDisplayElevenBit:
		lda	#Digital_11
 		ldx	rBcdBuffer+1				;;	       lcd 10 11
 		jsr	F_ShowDigital 			;;show minutes: 0  1
lDisplayTenBit:
		lda	#Digital_10
 		ldx	rBcdBuffer+2
 		jsr	F_ShowDigital 
 	
		rts 	  
;;***********************************************************
;;subroutine:S_KeyCheck_Hour
;;Function:Check Hour&Hour++/Hour--
;;input:rHourData
;;Output:
;;*********************************************************** 
S_ModifyHour:
		jsr	S_WatchDogClear
	
		lda	rHourData
		sta	rBcdBuffer
		lda	#00h
		sta	rBcdBuffer+1
		jsr	F_HexToBcd

		lda	rBcdBuffer
		and	#0fh
		sta	R_KeyInputNumber

		lda	#Digital_9
		sta	R_KeyInputLocation

		lda	R_KeyMenuLevel
		ora	#(FlagLCDFlash+FlagLCDFlashIsOn)
		sta	R_KeyMenuLevel
		jsr	S_LCDFlashOneDigital		;Lock the previous input number on LCD
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++		
		jsr	S_DisplayZeroOnSec
S_KeyCheck_Hour:
		jsr	S_WatchDogClear
		lda	rTimingValue
		cmp	#3BH;rOneMin
		bcs	S_NoKeyExitModify_Hour		;;If no key press,one minutes later will exit the Hour's midify,Now have bug

		lda	P_03H_PortB_Data   	
		and	#FunTimeIncHour;P_B0_Value
 		beq	S_ModeKeyAdd_Hour	;;Hour++

		lda	P_03H_PortB_Data   	
		and	#ModeModifyHour;P_B1_Value
		beq	S_MakeSureHour		;;Set "Hour" OK

 		lda	P_03H_PortB_Data   	
  	and	#FunTimeDec;P_B2_Value
 		beq	S_ModeKeySub_Hour	;;Hour--

		jmp	S_KeyCheck_Hour
S_NoKeyExitModify_Hour:
		jmp	S_ExitModify_Hour
S_ModeKeyAdd_Hour:
		jsr	S_DisplayZeroOnSec

S_WaitModeKeyAdd_Hour:
		jsr	S_WatchDogClear
		lda	P_03H_PortB_Data
		and	#FunTimeIncHour;P_B0_Value
		beq	S_WaitModeKeyAdd_Hour

		inc	rHourData
  	lda	rHourData
		cmp	#rOneDay
		bcs	S_ClearHour
  	jsr	F_Display_hour
		jmp	S_ModifyHour
S_ClearHour:
		lda	#rHour_Initialize
		sta	rHourData
		jsr	F_Display_hour

		jsr	S_DisplayZeroOnSec
 		jmp	S_ModifyHour
;---------------------------------------
S_ModeKeySub_Hour:
		jsr	S_DisplayZeroOnSec

S_WaitModeKeySub_Hour:
		jsr	S_WatchDogClear
		lda	P_03H_PortB_Data
		and	#FunTimeDec;P_B2_Value
		beq	S_WaitModeKeySub_Hour
test:
		lda	rHourData
		cmp	#rHour_Initialize	;;Check the hour is "00:**"?Yes-->dec hour&&show "23:**";NO-->dec hour;
		bne	S_JumptoDecHour
		jmp	S_Start24H
S_JumptoDecHour:
		dec	rHourData
		jsr	F_Display_hour
		lda	rHourData
		cmp	#rHour_Initialize
		bcc	S_Start24H
		jmp	S_ModifyHour
S_Start24H:
		lda	#rHour_Initialize
		sta	rHourData
		jsr	F_Display_hour		;;Dec Hour to 00:**,Show "00:**"

		lda	#rOneDay					;After Dec Hour to 00:**,Hour begin to 23:**;
		sta	rHourData

		jsr	S_DisplayZeroOnSec
 		jmp	S_KeyCheck_Hour
 ;------------------------------------------- 
 ;                 Hour--
 ;-------------------------------------------	
S_MakeSureHour:
		jsr	S_DisplayZeroOnSec

S_WaitMakesure_Hour:
		jsr	S_WatchDogClear
		lda	P_03H_PortB_Data
		and	#ModeModifyHour;P_B1_Value
		beq	S_WaitMakesure_Hour
S_ExitModify_Hour:
		jsr	S_DisplayZeroOnSec
;++++++++++++++++++++++++++++++++++++++++++++++++++
		lda	R_KeyMenuLevel
		and	#.NOT.(FlagLCDFlash+FlagLCDFlashIsOn)
		sta	R_KeyMenuLevel
		jsr	S_LCDFlashOneDigital		;Lock the previous input number on LCD
;+++++++++++++++++++++++++++++++++++++++++++++++++++
S_NoHourKeyProcess:
  	rts
;;***********************************************************
;;subroutine:S_KeyCheck_Minutes
;;Function:Check Minutes&Minutes++/Minutes--
;;input:rMinutesData
;;Output:
;;*********************************************************** 
S_ModifyMinutes:
		jsr	S_WatchDogClear
		lda	rMinutesData
		sta	rBcdBuffer
		lda	#00h
		sta	rBcdBuffer+1
		jsr	F_HexToBcd

		lda	rBcdBuffer
		and	#0fh
		sta	R_KeyInputNumber

		lda	#Digital_11
		sta	R_KeyInputLocation

		lda	R_KeyMenuLevel
		ora	#(FlagLCDFlash+FlagLCDFlashIsOn)
		sta	R_KeyMenuLevel
		jsr	S_LCDFlashOneDigital		;Lock the previous input number on LCD
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++		
		jsr	S_DisplayZeroOnSec
S_KeyCheck_Minutes:
		jsr	S_WatchDogClear
		lda	rTimingValue
		cmp	#3BH;rOneMin
		bcs	S_NoKeyExitModify_Minutes		;;If no key press,one minutes later will exit the Minutes's midify
 	
		lda	P_03H_PortB_Data   	
  	and	#FunTimeIncMin;P_B0_Value
 		beq	S_ModeKeyAdd_Minutes
 	
		lda	P_03H_PortB_Data
		and	#ModeModifyMin;P_B1_Value
		beq	S_MakeSureMinutes
	
		lda	P_03H_PortB_Data
		and	#FunTimeDec;P_B2_Value
		beq	S_ModeKeySub_Minutes
		jmp	S_KeyCheck_Minutes
S_NoKeyExitModify_Minutes:
		jmp	S_NoMinKeyProcess
S_ModeKeyAdd_Minutes:
		jsr	S_DisplayZeroOnSec

S_WaitModeKeyAdd_Minutes:
		jsr	S_WatchDogClear
		lda	P_03H_PortB_Data
		and	#FunTimeIncMin;P_B0_Value
		beq	S_WaitModeKeyAdd_Minutes

		inc	rMinutesData
		lda	rMinutesData
		cmp	#rOneHour
		bcs	S_ClearMin	
  	jsr	F_DisplayResult_minutes

		jmp	S_ModifyMinutes
S_ClearMin:
		lda	#InitializationValue
		sta	rMinutesData
		jsr	F_DisplayResult_minutes
	
		jsr	S_DisplayZeroOnSec
 		jmp	S_ModifyMinutes
;---------------------------------------
S_ModeKeySub_Minutes:
		jsr	S_DisplayZeroOnSec

S_WaitModeKeySub_Minutes:
		jsr	S_WatchDogClear
		lda	P_03H_PortB_Data
		and	#FunTimeDec;P_B2_Value
		beq	S_WaitModeKeySub_Minutes
	
		lda	rMinutesData
		cmp	#rMinutes_Initialize
		bne	S_JumptoDecMinutes
		jmp	S_StartOneHour
S_JumptoDecMinutes:	
		dec	rMinutesData
		jsr	F_DisplayResult_minutes
		lda	rMinutesData
		cmp	#rMinutes_Initialize
		bcc	S_StartOneHour  	
  	jsr	F_DisplayResult_minutes
		jmp	S_ModifyMinutes
S_StartOneHour:
		lda	#rMinutes_Initialize
		sta	rMinutesData
		jsr	F_DisplayResult_minutes
	
		lda	#rOneHour
		sta	rMinutesData
	
		jsr	S_DisplayZeroOnSec
 		jmp	S_KeyCheck_Minutes
 ;-------------------------------------------
S_MakeSureMinutes:
		jsr	S_DisplayZeroOnSec

		jsr	S_WatchDogClear
		lda	P_03H_PortB_Data
		and	#ModeKeyOK;P_B1_Value
		bne	S_MakeSureMinutes
S_WaitMakesure_minutes:
		jsr	S_WatchDogClear
		lda	P_03H_PortB_Data
		and	#ModeKeyOK;P_B1_Value
		beq	S_WaitMakesure_minutes
S_ExitModify_minutes:
		jsr	S_DisplayZeroOnSec
S_NoMinKeyProcess:
;++++++++++++++++++++++++++++++++++++++++++++++++++
		lda	R_KeyMenuLevel
		and	#.NOT.(FlagLCDFlash+FlagLCDFlashIsOn)
		sta	R_KeyMenuLevel
		jsr	S_LCDFlashOneDigital		;Lock the previous input number on LCD
;+++++++++++++++++++++++++++++++++++++++++++++++++++
  	rts
;===========================================================================================
;End the modify of date(Year,Month,Day,Hour,Minutes)
;===========================================================================================   	   	     	   	   	   	
;;***********************************************************
;;subroutine: S_DisplayDateOnLCD
;;Function: Display date on LCD
;;input:    rBcdBuffer,rBcdBuffer+1
;;*********************************************************** 	
S_DisplaySecondes:
		lda	rTimingValue
		sta	rBcdBuffer
		lda	#InitializationValue	
  	sta	rBcdBuffer+1
  	jsr	F_HexToBcd
  	lda	rBcdBuffer
		ror	a
		ror	a
		ror	a
		ror	a							
		and	#$0fh
		sta	rBcdBuffer+2			    		
		lda	rBcdBuffer				;;rBcdBuffer+2--date high;rBcdBuffer+1--date low
		and	#$0fh
		sta	rBcdBuffer+1
L_FifthDigital_Test1Min:
		lda	#Digital_5
 		ldx	rBcdBuffer+2		
 		jsr	F_ShowDigital 
L_SixthDigital_Test1Min:
		lda	#Digital_6
 		ldx	rBcdBuffer+1
 		jsr	F_ShowDigital
 				
		rts   	
;;**************************************************************
;;Function : Divsion32By16
;;   Input : rByDivision(4),rDivision(2)
;;  Output : rByDivision/rDivision = rResult .... rByDivision
;; Destory : A,X,rByDivision,rDivision,rResult
;;**************************************************************
F_GetDivision32By16:
;;First copy  rByDivsion to higher of dividion
		lda	rByDivision
		sta	rResult
		lda	rByDivision+1
		sta	rResult+1
		lda	rByDivision+2
		sta	rResult+2
		lda	rByDivision+3
		sta	rResult+3

F_GetDivision_32By16:
;;clear all others
		lda	#0
		sta	rByDivision

⌨️ 快捷键说明

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