?? time-name.asm
字號:
jsr F_ShowChar
.ENDM
%S_Show_TimeDots .MACRO
ldx #cTurn_On
lda #cIcon_ClockDot
jsr F_ShowChar
.ENDM
%S_FlashClock .MACRO
ldx TimeTwoDotsValue
lda #cIcon_Clock
jsr F_ShowChar
.ENDM
%S_Shut_Clock .MACRO
ldx #cTurn_Off
lda #cIcon_Clock
jsr F_ShowChar
.ENDM
%S_Show_Clock .MACRO
ldx #cTurn_On
lda #cIcon_Clock
jsr F_ShowChar
.ENDM
%S_ShutSET .MACRO
ldx #cTurn_Off
lda #cIcon_SET
jsr F_ShowChar
.ENDM
;%S_Shut_START .MACRO
; ldx #cTurn_Off
; lda #cIcon_START
; jsr F_ShowChar
; .ENDM
;-------------------------------
.CODE
RESET:
sei
ldx #FFH
txs
;***************************************************************************************
lda #0
ldx #80H
L_ClearRam:
sta $00H,x
inx
bne L_ClearRam ;Clear Ram (80H-ffH)
%X32KStrongMode
%S_Show_FullBattery
lda #D_Pump_CLK_8K+D_1_8_Duty+D_1_3_Bias+D_Dots_On ;
sta P_04H_LCD_CTL
lda P_04H_LCD_CTL ;LCD set to normal mode
and #.NOT.D_LCD_Mask
ora #D_LCD_Normal
sta P_04H_LCD_CTL
jsr S_WatchDogClear
;-------------------------------------------------------------------
;; Initialize and display the initialization value
;-------------------------------------------------------------------
lda #rTiming_Initialize_Sec
sta rTimingValue
DisplayNameRick:
jsr S_DisplayNameOnLCD
lda #rHour_Initialize
sta rHourData
jsr F_Display_hour ;;show hour "0":00
%S_Show_TimeDots
lda #rMinutes_Initialize
sta rMinutesData
jsr F_DisplayResult_minutes ;;show minutes 0:"00"
jsr S_DisplayZeroOnSec
jsr S_500ms_Delay
;------------------------------------------------------------------
; Initialize INB&IOA
;------------------------------------------------------------------
lda #sP_A0_Reverse
sta TimeTwoDotsValue
lda #P_ADir_High
STA P_01H_PortA_Dir
lda #P_AAttrib_High ;;Initialize IOA output is high
STA P_02H_PortA_Attrib
lda #P_AData_High
STA P_00H_PortA_Data
lda #P_B_initialize
sta P_10H_IO_Config ;;initislize INB
sta P_03H_PortB_Data
;------------------------------------------------------------------
lda #D_CPU_CLK_HSCK_2 ;set CPU clock to HSCK/2
sta P_05H_CPU_CLK
%X32KStrongMode
;------------------------------------------------------------------
; 0.5s interrupt
;===========*****==========*****==========*****==========*****==========
lda #P_0AH_TimerLow
sta P_0AH_TimerLow_Data
lda #P_0BH_TimerHigh
sta P_0BH_TimerHigh_Data ;;set timer is 0.5s
lda #D_Timer_Source1_VDD+D_Timer_Source2_LSCK+D_Timer_Enable ;enable timer
sta P_09H_Timer_Set
;===========*****==========*****==========*****==========*****==========
LDA #D_2Hz_1Hz_SEL ;Set real-time clock 1Hz
STA P_0DH_Timer_Source2
lda #D_INT_T2HZ+D_INT_KEYC+D_INT_TMO
sta P_0EH_INT_SET ;Set Interrupt source: 1HZ+KeyC+TMO
lda #D_WKU_T2HZ+D_WKU_KEYC+D_WKU_TMO
sta P_07H_WKU_Set ;Set wakeup source: 1HZ+KeyChange+TMO
cli
;===========================================================================
; Start KeyCheck&Time Working
;===================================
LoopStartTest: ;Loop Check Funkey&Modekey
;---------------------------------------------
; Modify Hour
;---------------------------------------------
F_KeyProcess_Hour:
jsr S_WatchDogClear
lda P_03H_PortB_Data
and #FunSetTime;P_B0_Value
bne F_KeyProcess_Hour
F_ModeKeyProcess_Hour:
jsr S_WatchDogClear
lda P_03H_PortB_Data
and #FunSetTime;P_B0_Value
beq F_ModeKeyProcess_Hour ;;wait hour Modekey putup
F_ModifyHour: ;key press,goto midify Day
%S_ShowSET
jsr S_ModifyHour
jsr S_DisplayZeroOnSec
;---------------------------------------------
; Modify Minutes
;---------------------------------------------
F_ModifyMinutes: ;key press,goto midify Minutes
jsr S_ModifyMinutes
jsr S_DisplayZeroOnSec
F_OKKeyProcess:
%S_ShutSET
%S_ShowOK
jsr S_500ms_Delay
%S_TurnOffOK
jsr S_DisplayZeroOnSec
jmp LoopStartTest
IRQ:
pha
txa
pha
lda P_07H_WKU_Set
tax
jsr S_WatchDogClear
;;---Check IRQ flag
L_IRQ_ChechFlagLSCK:
txa
and #D_WKU_LSCK_INT
beq L_IRQ_ChechFlagT2Hz
lda #D_WKU_LSCK_INT
sta P_08H_WKU_CLR ;;Clear interrupt flag
jmp lExitIRQ
L_IRQ_ChechFlagT2Hz:
txa
and #D_WKU_T2HZ
beq L_IRQ_CheckTMO
lda #D_WKU_T2HZ
sta P_08H_WKU_CLR ;;Clear interrupt flag
jmp Loop1HzProcess
L_IRQ_CheckTMO:
txa
and #D_WKU_TMO
beq L_IRQ_CheckEXT1 ;;Time Overflow
lda #D_WKU_TMO
sta P_08H_WKU_CLR ;;Clear interrupt flag
jmp Loop1_2HzProcess ;0.5s interrupt
L_IRQ_CheckEXT1:
txa
and #D_WKU_EXT1
beq L_IRQ_OtherIRQ ;;EXT INT1-->recevie clock
lda #D_WKU_EXT1
sta P_08H_WKU_CLR ;;Clear interrupt flag
jmp lExitIRQ
L_IRQ_OtherIRQ:
lda #D_WKU_HSCK_N+D_WKU_EXT2+D_WKU_KEYC;;Clear interrupt flag
sta P_08H_WKU_CLR
jmp lExitIRQ
;;-----Check IRQ flag Over
;=*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
;; 1/2S Process
;=*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
Loop1_2HzProcess:
jsr S_WatchDogClear
lda TimeTwoDotsValue
eor #sP_A0_Reverse
sta TimeTwoDotsValue
%S_Show_TimeTwoDots ;;TimerTwoDots show per 1/2S
; %S_FlashClock
lda R_KeyMenuLevel
and #FlagLCDFlash
beq L_IRQDoNotFlashLCD
%S_FlashClock ;;When modify the date,the "Clock" will flash
jsr S_LCDFlashOneDigital
L_IRQDoNotFlashLCD:
jmp lExitIRQ
;=*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
;; 1Hz Process
;=*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
Loop1HzProcess: ;tbd by RickDing
jsr S_WatchDogClear
inc rTimingValue
jsr F_DisplayInitializeSecondes ;;Show secondes
;--*****-------------****-------------****---------****--------------****------**---
L_LoopTimingTest:
lda rTimingValue
cmp #rOneMin
bne lExitIRQ ;;judge one minute(60 second),60s?YES--rMinutesData+1;NO--F_ExitIRQ,Loop Test
lda #rTiming_Initialize_Sec
sta rTimingValue ;;1 minute;clear second to 0S
;--*****-------------****-------------****---------****--------------****------**---
jsr S_DisplaySecondes ;Test 1S
;---****-------------****--------------****--------****--------------****------**---
inc rMinutesData
jsr F_DisplayResult_minutes ;;after 60s,minutesdata+1&show minutes
lda rMinutesData
cmp #rOneHour
bne lExitIRQ ;;judge one hour(60 minutes)
lda #InitializationValue
sta rMinutesData ;60 minutes[one hour] later,set minutes=$00h
sta rTimingValue ;60 minutes[one hour] later,set second=$00h
jsr F_DisplayResult_minutes
jsr S_DisplaySecondes
inc rHourData
jsr F_Display_hour
lda rHourData
cmp #rOneDay
bne lExitIRQ ;;judge one day(24 hours)
lda #rHour_Initialize
sta rHourData
jsr F_Display_hour ;;24 hours later,set hour=$00h&display
lda #rMinutes_Initialize
sta rMinutesData
jsr F_DisplayResult_minutes ;;24 hours later,set minutes=$00h&display
lda #rTiming_Initialize_Sec
sta rTimingValue ;;one day[24 hours]later,set Second=$00h
jsr S_DisplaySecondes
lExitIRQ:
pla
tax
pla
rti
NMI:
nop
nop
rti
;--------------------Subroutine---------------------------
;;##########################################################################
;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
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -