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

📄 time-name.asm

📁 用汇编语言实现时间和姓名在LCD上实现的程式
💻 ASM
📖 第 1 页 / 共 4 页
字号:
    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
		sta	rByDivision+1
		sta	rByDivision+2
		sta	rByDivision+3

		ldx	#33             ;;for 32 bit

lDivionLoop_32By16:
;;compare rByDivision,rDivision

		lda	rByDivision+3
		cmp	#0
		bcc	lNextShift_32By16
		bne	lRemoveIt_32By16

		lda	rByDivision+2
		cmp	#0
		bcc	lNextShift_32By16
		bne	lRemoveIt_32By16

		lda	rByDivision+1
		cmp	rDivision+1
		bcc	lNextShift_32By16
		bne	lRemoveIt_32By16

		lda	rByDivision
		cmp	rDivision
		bcc	lNextShift_32By16
lRemoveIt_32By16:
		sec

		lda	rByDivision
		sbc	rDivision
		sta	rByDivision

		lda	rByDivision+1
    sbc	rDivision+1
    sta	rByDivision+1

		lda	rByDivision+2
		sbc	#0
		sta	rByDivision+2

		lda	rByDivision+3
		sbc	#0
		sta	rByDivision+2

lNextShift_32By16
		rol	rResult
		rol	rResult+1
		rol	rResult+2
		rol	rResult+3

		rol	rByDivision
 		rol	rByDivision+1
		rol	rByDivision+2
		rol	rByDivision+3

		dex
		bne	lDivionLoop_32By16

		clc
		ror	rByDivision+3
		ror	rByDivision+2
		ror	rByDivision+1
		ror	rByDivision+0
		rts
;;*************************************************************
;;Function: Display a number on LCD
;;  Input : X--> number ( 0 ~ 9) , A--> which location ( 0 ~ 7)
;;*************************************************************

⌨️ 快捷键说明

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