📄 2051 3208.asm
字号:
;<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
;<!-- saved from url=(0047)http://ctwxdc.512j.com/attachment.php?aid=19934 -->
;<HTML><HEAD>
;<META http-equiv=Content-Type content="text/html; charset=gb2312">
;<META content="MSHTML 6.00.2900.3059" name=GENERATOR></HEAD>
;<BODY><PRE>;***************************************************************************
;* 32X8点阵显示的时钟 *
;* AT89C2051/DS1302/74HC595/74LS138 *
;* Builde By:Feigoo 2006.06.11 *
;***************************************************************************
;
;*********************************修改日志**********************************
;*2006.06.12 完成主要程序的编写:读写1302和中断扫描显示
;*2006.06.16 向系统加入时间调整程序
;*2006.06.18 加入闪烁显示程序,在调整时间时相应位闪烁显示。
;*2006.06.18 基本完成
;**********************************伪定义***********************************
SCLK_1302 EQU P3.2
IO_1302 EQU P3.3
RST_1302 EQU P3.4
G_138 EQU P1.2
RCK_595 EQU p1.3
KEY_SETTIME EQU P3.5
KEY_INC_ONE EQU P3.7
DS1302_ADDR DATA 21H
DS1302_DATA DATA 22H
HOUR_1302 DATA 23H
MINUTE_1302 DATA 24H
SECOND_1302 DATA 25H
HOUR_FLASH DATA 28H
MINUTE_FLASH DATA 29H
INTT1_CONTER DATA 27H
HOUR_SHIWEI DATA 18H
HOUR_GEWEI DATA 19H
MINUTE_SHIWEI DATA 1AH
MINUTE_GEWEI DATA 1BH
SECOND_SHIWEI DATA 1CH
SECOND_GEWEI DATA 1DH
;定义30H-4FH为显示更新缓存,50H-6FH为显示缓存
;内存单元26H被T0中断(扫描显示)占用,不可再使用
;内存单元20H的00H、01H被用作标志位
;*********************************程序入口**********************************
ORG 0000H
LJMP START
ORG 0003H
RETI
ORG 000BH
LJMP INTT0
ORG 0013H
RETI
ORG 001BH
LJMP INTT1
ORG 0023H
RETI
ORG 002BH
RETI
;*********************************程序开始**********************************
START: MOV DS1302_ADDR,#8EH
MOV DS1302_DATA,#80H ;禁止写1302 ,#00H,允许
LCALL WRITE_1302
MOV SP,#70H
MOV A,#00H
MOV R0,#30H
MOV R1,#64
CLEARNMEMORY: MOV @R0,A
INC R0
DJNZ R1,CLEARNMEMORY
MOV SCON,#00H
MOV TMOD,#11H
MOV TH0,#0F8H
MOV TL0,#30H
MOV DS1302_ADDR,#8EH
MOV DS1302_DATA,#00H ;允许写1302 ,#80,禁止
LCALL WRITE_1302
MOV DS1302_ADDR,#90H
MOV DS1302_DATA,#0A7H ;1302充电充电电流1.1MA;#A5:2.2MA,#A7:0.6MA
LCALL WRITE_1302
MOV DS1302_ADDR,#80H
MOV DS1302_DATA,#00H ;1302晶振开始振荡;#80H,禁止
LCALL WRITE_1302
SETB PT0
SETB ET0
SETB ET1
SETB EA
SETB TR0
;**********************************主程序***********************************
MAIN: MOV DS1302_ADDR,#85H ;读出小时
LCALL READ_1302
MOV HOUR_1302,DS1302_DATA
MOV DS1302_ADDR,#83H ;读出分钟
LCALL READ_1302
MOV MINUTE_1302,DS1302_DATA
MOV DS1302_ADDR,#81H ;读出秒
LCALL READ_1302
MOV SECOND_1302,DS1302_DATA
LCALL DISPLAY_RAM_WORK
JNB KEY_SETTIME,KEY_QUDOU
LJMP MAIN
KEY_QUDOU: LCALL DELAY3MS
LCALL DELAY3MS
JNB KEY_SETTIME,SETTIME_START1
LJMP MAIN
SETTIME_START1:LCALL DELAY3MS
JNB KEY_SETTIME,SETTIME_START1
AJMP SETTIME_START
;*******************************时间设置程序********************************
;*用于调整1302时间
;*用了按键消抖和等待释放,每按一下只能加一
;***************************************************************************
SETTIME_START: MOV INTT1_CONTER,#04H
SETB TR1
CLR 01H
MOV DS1302_ADDR,#8EH
MOV DS1302_DATA,#00H ;允许写1302
LCALL WRITE_1302
MOV DS1302_ADDR,#80H
MOV DS1302_DATA,#80H ;1302停止振荡
LCALL WRITE_1302
MOV HOUR_FLASH,HOUR_1302
MOV MINUTE_FLASH,MINUTE_1302
SETTIME: JNB KEY_INC_ONE,INC_HOUR_QUDOU
JNB KEY_SETTIME,SET_MINUTE1
AJMP SETTIME
INC_HOUR_QUDOU: LCALL DELAY3MS
LCALL DELAY3MS
JNB KEY_INC_ONE,INC_HOUR11
AJMP SETTIME
INC_HOUR11: JNB KEY_INC_ONE,INC_HOUR11
INC_HOUR: MOV R7,HOUR_FLASH
LCALL SETTIME_ADD_1
CLR C
MOV R7,A
SUBB A,#24H ; 这里要用24H而不是24,因为前面已经用了DAA
JC INC_HOUR_RIGHT
MOV R7,#00H
INC_HOUR_RIGHT: MOV HOUR_1302,R7
MOV HOUR_FLASH,R7
MOV DS1302_ADDR,#84H ;小时值送人1302
MOV DS1302_DATA,HOUR_1302
LCALL WRITE_1302
LCALL DISPLAY_RAM_WORK
AJMP SETTIME
SET_MINUTE1: LCALL DELAY3MS
LCALL DELAY3MS
JNB KEY_SETTIME,SET_MINUTE2
AJMP SETTIME
SET_MINUTE2: LCALL DELAY3MS
JNB KEY_SETTIME,SET_MINUTE2
SET_MINUTE: SETB 01H
JNB KEY_INC_ONE,INC_MINUTE_QUDOU
JNB KEY_SETTIME,SET_RETURN
AJMP SET_MINUTE
INC_MINUTE_QUDOU: LCALL DELAY3MS
LCALL DELAY3MS
JNB KEY_INC_ONE,INC_MINUTE11
AJMP SET_MINUTE
INC_MINUTE11: JNB KEY_INC_ONE,INC_MINUTE11
INC_MINUTE: MOV R7,MINUTE_FLASH
LCALL SETTIME_ADD_1
MOV R7,A
CLR C
SUBB A,#60H ;这里要用60H而不是60,因为前面已经用了DAA
JC INC_MINUTE_RIGHT
MOV R7,#00H
INC_MINUTE_RIGHT: MOV MINUTE_1302,R7
MOV MINUTE_FLASH,R7
MOV DS1302_ADDR,#82H ;分钟值送人1302
MOV DS1302_DATA,MINUTE_1302
LCALL WRITE_1302
LCALL DISPLAY_RAM_WORK
AJMP SET_MINUTE
SET_RETURN: LCALL DELAY3MS
LCALL DELAY3MS
JNB KEY_SETTIME,SET_OK_RETURN
AJMP SET_MINUTE
SET_OK_RETURN: LCALL DELAY3MS
JNB KEY_SETTIME,SET_OK_RETURN
CLR TR1
MOV DS1302_ADDR,#80H
MOV DS1302_DATA,#00H ;1302晶振开始振荡
LCALL WRITE_1302
MOV DS1302_ADDR,#8EH
MOV DS1302_DATA,#80H ;禁止写入1302
LCALL WRITE_1302
LJMP MAIN
;*****************************显示缓存更新程序******************************
;*将DS1302读出数据分离,并且查表更新显示缓存。
;*由于实际字模为4*7点阵,某些缓存要显示1.5-2个字模数据,利用此程序来处理。
;*显示缓存地址30H-4FH,计32个数据
;*使用了寄存器R0-R6
;***************************************************************************
;以下将DS1302读出数据进行个位和十位分离,分别存放不同地址
DISPLAY_RAM_WORK: MOV R1,SECOND_1302 ;秒钟分离
LCALL DIVIDE_1302
MOV SECOND_SHIWEI,R2
MOV SECOND_GEWEI,R3
MOV R1,MINUTE_1302 ;分钟分离
LCALL DIVIDE_1302
MOV MINUTE_SHIWEI,R2
MOV MINUTE_GEWEI,R3
MOV R1,HOUR_1302 ;小时分离
LCALL DIVIDE_1302
MOV HOUR_SHIWEI,R2
MOV HOUR_GEWEI,R3
;以下将DS1302读出数据查表存入显示更新缓存
;以下对小时十位处理
MOV A,HOUR_SHIWEI
MOV B,#08H
MUL AB
MOV R2,A
MOV R1,#30H ;显示更新缓存首地址
MOV R3,#00H
MOV R4,#08H
HOURSHI_GORAM: MOV A,R2
ADD A,R3
MOV DPTR,#TABLE1
MOVC A,@A+DPTR
SWAP A
MOV @R1,A
INC R1
INC R3
DJNZ R4,HOURSHI_GORAM
;以下对交叉数据缓存处理
MOV A,#0FFH ;将交叉数据缓存全部置FF,以备下次使用
MOV R0,#10H
MOV R1,#08H
CLEARNSHUJUJIAOC1: MOV @R0,A
INC R0
DJNZ R1,CLEARNSHUJUJIAOC1
;以下对小时个位处理
MOV A,HOUR_GEWEI
MOV B,#08H
MUL AB
MOV R2,A
MOV R3,#00H
MOV R1,#30H ;显示更新缓存首地址
MOV R0,#10H ;一些交叉数据的缓存首地址,从10H-17H
MOV R4,#08H
HOURGE_GORAM: MOV A,R2
ADD A,R3
MOV DPTR,#TABLE1
MOVC A,@A+DPTR
RRC A ;将查表得到数据右移一位,
MOV R6,A
MOV A,@R0
RRC A ;移出位存入交叉数据缓存
MOV @R0,A
MOV A,R6
ANL A,#0FH ;屏蔽高四位
MOV R6,A
MOV A,@R1 ;取出30H地址原来的数据,即小时的十位
ANL A,#0F0H ;屏蔽低四位
ORL A,R6 ;将两个数据组合
MOV @R1,A ;送回显示更新缓存
INC R0
INC R1
INC R3
DJNZ R4,HOURGE_GORAM
;以下对小时和分钟之间的冒号处理
MOV R3,#00H
MOV R1,#38H ;显示更新缓存地址
MOV R0,#10H ;一些交叉数据的缓存首地址,从10H-17H
MOV R4,#08H
MAOHAO_GORAM:MOV DPTR,#TABLE2
MOV A,R3
MOVC A,@A+DPTR
MOV R6,A
MOV A,@R0
ANL A,R6
MOV @R1,A
INC R0
INC R1
INC R3
DJNZ R4,MAOHAO_GORAM
;以下对交叉数据缓存处理
MOV A,#0FFH ;将交叉数据缓存全部置FF,以备下次使用
MOV R0,#10H
MOV R1,#08H
CLEARNSHUJUJIAOC: MOV @R0,A
INC R0
DJNZ R1,CLEARNSHUJUJIAOC
;以下对分钟十位处理
MOV A,MINUTE_SHIWEI
MOV B,#08H
MUL AB
MOV R2,A
MOV R3,#00H
MOV R0,#10H
MOV R1,#38H
MOV R4,#08H
MINUTESHI_GORAM: MOV A,R2
ADD A,R3
MOV DPTR,#TABLE1
MOVC A,@A+DPTR
RRC A
MOV R6,A
MOV A,@R0
RRC A
MOV @R0,A
MOV A,R6
RRC A
MOV R6,A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -