📄 sky1.asm
字号:
;**************************************************************
; LIGHTNING WATCH PROCESSING ROUTINE ON 89C2051 ;
;**************************************************************
;
;**************************************************************
; 器件地址定义
;**************************************************************
AT24C08 EQU 0A8H ;0A8H,0AAH,0ABH,0ACH
;各256个字节。
PCF8563 EQU 0A2H
;**************************************************************
; 内部数据定义
;**************************************************************
; #30H DATA 30H ;串口接收缓冲区
; #38H DATA 38H ;串口发送缓冲区
DELAYC DATA 3EH ;延时计数器
TIMCNT DATA 3FH ;
MIN_MD DATA 40H ;分钟数据缓冲区
HOU_MD DATA 41H ;小时数据缓冲区
DAY_MD DATA 42H ;日数据缓冲区
MON_MD DATA 43H ;月数据缓冲区
YEA_MD DATA 44H ;年数据缓冲区
AD_VA1 DATA 45H
AD_VA2 DATA 46H
AD_VA3 DATA 47H
AD_CNT DATA 48H ;AD移位计数器
AD_VAL DATA 49H ;AD采样数据缓冲区
TMPVAL DATA 4AH
AT2408 DATA 4BH ;0A8H,0AAH,0ACH,0AEH
FNDREG DATA 4CH ;查寻状态标志
COM_LG DATA 4DH ;有效命令长度
MODREG DATA 4EH ;编辑状态标志
TMPCNT DATA 4FH ;处理过程计数器
LED_D0 DATA 50H ;LED0数据缓冲区
LED_D1 DATA 51H ;LED1数据缓冲区
LED_D2 DATA 52H ;LED2数据缓冲区
LED_D3 DATA 53H ;LED3数据缓冲区
LED_D4 DATA 54H ;LED4数据缓冲区
LED_D5 DATA 55H ;LED5数据缓冲区
LED_D6 DATA 56H ;LED6数据缓冲区
FUNREG DATA 57H ;功能标志
CU_REC DATA 58H ;当前记录数
REC_NU DATA 59H ;最大记录数
BITCNT DATA 5AH ;I2C数据位计数器
BYTCNT DATA 5BH ;I2C数据字节计数器
SLVADR DATA 5CH ;被控器件地址
SUBADR DATA 5DH ;被控器单元地址
MAX_VL DATA 5EH ;上限值
MIN_VL DATA 5FH ;下限值
RCVDAT DATA 60H ;接收数据缓冲区
XMTDAT DATA 70H ;发送数据缓冲区
;**************************************************************
; CPU端口定义
;**************************************************************
I2C_CLK BIT P1.0 ;I2C总线时钟信号位
I2C_DIO BIT P1.1 ;I2C总线数据信号位
LED_CS BIT P1.6 ;7219片选信号位
LED_DATA BIT P1.7 ;7219数据信号位
LED_CLK BIT P3.7 ;7219时钟信号位
AD_CLK BIT P3.5 ;T549时钟信号位
AD_DATA BIT P3.3 ;T549数据信号位
AD_CS BIT P3.4 ;T549片选信号位
SEC_INT BIT P3.2 ;秒中断信号位
ACK BIT 20H
;**************************************************************
ORG 0000H
SJMP BEGIN ;主程序
ORG 0003H
LJMP CLOCK ;秒时钟中断服务
ORG 0023H
LJMP INT_RS232 ;串口中断服务
;**************************************************************
; 初始化时钟、串口中断及各变量值
;**************************************************************
BEGIN:
MOV SP, #10H ;定义堆栈
ACALL READ_REC ;读取记录总数
MOV A, #01H
MOV YEA_MD, A
MOV MON_MD, A
MOV DAY_MD, A
MOV A, #00H
MOV FUNREG, A ;初始化变量单元
MOV AD_VAL, A
MOV LED_D6, A
MOV MODREG, A
MOV FNDREG, A
MOV COM_LG, #08
MOV MIN_MD, A
MOV HOU_MD, A
; MOV TIMCNT, A
MOV AD_CNT, A ;AD变换初始化
MOV DELAYC, A
SETB AD_CS
CLR AD_CLK
MOV IE, #93H ;设置中断允许寄存器
MOV IP, #10H ;设置中断优先寄存器
SETB IT0 ;外部中断为沿触发方式
MOV TMOD, #20H ;定时器0,1设置为工作方式2
MOV TH1, #0FDH ;设置波特率9600
MOV TL1, #0FDH ;
SETB TR1 ;启动T1
MOV SCON, #050H ;设置串口工作方式3
MOV PCON, #00H ;波特率为Fosc/32
MOV R1, #68H ;设置接收缓冲区
ACALL INIT_LED ;初始化7219
ACALL SETSINT ;设置8563秒中断输出
ACALL SET_TIME ;设置8563时间
MOV A, REC_NU
ACALL DISP_REC
SJMP MAIN ;转主程序
;**************************************************************
; 主程序模块
;**************************************************************
MAIN:
MOV P1, #0FFH ;禁止输出
MOV P3, #0FFH
MOV A, P1
ANL A, #3CH
CJNE A, #3CH, K0
; MOV B, A
; MOV A, TIMCNT
; CJNE A, #00H, K0
MOV A, DELAYC
CJNE A, #00H, MAIN ;采样延时是否结束?
ACALL RUN_ADS
SJMP MAIN
K0:
; MOV A, B
CJNE A, #34H, K1
ACALL KEY_MOD
MOV R4, #5FH
ACALL DELAY
SJMP END_M
K1:
CJNE A, #38H, K2
MOV MODREG, #00H
ACALL KEY_FUN
MOV R4, #5FH
ACALL DELAY
SJMP END_M
K2:
CJNE A, #1CH, K3
ACALL KEY_UP
MOV R4, #5FH
ACALL DELAY
SJMP END_M
K3:
CJNE A, #2CH, END_M
ACALL KEY_DOWN
MOV R4, #5FH
ACALL DELAY
END_M:
SJMP MAIN
;**************************************************************
; 初始化MAX7219
;**************************************************************
INIT_LED:
MOV A, #01H ;正常显示
MOV R7, #0CH ;设置显示模式
ACALL SET_LED
MOV A, #06H ;7位LED
MOV R7, #0BH ;设置显示范围
ACALL SET_LED
MOV A, #02H ;7/32*I
MOV R7, #0AH ;设置显示亮度
ACALL SET_LED
ACALL CLR_SCR ;清除显示屏幕
PR1:
MOV LED_D6, #40H ;设置时间工作状态
MOV A, LED_D6
MOV R7, #07H
ACALL SET_LED
;**************************************************************
; 字节高低位交换
; 输入:A:欲交换的字节
; 输出:A:交换后的字节
; R2,R3,R4
;**************************************************************
INVERSE:
MOV R2, #00H
MOV R4, #00H
MOV R3, A
PA0:
CJNE R2, #08H, PA1
MOV A, R4
RET
PA1:
CJNE R2, #00H, PA2
MOV A, R3
ANL A, #01H
ORL A, R4
MOV R4, A
MOV A, R3
RR A
MOV R3, A
INC R2
SJMP PA0
PA2:
MOV A, R4
RL A
MOV R4, A
MOV A, R3
ANL A, #01H
ORL A, R4
MOV R4, A
MOV A, R3
RR A
MOV R3, A
INC R2
SJMP PA0
;**************************************************************
; 送数到LED显示 寄存器A:显示控制 寄存器B:显示内容
;**************************************************************
SEND_LED:
CLR LED_CLK
CLR LED_CS
MOV R2, #00H
MOV R3, A
PA3:
CJNE R2, #08H, PA7
MOV A, B
MOV R3, A
SJMP PA4
PA7:
CJNE R2, #10H, PA4
SETB LED_CS
RET
PA4:
ANL A, #01H
CJNE A, #01H, PA5
SETB LED_DATA
SJMP PA6
PA5:
CLR LED_DATA
PA6:
SETB LED_CLK
NOP
CLR LED_CLK
MOV A, R3
RR A
MOV R3, A
INC R2
SJMP PA3
;**************************************************************
; 清除屏幕显示:6位LED全清
;**************************************************************
CLR_SCR:
MOV R6, #01H
PQ1:
CJNE R6, #7, PQ0
RET
PQ0:
MOV A, R6
ACALL CLR_LED
INC R6
SJMP PQ1
;**************************************************************
; 清除LED显示 寄存器A:要清除的LED位数
;**************************************************************
CLR_LED:
MOV B, #00H
ACALL INVERSE
ACALL SEND_LED
RET
;**************************************************************
; 查LED显示表
;**************************************************************
READ_TAB: ;
MOV DPTR, #LED_TAB
MOVC A, @A+DPTR
RET
;**************************************************************
; 查AD对应表
;**************************************************************
R_AD_TAB: ;
MOV A, AD_VAL
MOV B, #0AH
DIV AB
DEC A
MOV DPTR, #AD_TAB
MOVC A, @A+DPTR
RET
;**************************************************************
; 延时
;
; 输入 -- R4: 延时数量级
;**************************************************************
DELAY:
MOV R2, #0FFH
PE0:
MOV R3, #01H
PE1:
; MOV R4, #0FFH
PE2:
DJNZ R4, PE2
DJNZ R2, PE1
DJNZ R3, PE0
RET
;**************************************************************
; HEX码转换为BCD码
;
; 输入 --- A: 被转换的HEX数
; 返回 --- R3:转换后低位BCD数
; R4:转换后高位BCD数
;**************************************************************
HEX_BCD:
MOV B, #100
DIV AB
MOV R3, A
MOV A, #10
XCH A, B
DIV AB
MOV R4, A
MOV R3, B
SWAP A
ORL A, B
RET
;**************************************************************
; BCD码转换为HEX码
;
; 输入 --- A: 被转换的BCD数
; 返回 --- A: 转换后HEX
;**************************************************************
BCD_HEX:
MOV B, #10H
DIV AB
MOV R4, B
MOV B, #10
MUL AB
ADD A, R4
RET
;**************************************************************
; 显示日期
;**************************************************************
DISP_DATE:
MOV A, DAY_MD ;取日期个位数赋给LED0
ANL A, #0FH
MOV LED_D0, A ;显示日期个位数
MOV R7, #01H
ACALL WRITE_LED
MOV A, DAY_MD ;取日期十位数赋给LED1
SWAP A
ANL A, #0FH
MOV LED_D1, A ;显示日期十位数
MOV R7, #02H
ACALL WRITE_LED
MOV A, MON_MD ;取月份个位数赋给LED2
ANL A, #0FH
MOV LED_D2,A ;显示月份个位数
MOV R7, #03H
ACALL WRITE_LED
MOV A, MON_MD ;取月份十位数赋给LED3
SWAP A
ANL A, #0FH
MOV LED_D3, A ;显示月份十位数
MOV R7, #04H
ACALL WRITE_LED
MOV A, YEA_MD ;取年份个位数赋给LED2
ANL A, #0FH
MOV LED_D4, A ;显示年份个位数
MOV R7, #05H
ACALL WRITE_LED
MOV A, YEA_MD ;取年份十位数赋给LED3
SWAP A
ANL A, #0FH
MOV LED_D5, A ;显示年份十位数
MOV R7, #06H
ACALL WRITE_LED
RET
;**************************************************************
; 显示LED数值
;
; 输入 -- A:显示的内容 R7:显示的位数
;**************************************************************
WRITE_LED:
ACALL READ_TAB
ACALL INVERSE
MOV B, A
MOV A, R7
ACALL INVERSE
ACALL SEND_LED
RET
;**************************************************************
; 设置LED数值
;
; 输入 -- A:显示的内容 R7:显示的位数
;**************************************************************
SET_LED:
ACALL INVERSE
MOV B, A
MOV A, R7
ACALL INVERSE
ACALL SEND_LED
RET
;**************************************************************
; 显示时间
;**************************************************************
DISP_TIME:
MOV A, MIN_MD ;取分钟个位数赋给LED0
ANL A, #0FH
MOV LED_D0, A ;显示分钟个位数
MOV R7, #01H
ACALL WRITE_LED
MOV A, MIN_MD ;取分钟十位数赋给LED1
SWAP A
ANL A, #0FH
MOV LED_D1, A ;显示分钟十位数
MOV R7, #02H
ACALL WRITE_LED
MOV A, HOU_MD ;取小时个位数赋给LED2
ANL A, #0FH
MOV LED_D2, A ;显示小时个位数
MOV R7, #03H
ACALL WRITE_LED
MOV A, HOU_MD ;取小时十位数赋给LED3
SWAP A
ANL A, #0FH
MOV LED_D3, A ;显示小时十位数
MOV R7, #04H
ACALL WRITE_LED
RET
;**************************************************************
; 显示秒点
;**************************************************************
DISP_SPT:
MOV A, LED_D0
ACALL READ_TAB
ORL A, #80H
MOV R7, #01H
ACALL SET_LED
MOV A, LED_D1
ACALL READ_TAB
ORL A, #80H
MOV R7, #02H
ACALL SET_LED
RET
;**************************************************************
; 清除秒点
;**************************************************************
CLR_SPT:
MOV A, LED_D0
ACALL READ_TAB
ANL A, #07FH
MOV R7, #01H
ACALL SET_LED
MOV A, LED_D1
ACALL READ_TAB
ANL A, #07FH
MOV R7, #02H
ACALL SET_LED
RET
;**************************************************************
; 读取当前时间及日期数据
;**************************************************************
READ_TIME:
MOV SLVADR, #PCF8563
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -