📄 tyjianpan5.asm
字号:
dat equ p1.5
clk2 equ p1.4
set2 equ p1.3
led1 equ p1.2
led2 equ p1.1
led3 equ p1.0
;使用前定义常量
SDA EQU P1.6 ;24c02 I2C总线定义
SCL EQU P1.7
MTD EQU 58H ;发送数据缓冲区1首址 (缓冲区50H)
MRD EQU 50H ;接收数据缓冲区1首址 (缓冲区57H)
;注意:iic与uart 的接收区是一样的
;******************24c02******************************
ACK BIT 10H ;应答标志位变量
SLA DATA 60H ;器件从地址变量
SUBA DATA 61H ;器件子地址变量
NUMBYTE DATA 62H ;读/写的字节数变量
;定义器件地址
CSI24WCXX EQU 0A0H
ORG 0000H
lJMP MAIN
org 23h ;串行中断入口地址
jmp com_int ;串行中断服务程序
;org 30h
MAIN: nop
nop
clr led1
clr led2
clr led3
MOV R4, #0F0H ;/////延时,等待其它芯片复位好
DJNZ R4, $
mov 20h, #00h ;00h-串口接受结素标志/01h-查看内容标志
;/02h-数据头标志/03h-确认标志/04h-设置运行标志
;/05h-数据正确标志1 /06h-数据正确标志2 /07h- 数据正确标志3
mov 21h, #00h ;发送查询计数器
mov 22h, #00h ;10h-应答标志位变量/11h-
mov 23h, #00h ;状态指示寄存 全灭
mov 24h, #00h ;分
mov 25h, #12h ;时
mov 26h, #18h ;日
mov 27h, #07h ;月
mov 28h, #02h ;星期
mov 29h, #06h ;年
mov 2ah, #00h ;灯1开分
mov 2bh, #07h ;灯1开时
mov 2ch, #00h ;灯1关分
mov 2dh, #08h ;灯1关时
mov 2eh, #00h ;机1开分
mov 2fh, #09h ;机1开时
mov 30h, #00h ;机1关分
mov 31h, #10h ;机1关时
mov 32h, #00h ;灯2开分
mov 33h, #11h ;灯2开时
mov 34h, #00h ;灯2关分
mov 35h, #12h ;灯2关时
mov 36h, #00h ;机2开分
mov 37h, #13h ;机2开时
mov 38h, #00h ;机2关分
mov 39h, #14h ;机2关时
mov 3ah, #10h ;展示时间分
mov 3bh, #00h ;展示时间时
mov 3ch, #00h ;单画超时时间
mov 3dh, #00h ;严重超时时间
mov 3eh, #46h ;串口数据接收指针->#46h
mov 3fh, #00h ;串口数据临时存储
mov 40h, #00h ;功能计数器
mov 41h, #00h ;键值存储
mov 42h, #0aah ;显示缓冲1
mov 43h, #0aah ;显示缓冲2
mov 44h, #0aah ;显示缓冲3
mov 45h, #0aah ;显示缓冲4
mov 46h, #00h ;1接收缓冲区开始
mov 47h, #00h ;2
mov 48h, #00h ;3
mov 49h, #00h ;4
mov 4ah, #00h ;5
mov 4bh, #00h ;6
mov 4ch, #00h ;7
mov 4dh, #00h ;8
mov 4eh, #00h ;9
mov 4fh, #00h ;10
;58H ;发送数据缓冲区1首址 (缓冲区50H) 8
;50H ;接收数据缓冲区1首址 (缓冲区57H) 8
mov sp, #63h ;设置堆栈
;
nop
mov r0, #46h ;串口数据接收指针
lcall comm ;串口初始化
setb led1
setb led2
setb led3 ;LED全灭
;lcall bcsj ;保存数据
lcall sjhf ;数据恢复
main1: nop
mov a,40h
cjne a,#00h, zhenchng
inc 21h
mov a,21h
cjne a,#0ffh,zhenchng
mov 21h,#00h
lcall com_send4 ;发送查询时间命令
zhenchng:nop
lcall jianpan ;键盘程序
lcall jianzhi ;键值处理程序
lcall shujujk ;数据监控
lcall com_cl ;串口数据处理
LCALL sjzb ;数据准备
LCALL show ;显示程序
ljmp main1
;*******************************
;******************************************************************
;数据监控
shujujk:nop
mov a,24h
cjne a,#60h,sjjk1
mov 24h,#00h
sjjk1: mov a,25h
cjne a,#24h,sjjk2
mov 25h,#00h
;***
sjjk2: mov a,2ah
cjne a,#60h,sjjk3
mov 25h,#00h
sjjk3: mov a,2bh
cjne a,#24h,sjjk4
mov 2bh,#00h
;***
sjjk4: mov a,2ch
cjne a,#60h,sjjk5
mov 2ch,#00h
sjjk5: mov a,2dh
cjne a,#24h,sjjk6
mov 2dh,#00h
;***
sjjk6: mov a,2eh
cjne a,#60h,sjjk7
mov 2eh,#00h
sjjk7: mov a,2fh
cjne a,#24h,sjjk8
mov 2fh,#00h
;***
sjjk8: mov a,30h
cjne a,#60h,sjjk9
mov 30h,#00h
sjjk9: mov a,31h
cjne a,#24h,sjjka
mov 31h,#00h
;***
sjjka: mov a,32h
cjne a,#60h,sjjkb
mov 32h,#00h
sjjkb: mov a,33h
cjne a,#24h,sjjkc
mov 33h,#00h
;***
sjjkc: mov a,34h
cjne a,#60h,sjjkd
mov 34h,#00h
sjjkd: mov a,35h
cjne a,#24h,sjjke
mov 35h,#00h
;***
sjjke: mov a,36h
cjne a,#60h,sjjkf
mov 36h,#00h
sjjkf: mov a,37h
cjne a,#24h,sjjk10
mov 37h,#00h
;***
sjjk10: mov a,38h
cjne a,#60h,sjjk11
mov 38h,#00h
sjjk11: mov a,39h
cjne a,#24h,sjjk12
mov 39h,#00h
;***
sjjk12: mov a,3ah
cjne a,#60h,sjjk13
mov 3ah,#00h
sjjk13: mov a,3bh
cjne a,#60h,sjjk14
mov 3bh,#00h
;***
sjjk14: nop
ret
;******************************************************************
;保存数据程序
bcsj: nop
;clr es
mov a, 24h
mov mtd, a
mov a, 25h
mov mtd+1, a
mov a, 26h
mov mtd+2, a
mov a, 27h
mov mtd+3, a
mov a, 2ah
mov mtd+4, a
mov a, 2bh
mov mtd+5, a
mov a, 2ch
mov mtd+6, a
mov a, 2dh
mov mtd+7, a
MOV SLA, #CSI24WCXX
MOV SUBA, #00H
MOV NUMBYTE, #08
;注意,10ms后EEPROM写周期才结束
LCALL IWRNBYTE
lcall DELEY20MS
lcall DELEY20MS
;LCALL IRDNBYTE
nop
mov a, 2eh
mov mtd, a
mov a, 2fh
mov mtd+1, a
mov a, 30h
mov mtd+2, a
mov a, 31h
mov mtd+3, a
mov a, 32h
mov mtd+4, a
mov a, 33h
mov mtd+5, a
mov a, 34h
mov mtd+6, a
mov a, 35h
mov mtd+7, a
MOV SLA, #CSI24WCXX
MOV SUBA, #08H
MOV NUMBYTE, #08
;注意,10ms后EEPROM写周期才结束
LCALL IWRNBYTE
lcall DELEY20MS
lcall DELEY20MS
;LCALL IRDNBYTE
nop
mov a, 36h
mov mtd, a
mov a, 37h
mov mtd+1, a
mov a, 38h
mov mtd+2, a
mov a, 39h
mov mtd+3, a
mov a, 3ah
mov mtd+4, a
mov a, 3bh
mov mtd+5, a
mov a, 3ch ;单画超时时间
mov mtd+6, a
mov a, 3dh ;严重超时时间
mov mtd+7, a
MOV SLA, #CSI24WCXX
MOV SUBA, #10H
MOV NUMBYTE, #08
;注意,10ms后EEPROM写周期才结束
LCALL IWRNBYTE
lcall DELEY20MS
lcall DELEY20MS
;LCALL IRDNBYTE
;setb es
ret
;******************************************************************
;数据恢复程序
sjhf: nop
;clr es
nop
MOV SLA, #CSI24WCXX
MOV SUBA, #00H
MOV NUMBYTE, #08
LCALL IRDNBYTE
mov a, 50h
mov 24h, a
mov a, 51h
mov 25h, a
mov a, 52h
mov 26h, a
mov a, 53h
mov 27h, a
mov a, 54h
mov 2ah, a
mov a, 55h
mov 2bh, a
mov a, 56h
mov 2ch, a
mov a, 57h
mov 2dh, a
;
MOV SLA, #CSI24WCXX
MOV SUBA, #08H
MOV NUMBYTE, #08
LCALL IRDNBYTE
;zhuanyi
mov a, 50h
mov 2eh, a
mov a, 51h
mov 2fh, a
mov a, 52h
mov 30h, a
mov a, 53h
mov 31h, a
mov a, 54h
mov 32h, a
mov a, 55h
mov 33h, a
mov a, 56h
mov 34h, a
mov a, 57h
mov 35h, a
;
MOV SLA, #CSI24WCXX
MOV SUBA, #10H
MOV NUMBYTE, #08
LCALL IRDNBYTE
mov a, 50h
mov 36h, a
mov a, 51h
mov 37h, a
mov a, 52h
mov 38h, a
mov a, 53h
mov 39h, a
mov a, 54h
mov 3ah, a
mov a, 55h
mov 3bh, a
mov a, 56h
mov 3ch, a ;单画超时时间
mov a, 57h
mov 3dh, a ;严重超时时间
;setb es
ret
/*
;页写EEPROM
;写入字节数据不要大于EEPROM的页字节数,否则会造成写入地址的'翻卷'
W24WCXXP: nop
;在这之前要把数据准备好
MOV SLA, #CSI24WCXX
MOV SUBA, #00H
MOV NUMBYTE, #8
LCALL IWRNBYTE ;写入一页数据
NOP ;注意,10ms后比EEPROM写周期才结束
;在此设置断点,观察ACK位,ACK为1时操作正确
lcall DELEY20MS
lcall DELEY20MS
ret
;读 EEPROM
R24WCXXP: nop
MOV SLA, #CSI24WCXX
MOV SUBA, #08H
MOV NUMBYTE, #8
LCALL IRDNBYTE
lcall DELEY20MS
NOP ;在此设置断点,观察MRD区及ACK位,ACK为1时操作正确
RET ;操作结束
*/
; ************** 串口初始化 *****************
;设置串行口工作方式1,定时器1作为波特率发生器
;波特率设置为 2400 ;
comm: mov tmod, #20h ;设置定时器T1工作方式2
mov tl1, #0fdh ;定时器计数初值,波特率 9600
mov th1, #0fdh ;定时器重装值
setb ea ;允许总的中断
setb es ;允许串行中断
mov pcon, #00h ;波特率不倍增
mov scon, #50h ;设置串口工作方式1,REN = 1 允许接收
setb tr1 ;定时器开始工作
ret ;返回
;*************** 串口中断服务程序 ***********
;串口接收的数据放在46h-4fh
com_int: PUSH ACC
PUSH PSW
setb rs0
clr es ;禁止串行中断
clr ri ;清除接收标志位
mov a, sbuf ;从缓冲区取出数据
mov 3fh, a ;临时存储
mov r0, 3eh ;调指针
mov @r0, a
inc 3eh
mov a, 3eh
cjne a, #4fh, zc1
mov 3eh, #46h ;数据超长,清指针
setb 00h ;接收完毕标志
zc1: setb es ;允许串行中断
POP PSW
POP ACC
reti
;****************串口数据处理****************
;*****************串口接收数据缓冲在3ch---44h
com_cl: nop
jnb 00h, exitcl
clr 00h
mov a,46h
mov 25h,a ;时
mov a,47h
mov 24h,a ;分
mov a,48h
mov 3bh,a ;展示时
mov a,49h
mov 3ah,a ;展示分
;
mov a,4eh ;数据包号
cjne a,#04h,fail
clr led2
sjmp exitcl
fail: setb led2
exitcl: nop
ret ;串口数据处理返回
;****************串口数据发送************
;****************************************
;发送时间,画面展示时间,超时时间
;例:120800100613000001
com_send1: nop
clr es
mov sbuf, 25h ;1---时
jnb ti, $ ;等待发送完毕
clr ti
mov sbuf, 24h ;2---分
jnb ti, $ ;等待发送完毕
clr ti
mov sbuf, 3bh ;3---展示时
jnb ti, $ ;等待发送完毕
clr ti
mov sbuf, 3ah ;4---展示分
jnb ti, $ ;等待发送完毕
clr ti
mov sbuf, 3ch ;5---单画超时
jnb ti, $ ;等待发送完毕
clr ti
mov sbuf, 3dh ;6---严重超时
jnb ti, $ ;等待发送完毕
clr ti
mov sbuf, #55h ;7---空
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -