?? lpc932_ring.asm
字號:
/***********************************************************
*文件名:LPC932_Ring.ASM
*開發(fā): www.zlgmcu.com
*功能: 自動響鈴系統(tǒng)控制程序
*日期: 13:01 04-2-28
***********************************************************/
$NOMOD51
$INCLUDE(REG932.INC)
#define MINUTE PCF8563_ReadBuff+3 ;定義MINUTE宏
#define HOUR PCF8563_ReadBuff+4 ;定義HOUR宏
PCF8563_WriteBuff EQU 0x30 ;定義8563寫緩沖區(qū)
PCF8563_ReadBuff EQU 0x40 ;定義8563讀緩沖區(qū)
EEprom_DataBuff EQU 0x50 ;定義EEPROM數(shù)據(jù)緩沖區(qū)
PCF8563 EQU 0xA2 ;定義8563地址
KEY BIT P1.7 ;定義啟動鍵
RUN BIT P2.7 ;定義運行端口
SDA BIT P1.3 ;
SCL BIT P1.2
ACK BIT 10H
MTD DATA 2BH ;IIC發(fā)動緩沖區(qū)
MRD DATA 2CH ;IIC接收緩沖區(qū)
SLA DATA 2DH ;器件從地址
SUBA DATA 2EH ;子地址
NUMBYTE DATA 2FH ;讀/寫字節(jié)數(shù)
ORG 0000H
AJMP MAIN
ORG 0013H
AJMP INT1_ISR ;INT1中斷服務程序
ORG 0023H
AJMP UART_ISR ;串口中斷接收程序
ORG 0080H
MAIN:
MOV P1M1,#0x00 ;初始化端口
MOV P1M2,#0x00
MOV P2M1,#0xC0
MOV P2M2,#0xC0
SETB SDA ;拉高SDA/SCL
SETB SCL
SETB IT1 ;下降沿觸發(fā)
SETB EX1 ;開啟外部中斷1
ACALL Uart_Init ;調(diào)用串口初始化程序
ACALL WatchDog_Init ;調(diào)用開門狗初始化程序
ACALL ReadChart ;調(diào)用ReadChart,將內(nèi)部EEprom的值讀入到RAM
LOOP1:
JB KEY,SKIP1 ;等待啟動鍵按下
ACALL PCF8563_Init ;8563初始化
SKIP1:
ACALL Delay ;延時
ACALL Clear_WatchDog ;喂狗
SJMP LOOP1
RET
;------------------------------------------------------------
;功能:串口初始化
;------------------------------------------------------------
Uart_Init:
MOV SCON,#0x50 ;選擇BRG作為波特率發(fā)生器,8位UART模式
MOV SSTAT,#0x60 ;設置停止位結(jié)束產(chǎn)生中斷,設置獨立的Rx/Tx中斷
MOV BRGR0,#0xF0 ;設置內(nèi)部晶振時的波特率 9600
MOV BRGR1,#0x02
MOV BRGCON,#0x03 ;使能波特率發(fā)生器
SETB ES ;使能串行中斷
RET
;------------------------------------------------------------
;功能:PCF8563初始化
;------------------------------------------------------------
PCF8563_Init:
MOV R7,#0x10 ;從緩沖區(qū)中讀入PCF8563的配置值到PCF8563_WriteBuff緩沖區(qū)
LOOP_PCF8563INIT:
MOV R0,#EEprom_DataBuff
MOV R1,#PCF8563_WriteBuff
MOV A,@R0
MOV @R1,A
INC R0
INC R1
DJNZ R7,LOOP_PCF8563INIT
MOV SLA,#PCF8563 ;器件從地址
MOV SUBA,#0x00 ;子地址
MOV MTD,#PCF8563_WriteBuff ;發(fā)送緩沖區(qū)
MOV NUMBYTE,#0x10 ;寫0x10字節(jié)
LCALL IWRNBYTE ;將PCF8563_WriteBuff的值寫入到PCF8563中
RET
;------------------------------------------------------------
WatchDog_Init:
MOV A,WDCON ;從WDCON讀取值
ORL A,#0xE4 ;選擇看門狗分頻
MOV WDL,#0xFF ;裝入8位倒計數(shù)器的新值
CLR EA ;關中斷
MOV WDCON,A
MOV WFEED1,#0xA5 ;清0 序列1
MOV WFEED2,#0x5A ;清0序列2
SETB EA ;開中斷
RET
;------------------------------------------------------------
;功能:從內(nèi)部EEPROM讀一字節(jié)
;參數(shù):R6 地址 ,A讀出數(shù)據(jù)
;------------------------------------------------------------
ReadEEprom:
MOV DEECON,#0x00 ;控制字
MOV DEEADR,R6 ;發(fā)送讀地址,并開始讀
LOOP_ReadEEprom:
MOV A,DEECON
ANL A,#0x80
JZ LOOP_ReadEEprom ;等待讀完成
MOV A,DEEDAT ;將讀出的數(shù)據(jù)存入A
RET
;-----------------------------------------------------------
;R6 地址, A 寫入數(shù)據(jù)
;-----------------------------------------------------------
WriteEEprom:
;CLR EA
MOV DEECON,#0x00 ;控制字
MOV DEEDAT,A ;將要寫入的值
MOV DEEADR,R6 ;發(fā)送寫的地址,并開始寫
;SETB EA
LOOP_WriteEEprom:
MOV A,DEECON
ANL A,#0x80
JZ LOOP_WriteEEprom ;等待寫完成
RET
;------------------------------------------------------------
;功能:將內(nèi)部EEprom的值讀到EEprom_DataBuff中去
;------------------------------------------------------------
ReadChart:
MOV R7,#0x2C ;讀字節(jié)數(shù)
MOV R6,#0x00 ;地址首值
LOOP_ReadChart:
ACALL ReadEEprom ;讀一字節(jié)
MOV R0,#EEprom_DataBuff ;存入EEprom_DataBuff
MOV @R0,A
INC R0
INC R6 ;地址遞增
DJNZ R7,LOOP_ReadChart
RET
;------------------------------------------------------------
;功能:喂狗
;------------------------------------------------------------
Clear_WatchDog:
CLR EA ;關中斷
MOV WFEED1,#0xA5 ;清0序列1
MOV WFEED2,#0x5A ;清0序列2
SETB EA ;開中斷
RET
;------------------------------------------------------------
;功能:延時
;------------------------------------------------------------
Delay:
MOV R4,#0x40
LOOP_Delay1:
MOV R3,#0xFE
LOOP_Delay2:
MOV R2,#0xFE
LOOP_Delay3:
DJNZ R2,LOOP_Delay3
DJNZ R3,LOOP_Delay2
DJNZ R4,LOOP_Delay1
RET
;------------------------------------------------------------
;功能:外部中斷1服務程序
;------------------------------------------------------------
INT1_ISR:
CLR EA ;關中斷
MOV SLA,#PCF8563 ;器件從地址
MOV SUBA,#0x00 ;子地址
MOV MRD,#PCF8563_ReadBuff ;置讀緩沖區(qū)
MOV NUMBYTE,#0x10 ;讀字節(jié)數(shù)
LCALL IRDNBYTE ;調(diào)用IIC讀子程序
MOV R7,#0x10 ;
LOOP_INT1:
MOV R0,#EEprom_DataBuff+0x10 ;將時刻表的起始位置賦給R0
MOV A,@R0 ;將8563的分鐘值讀出與時刻表的相應值比較
MOV R1,#MINUTE
XRL A,@R1
JNZ STOP
MOV A,@R0 ;將8563的小時值讀出與時刻表的相應值比較
MOV R1,#HOUR
XRL A,@R1
JNZ STOP
INC R7
INC R7
START:
SETB RUN
STOP:
CLR RUN
CJNE R7,#0x2C,LOOP_INT1 ;循環(huán)到EEprom_DataBuff的0x2C為止
SETB INT1 ;拉高INT1
CLR IE1 ;清0 IE1(當運行INT1_ISR,該位可由硬件自動清0)
SETB EA ;開中斷
RETI
;------------------------------------------------------------
;功能:串口中斷服務程序
;------------------------------------------------------------
UART_ISR:
CLR EA ;關中斷
MOV R7,#0x2C ;接收上位機發(fā)送過來的8563初始化配置字及時刻表值
UART_LOOP1:
MOV A,#RI
JZ UART_LOOP1 ;等待RI為1
CLR RI ;RI清0
MOV A,SBUF
MOV R0,#EEprom_DataBuff ;將收到的數(shù)據(jù)存入EEprom_DataBuff
MOV @R0,A
INC R0
DJNZ R7,UART_LOOP1
MOV R7,#0x2C ;將EEprom_DataBuff中的數(shù)寫入EEprom保存
MOV R6,#0x00 ;EEprom起始地址
UART_LOOP2:
MOV R1,#EEprom_DataBuff ;從EEprom_DataBuff讀一字節(jié)數(shù)據(jù)
MOV A,@R1
ACALl WriteEEprom ;寫一字節(jié)
INC R1 ;尋址EEprom_DataBuff下一字節(jié)
INC R6 ;EEprom地址遞增
DJNZ R7,UART_LOOP2 ;
SETB EA ;開中斷
RETI
;---------------------------------------------------------------
$INCLUDE(HI2C_Asm.INC)
;---------------------------------------------------------------
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -