?? sub.inc.bak
字號:
;;##########################################################################
;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 #P_B0_Value
beq S_ModeKeyAdd_Hour ;;Hour++
lda P_03H_PortB_Data
and #P_B1_Value
beq S_MakeSureHour ;;Set "Hour" OK
lda P_03H_PortB_Data
and #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 #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 #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 #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 #P_B0_Value
beq S_ModeKeyAdd_Minutes
lda P_03H_PortB_Data
and #P_B1_Value
beq S_MakeSureMinutes
lda P_03H_PortB_Data
and #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 #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 #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 #P_B1_Value
bne S_MakeSureMinutes
S_WaitMakesure_minutes:
jsr S_WatchDogClear
lda P_03H_PortB_Data
and #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 + -