📄 lpc932_ring.asm
字号:
/***********************************************************
*文件名:LPC932_Ring.ASM
*开发: www.zlgmcu.com
*功能: 自动响铃系统控制程序
*日期: 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写缓冲区
PCF8563_ReadBuff EQU 0x40 ;定义8563读缓冲区
EEprom_DataBuff EQU 0x50 ;定义EEPROM数据缓冲区
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发动缓冲区
MRD DATA 2CH ;IIC接收缓冲区
SLA DATA 2DH ;器件从地址
SUBA DATA 2EH ;子地址
NUMBYTE DATA 2FH ;读/写字节数
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 ;下降沿触发
SETB EX1 ;开启外部中断1
ACALL Uart_Init ;调用串口初始化程序
ACALL WatchDog_Init ;调用开门狗初始化程序
ACALL ReadChart ;调用ReadChart,将内部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作为波特率发生器,8位UART模式
MOV SSTAT,#0x60 ;设置停止位结束产生中断,设置独立的Rx/Tx中断
MOV BRGR0,#0xF0 ;设置内部晶振时的波特率 9600
MOV BRGR1,#0x02
MOV BRGCON,#0x03 ;使能波特率发生器
SETB ES ;使能串行中断
RET
;------------------------------------------------------------
;功能:PCF8563初始化
;------------------------------------------------------------
PCF8563_Init:
MOV R7,#0x10 ;从缓冲区中读入PCF8563的配置值到PCF8563_WriteBuff缓冲区
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 ;发送缓冲区
MOV NUMBYTE,#0x10 ;写0x10字节
LCALL IWRNBYTE ;将PCF8563_WriteBuff的值写入到PCF8563中
RET
;------------------------------------------------------------
WatchDog_Init:
MOV A,WDCON ;从WDCON读取值
ORL A,#0xE4 ;选择看门狗分频
MOV WDL,#0xFF ;装入8位倒计数器的新值
CLR EA ;关中断
MOV WDCON,A
MOV WFEED1,#0xA5 ;清0 序列1
MOV WFEED2,#0x5A ;清0序列2
SETB EA ;开中断
RET
;------------------------------------------------------------
;功能:从内部EEPROM读一字节
;参数:R6 地址 ,A读出数据
;------------------------------------------------------------
ReadEEprom:
MOV DEECON,#0x00 ;控制字
MOV DEEADR,R6 ;发送读地址,并开始读
LOOP_ReadEEprom:
MOV A,DEECON
ANL A,#0x80
JZ LOOP_ReadEEprom ;等待读完成
MOV A,DEEDAT ;将读出的数据存入A
RET
;-----------------------------------------------------------
;R6 地址, A 写入数据
;-----------------------------------------------------------
WriteEEprom:
;CLR EA
MOV DEECON,#0x00 ;控制字
MOV DEEDAT,A ;将要写入的值
MOV DEEADR,R6 ;发送写的地址,并开始写
;SETB EA
LOOP_WriteEEprom:
MOV A,DEECON
ANL A,#0x80
JZ LOOP_WriteEEprom ;等待写完成
RET
;------------------------------------------------------------
;功能:将内部EEprom的值读到EEprom_DataBuff中去
;------------------------------------------------------------
ReadChart:
MOV R7,#0x2C ;读字节数
MOV R6,#0x00 ;地址首值
LOOP_ReadChart:
ACALL ReadEEprom ;读一字节
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 ;置读缓冲区
MOV NUMBYTE,#0x10 ;读字节数
LCALL IRDNBYTE ;调用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 ;循环到EEprom_DataBuff的0x2C为止
SETB INT1 ;拉高INT1
CLR IE1 ;清0 IE1(当运行INT1_ISR,该位可由硬件自动清0)
SETB EA ;开中断
RETI
;------------------------------------------------------------
;功能:串口中断服务程序
;------------------------------------------------------------
UART_ISR:
CLR EA ;关中断
MOV R7,#0x2C ;接收上位机发送过来的8563初始化配置字及时刻表值
UART_LOOP1:
MOV A,#RI
JZ UART_LOOP1 ;等待RI为1
CLR RI ;RI清0
MOV A,SBUF
MOV R0,#EEprom_DataBuff ;将收到的数据存入EEprom_DataBuff
MOV @R0,A
INC R0
DJNZ R7,UART_LOOP1
MOV R7,#0x2C ;将EEprom_DataBuff中的数写入EEprom保存
MOV R6,#0x00 ;EEprom起始地址
UART_LOOP2:
MOV R1,#EEprom_DataBuff ;从EEprom_DataBuff读一字节数据
MOV A,@R1
ACALl WriteEEprom ;写一字节
INC R1 ;寻址EEprom_DataBuff下一字节
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 + -