📄 main.asm
字号:
;==========================================================
;
; 模块: FM发射模块控制代码
;
; 版本: 1.01
;
; 日期: 2007-5-21
;
; 作者: 施探宇
;
; 说明: 24C02,FM1417,Keys,LED-Light,LCD1621
;
;
;==========================================================
;==========================================================
; 初始化寄存器
;==========================================================
R0 == 0X00
R1 == 0x01
PC == 0x02
STATU == 0x03
R4 == 0x04
P5 == 0x05
P6 == 0x06
IOCB == 0x0B
IOCC == 0x0C
IOCD == 0x0D
WTD == 0x0E
RF == 0x0F
C == 0x00
DC == 0x01
Z == 0x02
;==========================================================
; 自定义的变量(全局变量)
;==========================================================
A_buff == 0x10 ;A寄存器备份
MenuMode == 0x11 ;菜单模式
FmChannel == 0x12 ;频道(0~7)
FmMode == 0x13 ;FM模式(87.5-108.0)(0x00-0xCD)
FmChange == 0x14 ;FM是否改变,CH是否改变
N1 == 0x15 ;Delay5ms循环
N2 == 0x16 ;Delay5ms循环
SpiAddr == 0x17 ;Spi模式地址
SpiData == 0x18 ;Spi模式数据
I2cDevId == 0x19 ;I2c器件序号
I2cAddr == 0x1A ;I2c地址
I2cData == 0x1B ;I2c数据
L1 == 0x1C ;5
L2 == 0x1D ;7
L3 == 0x1E ;8
L4 == 0x1F ;0
;==========================================================
; 计数变量
;==========================================================
LedCnt0 == 0x20 ;背光计时
LedCnt1 == 0x21 ;背光计时(>200?)
PressCnt0 == 0x22 ;按键计时
PressCnt1 == 0x23 ;按键计时
FlashCnt0 == 0x24 ;闪屏计时
FlashCnt1 == 0x25 ;闪屏计时
RepeatKeys == 0x26 ;连续按键
;==========================================================
; 全局常量
;==========================================================
;按键触发标志
BIT_FM_CHG == 0
BIT_CH_CHG == 1
BIT_MD_CHG == 2
;频道保存地址
ChAddress == 0x08
;24c02器件地址
A24c02Id == 0xA0
;背光关闭时间
LedOffTime == 200
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;(87.5)*10->036B
;(108.0 - 87.5)*10 = 0xCD
;MIN_FM_HI == 0x03
;MIN_FM_LO == 0x6B
;MAX_STEP == 0xCD
;MIN_C4 == 0
;MIN_C3 == 8
;MIN_C2 == 7
;MIN_C1 == 5
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;(88.1)*10=0x0371
;(107.9-88.1)*10=0xC6
MIN_FM_HI == 0x03
MIN_FM_LO == 0x71
MAX_STEP == 0xC6
MIN_C4 == 0
MIN_C3 == 8
MIN_C2 == 8
MIN_C1 == 1
;==========================================================
;
; MenuMode: = 0
; Up,Down,Menu = Chanel+/Chanel-/FmMode
; MenuMode: = 1
; Up,Down,Menu = Fm+/Fm-/Save
;
;==========================================================
; 定义数据位
;==========================================================
;---------------------------------------------
; I2C控制脚位
;---------------------------------------------
ACK == 0 ;应答位
;---------------------------------------------
; (Port6.1 - SCL,Port6.2 - SDA)
;---------------------------------------------
SCL == 1 ;I2c-SCL脚
SDA == 2 ;I2c-SDA脚
OI2c_SDA == 0B00000100 ;OR 控制位用
AI2c_SDA == 0B11111011 ;AND控制位用
I2cPort == P6
;---------------------------------------------
; (Port5.0 - STB,Port5.2 - CLK,Port5.3 - DAT)
;---------------------------------------------
STB == 0 ; 用于1621
ENA == 1 ; 用于1418
CLK == 2 ; WR共用
DAT == 3 ; DI/DO共用
RD == 1 ; 读数据
WR == 2 ; 写数据
OSPI_DAT == 0B00001000
ASPI_DAT == 0B11110111
SpiPort == P5
;---------------------------------------------
; (Port6.7 - Up,Port6.6 - Menu,Port6.3 - Down)
;---------------------------------------------
KeyUp == 7
KeyDown == 3
KeyMenu == 6
KeyPort == P6
;---------------------------------------------
; (Port6.5 - led Light.Port6.6 - FmPower)
;---------------------------------------------
LedLight == 5
LedPower == 6
LedPort == P6
;===========================================================
; Start()
;===========================================================
ORG 0x00
JMP Start
;------------------------------
; 中断表[1]
;------------------------------
ORG 0x01
RETI
;------------------------------
; 中断表[8]
;------------------------------
ORG 0x08
RETI
;------------------------------
; 程序开始
;------------------------------
ORG 0x20
Start:
CALL Clean
;设定看门狗
MOV A, @0B00001110
CONTW
;开启看门狗
MOV A, @0B10000000
IOW WTD
;P5端设置
MOV A, @0B00000000
IOW P5
MOV A, @0B00001111
MOV P5, A
;P6漏极开关
MOV A, @0B00000000
IOW IOCC
;P6上拉设定
MOV A, @0B00000000
IOW IOCD
;P6端设置输入(P6.3-Down,P6.6-Menu,P6.7-Up)
MOV A, @0B11001000
IOW P6
MOV A, @0B11111111
MOV P6,A
;---------------------------
; 初始化模式(87.5+FmMode)
;---------------------------
CLRA
MOV MenuMode,A
MOV FmChannel,A
MOV FmMode,A
MOV FmChange,A
;---------------------------
; 测试24C02:OK
;---------------------------
;读出频道
MOV A,@A24c02Id
MOV I2cDevId,A
MOV A,@ChAddress
MOV I2cAddr,A
CALL I2cRead
;检查频道(CH = 0~7)
AND A,@0x07
MOV FmChannel,A
CALL Delay5ms
;读出频率
MOV A,FmChannel
MOV I2cAddr,A
CALL I2cRead
MOV FmMode,A
CALL CheckModeDown
CALL Delay5ms
;---------------------------
; 开机FM模式
;---------------------------
MOV A,FmMode
CALL SpiFmWrite
;---------------------------
; 初始化LCD
;---------------------------
CALL LcdInit
CALL LcdClearAll
;---------------------------
; 显示FM
;---------------------------
MOV A,FmMode
CALL ConvertFm
CALL LcdShowFm
;---------------------------
; 显示CH
;---------------------------
MOV A,FmChannel
CALL LcdShowCh
;---------------------------
; 显示背光
;---------------------------
BS LedPort,LedLight
;---------------------------
; 清全局变量
;---------------------------
CLR LedCnt0
CLR LedCnt1
CLR FlashCnt0
CLR FlashCnt1
CLR PressCnt0
CLR PressCnt1
CLR RepeatKeys
;===================================================
; Main();万物由此开始,盘古在此开天地!
;===================================================
Main:
CALL Delay5ms
BckLightBegin:
;检查背光是否到时间关闭!
;if(LedCnt1 > LedOffTime)
; goto BckLightEnd;
;else
; LedCnt1++;
MOV A,LedCnt1
SUB A,@LedOffTime
JBS STATU,C
JMP BckLightEnd
; LedCnt[01]++;
INC LedCnt0
JBC STATU,Z
INC LedCnt1
CALL Delay5ms
;if(LedCnt1 == LedOffTime)
; LightOff();
MOV A,LedCnt1
SUB A,@LedOffTime
JBS STATU,Z
JMP BckLightEnd
;关闭背光灯
BC LedPort,LedLight
;保存频道
MOV A,@ChAddress
MOV I2cAddr,A
MOV A,FmChannel
MOV I2cData,A
CALL I2cWrite
BckLightEnd:
NOP
;是否需要闪动?
JBS MenuMode,0
JMP FlashDone
FlashBegin:
;闪动计数器
INC FlashCnt0
JBC STATU,C
INC FlashCnt1
;
MOV A,FlashCnt1
SUB A,@5
JBC STATU,Z
JMP FlashShow
MOV A,FlashCnt1
SUB A,@10
JBC STATU,Z
JMP FlashHide
JMP FlashDone
FlashShow:
INC FlashCnt1
MOV A,FmMode
CALL ConvertFm
CALL LcdShowFm
JMP FlashDone
FlashHide:
CLR FlashCnt1
CALL LcdCleanFm
JMP FlashDone
FlashDone:
NOP
JMP labMainNext
;---------------------------------------------------
;调试24C02代码
Debug24C02:
MOV A,@0x20
MOV R4,A
MOV A,@16
MOV N2,A
CLR I2cAddr
ReadSave:
CALL I2cRead
MOV R0,A
INC I2cAddr
INC R4
DJZ N2
JMP ReadSave
;---------------------------------------------------
labMainNext:
;读取按键
CALL ReadKey
CALL Delay5ms
;MenuMode是否改变?
JBC FmChange,BIT_MD_CHG
JMP labModeChange
;Channel是否改变?
JBC FmChange,BIT_CH_CHG
JMP labChChange
;FmMode是否改变?
JBC FmChange,BIT_FM_CHG
JMP labFmChange
JMP Main
;----------------------------------------------------
labFmChange:
CALL CheckModeDown
;显示FM的值到LCD
MOV A,FmMode
CALL ConvertFm
CALL LcdShowFm
;改变频段
MOV A,FmMode
CALL SpiFmWrite
;清FM标志
BC FmChange,BIT_FM_CHG
JMP Main
;----------------------------------------------------
labChChange:
;读取频道的频率
MOV A,FmChannel
MOV I2cAddr,A
CALL I2cRead
MOV FmMode,A
CALL CheckModeDown
MOV A,FmMode
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -