?? 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 + -