📄 radio.asm
字号:
;==================================
;Project:Radio
;Date
;Author:Hsm
;Body:P092-28pin
;=================================
LIST p=16C57
;*********RAM Define*********
INDEX equ 00h
TMR0 equ 01h
PCL equ 02h
Status equ 03h
FSR equ 04h
PA equ 05h
PB equ 06h
PC equ 07h
INTCON equ 08h
DataBuf0 equ 09H
DataBuf1 equ 0ah
Flag0 equ 0bh
Flag1 equ 0ch
SaveChanFlag equ 0dh
Second equ 0eh
ReadDataWaitTime equ 0fh
;============Bank0===========
SendData0 equ 10h
SendData1 equ 11h
SendData2 equ 12h
SendData3 equ 13h
AMAdjust0 equ 14h
AMAdjust1 equ 15h
SaveChan10 equ 16h
SaveChan11 equ 17h
SaveChan20 equ 18h
SaveChan21 equ 19h
SaveChan30 equ 1ah
SaveChan31 equ 1bh
SaveChan40 equ 1ch
SaveChan41 equ 1dh
SaveChan50 equ 1eh
SaveChan51 equ 1fh
;============Bank1===========
LcdRAMBuf0 equ 10h
LcdRAMBuf1 equ 11h
LcdRAM00 equ 12h
LcdRAM01 equ 13h
LcdRAM10 equ 14h
LcdRAM11 equ 15h
LcdRAM20 equ 16h
LcdRAM21 equ 17h
LcdRAM30 equ 18h
LcdRAM31 equ 19h
LcdFlag equ 1ah
LcdDriveCnt equ 1bh
LcdDelayTime equ 1ch
KeyDelayTime equ 1dh
VolStep equ 1eh
VolCycle equ 1fh
;============Bank2===========
FMData0 equ 10h
FMData1 equ 11h
AMData0 equ 12h
AMData1 equ 13h
ClockHour equ 14h
ClockMin equ 15h
Alarm1Hour equ 16h
Alarm1Min equ 17h
Alarm2Hour equ 18h
Alarm2Min equ 19h
KiloBit equ 1ah
HundBit equ 1bh
TenBit equ 1ch
OneBit equ 1dh
BCDData1 equ 1eh
BCDData0 equ 1fh
;============Bank3===========
AdjustTime equ 10h
Timer1s equ 11h
Timer500ms equ 12h
KeyPressTime equ 13h
AutoTime equ 14h
;**************IO Define*************
#Define PCom0 PA,0
#Define PCom1 PA,1
#Define PCom2 PA,2
#Define PCom3 PA,3
#Define PCD PC,2 ;PA,4
#Define PSeg0 PB,0
#Define PSeg1 PB,1
#Define PSeg2 PB,2
#Define PSeg3 PB,3
#Define PSeg4 PB,4
#Define PSeg5 PB,5
#Define PSeg6 PB,6
#Define PSeg7 PB,7
#Define PSeg8 PC,0
#Define PSeg9 PC,1
#Define PData PC,7
#Define PClk PC,6
#Define PCs PC,5
#Define PBand PC,4
#Define PPower PC,3
#Define PVol PC,2
#Define PKeyBand PB,0
#Define PKeyBandInc PB,1
#Define PKeyBandDec PB,2
#Define PKeyVolInc PB,3
#Define PKeyVolDec PB,4
#Define PKeyBand1 PB,5
#Define PKeyBand2 PB,6
#Define PKeyBand3 PB,7
#Define PKeyBand4 PC,0
#Define PKeyBand5 PC,1
;*************Flag Define***********
#Define FLcd1A LcdRAM00,0
#Define FLcd1B LcdRAM10,1
#Define FLcd1C LcdRAM30,1
#Define FLcd1D LcdRAM30,0
#Define FLcd1E LcdRAM20,0
#Define FLcd1F LcdRAM10,0
#Define FLcd1G LcdRAM20,1
#Define FLcd2A LcdRAM00,2
#Define FLcd2B LcdRAM10,3
#Define FLcd2C LcdRAM30,3
#Define FLcd2D LcdRAM30,2
#Define FLcd2E LcdRAM20,2
#Define FLcd2F LcdRAM10,2
#Define FLcd2G LcdRAM20,3
#Define FLcd3A LcdRAM00,4
#Define FLcd3B LcdRAM10,5
#Define FLcd3C LcdRAM30,5
#Define FLcd3D LcdRAM30,4
#Define FLcd3E LcdRAM20,4
#Define FLcd3F LcdRAM10,4
#Define FLcd3G LcdRAM20,5
#Define FLcd4A LcdRAM00,6
#Define FLcd4B LcdRAM10,7
#Define FLcd4C LcdRAM30,7
#Define FLcd4D LcdRAM30,6
#Define FLcd4E LcdRAM20,6
#Define FLcd4F LcdRAM10,6
#Define FLcd4G LcdRAM20,7
#Define FLCDPlay LcdRAM00,5
#Define FLCDAlarm1 LcdRAM01,0
#Define FLCDAlarm2 LcdRAM11,0
#Define FLCDSleep LcdRAM01,1
#Define FLCDSnooze LcdRAM11,1
#Define FLCDRDM LcdRAM00,7
#Define FLCDRPT LcdRAM21,1
#Define FLCDPROG LcdRAM31,1
#Define FLCDPM LcdRAM00,1
#Define FLcdAM LcdRAM21,0
#Define FLcdFM LcdRAM31,0
#Define FLcdDOT LcdRAM00,3
#Define FLcdHi LcdFlag,0
#Define FLcdOff LcdFlag,1
#Define FC Status,0
#Define FDC Status,1
#Define FZ Status,2
#Define FPD Status,3
#Define FTO Status,4
#Define FPA0 Status,5
#Define FPA1 Status,6
#Define FPA2 Status,7
#Define FBank0 FSR,5
#Define FBank1 FSR,6
#Define FAMLed Flag0,0
#Define FFMLed Flag0,1
#Define FClockLed Flag0,2
#Define FAlarm1Led Flag0,3
#Define FAlarm2Led Flag0,4
#Define FKeyPress Flag0,5
#Define FFM Flag0,6
#Define FSendData Flag0,7
#Define F500ms Flag1,0
#Define FLedFlash Flag1,1
#Define FBandAdjust Flag1,2
#Define FReadData Flag1,3
#Define FRadioInit Flag1,4
#Define FAutoTime Flag1,5
#Define FAutoOn Flag1,6
#Define FBand1Flag SaveChanFlag,0
#Define FBand2Flag SaveChanFlag,1
#Define FBand3Flag SaveChanFlag,2
#Define FBand4Flag SaveChanFlag,3
#Define FBand5Flag SaveChanFlag,4
#Define FVol100ms SaveChanFlag,5
;***********Const Define**********
CKeyDelayTime equ 020h
CLcdDelayTime equ 001h
CKeyReadDelay equ 080h
CFMDataMax0 equ 03dh
CFMDataMax1 equ 004h ;108.5
CFMDataMin0 equ 06bh
CFMDataMin1 equ 003h ;87.5
CAMDataMax0 equ 063h
CAMDataMax1 equ 006h ;1635
CAMDataMin0 equ 013h
CAMDataMin1 equ 002h ;531
CVolStepMax equ d'5'
CVolStepMin equ d'2'
CVolCycleMax equ d'50'
CTimer1s equ 0f7h
CTimer500ms equ 07bh
CAutoTime equ d'100'
CAdjustTime equ 00ah
CKeyPressTime equ 020h
CReadDataWaitTime equ d'50'
CFMCDMax1 equ 02ah
CFMCDMax0 equ 017h
CFMCDMin1 equ 029h
CFMCDMin0 equ 081h
CAMCDMax1 equ 001h
CAMCDMax0 equ 0c2h
;=================Macro=====================
Page0 macro
bcf FPA0
bcf FPA1
endm
Page1 macro
bsf FPA0
bcf FPA1
endm
Page2 macro
bcf FPA0
bsf FPA1
endm
Page3 macro
bsf FPA0
bsf FPA1
endm
Bank0 macro
bcf FBank0
bcf FBank1
endm
Bank1 macro
bsf FBank0
bcf FBank1
endm
Bank2 macro
bcf FBank0
bsf FBank1
endm
Bank3 macro
bsf FBank0
bsf FBank1
endm
;*****************ROM Area***********************
org 0
goto Reset
Reset:
nop
nop
nop
nop
nop
call InitRam
call InitPort
call InitTimer
call InitLcdDrive
Bank0
movlw 06bh
movwf SaveChan10
movwf SaveChan20
movwf SaveChan30
movwf SaveChan40
movwf SaveChan50
movlw 003h
movwf SaveChan11
movwf SaveChan21
movwf SaveChan31
movwf SaveChan41
movwf SaveChan51
movlw 01fh
movwf SaveChanFlag
Bank1
movlw CKeyDelayTime
movwf KeyDelayTime
movlw d'2'
movwf VolStep
Bank2
movlw CAMDataMin0
movwf AMData0
movlw CAMDataMin1
movwf AMData1
movlw CFMDataMin0
movwf FMData0
movlw CFMDataMin1
movwf FMData1
movlw d'12'
movwf ClockHour
movlw d'00'
movwf ClockMin
movlw d'13'
movwf Alarm1Hour
movlw d'01'
movwf Alarm1Min
movlw d'14'
movwf Alarm2Hour
movlw d'02'
movwf Alarm2Min
Bank3
movlw CAdjustTime
movwf AdjustTime
bsf FFMLed
bsf FFM
bsf FSendData
bcf PBand
bsf PPower
bcf PVol
bsf FRadioInit
;*******************************
;*******************************
MainLoop:
; goto Volume
VolumeRet:
goto ReadCDData
ReadCDDataRet:
Page1
goto LcdDrive
LcdDriveRet:
Page1
goto FillLcdRAM
FillLcdRAMRet:
Page3
goto Timer
TimerRet:
Page2
goto KeyCheck
KeyCheckRet:
Page3
goto SendData
SendDataRet:
Page2
goto IfAutoAdjustBand
IfAutoAdjustBandRet:
goto MainLoop
;*******************************
;*******************************
InitRam:
movlw 08h
movwf FSR
InitRamLoop1:
clrf INDEX
incf FSR,1
movlw 01fh
andwf FSR,0
xorlw 00h
btfss FZ
goto InitRamLoop1
movlw 30h
movwf FSR
InitRamLoop2:
clrf INDEX
incf FSR,1
movlw 01fh
andwf FSR,0
xorlw 0
btfss FZ
goto InitRamLoop2
movlw 50h
movwf FSR
InitRamLoop3:
clrf INDEX
incf FSR,1
movlw 01fh
andwf FSR,0
xorlw 0
btfss FZ
goto InitRamLoop3
movlw 70h
movwf FSR
InitRamLoop4:
clrf INDEX
incf FSR,1
movlw 01fh
andwf FSR,0
xorlw 0
btfss FZ
goto InitRamLoop4
InitRamEnd:
retlw 0
InitPort:
movlw 0
tris PA
tris PB
movlw b'00000100'
tris PC
clrf PA
clrf PB
clrf PC
InitPortEnd:
retlw 0
InitTimer:
movlw 03h
option
clrf TMR0
InitTimerEnd:
retlw 0
InitLcdDrive:
clrf PA
clrf PB
clrf PC
Bank1
movlw 1
movwf LcdDriveCnt
InitLcdDriveEnd:
retlw 0
;===========================================
VolumeTab:
addwf PCL
retlw d'00'
retlw d'10'
retlw d'20'
retlw d'30'
retlw d'40'
retlw d'55'
Volume:
; btfss FVol100ms
; goto VolumeEnd
; bcf FVol100ms
Bank1
incf VolCycle,1
movlw CVolCycleMax
subwf VolCycle,0
btfsc FC
clrf VolCycle
movf VolStep,0
call VolumeTab
; movf VolCycle,0
subwf VolCycle,0
btfsc FC
goto SetVol
ClrVol:
bcf PVol
goto VolumeEnd
SetVol:
bsf PVol
goto VolumeEnd
VolumeEnd:
goto VolumeRet
;===========================================
ReadCDData:
btfss FReadData
goto ReadCDDataEnd
decfsz ReadDataWaitTime,1
goto ReadCDDataEnd
bcf FReadData
Bank0
clrf SendData0
clrf SendData1
clrf SendData2
clrf SendData3
movlw d'24'
movwf DataBuf0
ReadDataLoop:
nop
nop
nop
nop
bsf PClk
movlw 05h
movwf DataBuf1
ClkDelay_ReadCD:
nop
nop
decfsz DataBuf1,1
goto ClkDelay_ReadCD
bcf PClk
bcf SendData0,0
btfsc PCD
bsf SendData0,0
decfsz DataBuf0
goto $+2
goto ExitReadCDData
rlf SendData0
rlf SendData1
rlf SendData2
; rlf SendData3
goto ReadDataLoop
ExitReadCDData:
bcf PClk
CmpeCDData:
btfss FFM
goto CmpeAMCDData
CmpeFMCDData:
goto ReadCDDataEnd
CmpeAMCDData:
goto ReadCDDataEnd
ReadCDDataEnd:
goto ReadCDDataRet
;=============================
Org 200h
;=============================
FigureTab:
addwf PCL
retlw 3FH
retlw 06H
retlw 5BH
retlw 4FH
retlw 66H
retlw 6DH
retlw 7DH
retlw 07H
retlw 7FH
retlw 6FH
retlw 77H
retlw 7CH
retlw 39H
retlw 5EH
retlw 79H
retlw 71H
BCDCode:
clrf KiloBit
clrf HundBit
clrf TenBit
clrf OneBit
btfsc FFMLed
goto BCDCode_4Bit
btfsc FAMLed
goto BCDCode_4Bit
goto BCDCode_2Bit
BCDCode_4Bit:
movf BCDData0,0
movwf DataBuf0
movf BCDData1,0
movwf DataBuf1
IfAboveKilo: ;1000=3ebh
movlw 0e8h
subwf BCDData0,0
btfss FC
decf BCDData1,1
movlw 003h
subwf BCDData1,0
btfss FC
goto NoAboveKilo
movf DataBuf0,0
movwf BCDData0
movf DataBuf1,0
movwf BCDData1
incf KiloBit,1
movlw 0e8h
subwf BCDData0,1
btfss FC
decf BCDData1,1
movlw 03h
subwf BCDData1,1
goto CountHundBit
NoAboveKilo:
movf DataBuf0,0
movwf BCDData0
movf DataBuf1,0
movwf BCDData1
CountHundBit:
movlw 064h
subwf BCDData0,0
movwf DataBuf0
movlw 00h
btfss FC
movlw 01h
subwf BCDData1,0
movwf DataBuf1
btfss FC
goto CountTenBit
CountHundBitLoop:
incf HundBit,1
movf DataBuf0,0
movwf BCDData0
movf DataBuf1,0
movwf BCDData1
goto CountHundBit
CountTenBit:
movlw 00ah
subwf BCDData0,0
movwf DataBuf0
btfss FC
goto CountOneBit
CountTenBitLoop:
incf TenBit,1
movf DataBuf0,0
movwf BCDData0
goto CountTenBit
CountOneBit:
movf BCDData0,0
movwf OneBit
goto BCDCodeEnd
BCDCode_2Bit:
movf BCDData1,0
movwf HundBit
clrf KiloBit
CountHourBCDLoop:
movlw 00ah
subwf HundBit,0
btfss FC
goto BCDCode_2Bit_1
movwf HundBit
incf KiloBit,1
goto CountHourBCDLoop
BCDCode_2Bit_1:
movf BCDData0,0
movwf OneBit
clrf TenBit
CountMinBCDLoop:
movlw 00ah
subwf OneBit,0
btfss FC
goto BCDCode_2Bit_2
movwf OneBit
incf TenBit,1
goto CountMinBCDLoop
BCDCode_2Bit_2:
goto BCDCodeEnd
BCDCodeEnd
retlw 0
LcdDrive:
Bank1
decfsz LcdDelayTime,1
goto LcdDriveEnd
movlw CLcdDelayTime
movwf LcdDelayTime
btfss FLcdOff
goto NoClearLcd
ClearLcd:
bcf FLcdOff
call ClearAllLcd
goto LcdDriveEnd
NoClearLcd:
btfsc FLcdHi
goto LcdHi
;*****************************
LcdLo:
LcdLo0:
movf LcdDriveCnt,0
xorlw 01h
btfss FZ
goto LcdLo1
movlw b'00001110'
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -