;使用LED1SCH实验板制作数码电子钟
DISP01 EQU 30H ;秒个位
DISP02 EQU 31H ;秒十位
DISP03 EQU 32H ;分个位
DISP04 EQU 33H ;分十位
DISP05 EQU 34H ;秒信号
DISP06 EQU 35H ;秒信号
DISP07 EQU 36H ;时个位
DISP08 EQU 37H ;时十位
;------------------------------------------
MIAO EQU 38H ;秒寄存器
FEN EQU 39H ;分寄存器
SE EQU 3AH ;时寄存器
;------------------------------------------
K_MEN EQU 3BH
KEU_UP EQU 3CH
KEY_DO EQU 3DH
KEYSYS EQU 3EH ;秒钟
KEYST EQU 3FH
;------------------------------------------
MIAO_A EQU 40H ;秒个位
MIAO_B EQU 41H ;秒十位
FEN_A EQU 42H ;分个位
FEN_B EQU 43H ;分十位
SE_A EQU 44H ;时个位
SE_B EQU 45H ;时十位
DISP7 EQU 45H ;
DISP8 EQU 47H ;
;------------------------------------------
D_FEN EQU 48H ;分定时寄存器
D_SE EQU 49H ;时定时寄存器
D_MIAO EQU 4AH ;分定寄存器
D_MIAO_A EQU 4BH ;时间寄存器
D_MIAO_B EQU 5CH
;------------------------------------------
S_DATA EQU 4CH ;日历寄存器
NIAN EQU 4DH ;年寄存器
YE EQU 4EH ;月寄存器
RE EQU 4FH ;日寄存器
;-------------------------------------------
NIAN_A EQU 50H ;年个位
NIAN_B EQU 51H ;年十位
NIAN_C EQU 52H ;年百位
NIAN_D EQU 53H ;年千位
YE_A EQU 54H ;月个位
YE_B EQU 55H ;月十位
RE_A EQU 56H ;日个位
RE_B EQU 57H ;日十位
;-------------------------------------------
D_FEN_A EQU 58H ;定时分个位
D_FEN_B EQU 59H ;定时分十位
D_SE_A EQU 5AH ;定时时个位
D_SE_B EQU 5BH ;定时时十位
;-------------------------------------------
BITCNT EQU 5CH ;送数8位
SUBADR EQU 5EH ;取存储地址
SDA BIT P3.7
SCL BIT P3.6
;-------------------------------------------
ORG 0000H
LJMP MAIN
ORG 000BH ;定时器0的中断向量地址
LJMP TIME0 ;跳转到真正的定时器程序处
ORG 0030H
MAIN:
MOV R0,#7FH
MCR:
MOV @R0,#00H
DJNZ R0,MCR
CLR K_MEN
CLR P3.3
JNB P1.0,SS
CLR P1.0
LCALL DISP1
SS:
MOV 60H,#00 ;软件计数器预清0
MOV TMOD,#00000001B ;定时/计数器0工作于方式1
MOV TH0,#3CH
MOV TL0,#0B0H
SETB EA ;开总中断允许
SETB ET0 ;开定时/计数器0允许
SETB TR0 ;定时/计数器0开始运行
;------------------------------------------
;**********************************************
;键码测试,在P1口LED上显示
;*************************************
KEY:
MOV A,#00H
MOV B,#00H
MOV P0,#0FH ;P0=0000 1111 用反转法查键
MOV A,P0 ;A =0000 1111
ANL A,#0FH ;A =0000 1111
MOV B,A ;B =0000 1111
MOV P0,#0F0H ;P0=1111 0000
MOV A,P0 ;A =1111 0000
ANL A,#0F0H ;A =1111 0000
ORL A,B ;A =1111 1111
CJNE A,#0FFH,SE_KEY
LCALL READ_24C02
LJMP KEY
;*************************************************
;时间调节
;*************************************************
SE_KEY:
CJNE A,#77H,K2 ;小时加
INC SE
MOV A,SE
CJNE A,#24,KS1
MOV SE,#0
KS1:
LCALL DELAY
LCALL DISP
LJMP KS
K2:
CJNE A,#0B7H,K3 ;小时减
DEC SE
MOV A,SE
CJNE A,#0,KS2
MOV SE,#24
KS2:
LCALL DELAY
LCALL DISP
LJMP KS
K3:
CJNE A,#7BH,K4 ;分钟加
INC FEN
MOV A,FEN
CJNE A,#60,KS3
MOV FEN,#0
KS3:
LCALL DELAY
LCALL DISP
LJMP KS
K4:
CJNE A,#0BBH,KS5 ;分钟减
DEC FEN
MOV A,FEN
CJNE A,#0,KS4
MOV FEN,#60
KS4:
LCALL DELAY
LCALL DISP
KS5:
CJNE A,#0E7H,KS
CLR K_MEN
LCALL DELAY
LCALL DELAY
LCALL DISP
KS:
LJMP KEY
;**********************************************
TIME0: ;定时器0的中断处理程序
; PUSH ACC
; PUSH PSW ;将PSW和ACC推入堆栈保护
INC 60H
INC 61H
MOV A,60H
CJNE A,#20,T_NEXT ;30H单元中的值到了20了吗?
T_L1:
CLR KEYSYS
LCALL DIS_TIME ;到了,取反P10
MOV 60H,#0 ;清软件计数器
T_NEXT:
MOV A,61H
CJNE A,#10,T_RET
SETB KEYSYS
MOV 61H,#0
LCALL DISP
T_RET:
MOV TH0,#3CH
MOV TL0,#0B0H ;重置定时常数
; POP PSW
; POP ACC
RETI
;********************************************
DIS_TIME:
INC MIAO
MOV A,MIAO
CJNE A,#60,TIME_RET
MOV MIAO,#00
INC FEN
CPL P1.7
LCALL ADDR24
CPL P1.7
MOV A,FEN
CJNE A,#60,TIME_RET
MOV FEN,#00
INC SE
MOV A,SE
CJNE A,#24,TIME_RET
MOV SE,#00
TIME_RET:
LCALL DISP
MOV A,SE
CJNE A,#0,LRET
MOV A,FEN
CJNE A,#01,LRET
MOV A,MIAO
CJNE A,#0,LRET
PUSH SE
PUSH FEN
PUSH MIAO
LCALL MUSIC
CLR P3.3
POP MIAO
POP FEN
POP SE
LRET:
RET
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
DISP1:
CLR P1.0
MOV MIAO,#00
MOV FEN,#00
MOV SE,#00
DISP:
MOV A,MIAO ;秒----------
MOV B,#10
DIV AB
MOV MIAO_B,A ;秒十位
MOV MIAO_A,B ;秒个位
MOV A,MIAO_A ;秒个位
MOV R0,#DISP01
LCALL DISNUMB
MOV A,MIAO_B ;秒十位
MOV R0,#DISP02
LCALL DISNUMA
;-------------------------------------------
MOV A,FEN ;秒----------
MOV B,#10
DIV AB
MOV FEN_B,A ;秒十位
MOV FEN_A,B ;秒个位
MOV A,FEN_A ;秒个位
MOV R0,#DISP03
LCALL DISNUMB
MOV A,FEN_B ;秒十位
MOV R0,#DISP04
LCALL DISNUMA
;-------------------------------------------
A1:
JNB KEYSYS,A2
MOV R0,#DISP05 ;-
MOV @R0,#11111111B
MOV R0,#DISP06 ;-
MOV @R0,#11111111B
LJMP A3
;-------------------------------------------
A2:
MOV R0,#DISP05 ;-
MOV @R0,#11111110B
MOV R0,#DISP06 ;-
MOV @R0,#11110111B
;-------------------------------------------
A3:
MOV A,SE ;时----------
MOV B,#10
DIV AB
MOV SE_B,A ;时十位
MOV SE_A,B ;时个位
MOV A,SE_A ;时个位
MOV R0,#DISP07
LCALL DISNUMB
MOV A,SE_B ;时十位
MOV R0,#DISP08
LCALL DISNUMA
;**********************************************
;发送子程序
;**********************************************
LOOP_DISP:
MOV R2,#8 ;2个8字显示
MOV R0,#DISP01 ;缓冲区首址入R0
MOV SCON,#00H ;UART方式0设定
SOUT: MOV A,@R0 ;发送数据入A中
CLR TI ;发送结束标志清零
MOV SBUF,A ;启动发送
WAIO: JNB TI,WAIO ;发送等等
INC R0 ;指向下一个发送数据地址
DJNZ R2,SOUT ;N个字节发送完未完转SOUT
DISRET:
RET
;============================
ADDR24:
MOV A,MIAO
MOV R7,A
LCALL WRITE_24C02
INC SUBADR
MOV A,FEN
MOV R7,A
LCALL WRITE_24C02
INC SUBADR
MOV A,SE
MOV R7,A
LCALL WRITE_24C02
INC SUBADR
RET
;============================
WRITE_24C02:
ACALL START ;发送IC总线起始条件
MOV A,#0A0H ;24C02总线地址
ACALL ONETBYTE ;发送24C02器件总线地址
JB F0,SEND ;出错返回
MOV A,SUBADR ;取存储地址
ACALL ONETBYTE
JB F0,SEND
MOV A,R7
ACALL ONETBYTE ;发送一次数据
JB F0,SEND ;出错返回
ACALL STOP ;发送IC总线停止条件
DELAY10: ;延时10MS等待数据写完
MOV 44H,30H
D1:
MOV 45H,#34H
DJNZ 45H,$
DJNZ 44H,D1
SEND:
RET
;=======================================
READ_24C02: ;读24C02
ACALL START ;发送IC总线起始条件
MOV A,#0A0H
ACALL ONETBYTE ;24C02总线地址
JB F0,RCVRETURN ;出错返回
MOV A,SUBADR ;取存储地址
ACALL ONETBYTE ;发送24C02器件总线地址
JB F0,SEND ;出错返回
ACALL START ;发送IC总线重复起始条件
MOV A,#0A1H ;24C02总线地址
SETB ACC.0 ;取总线读操作数
ACALL ONETBYTE ;发送被控制总线地址
JB F0,RCVRETURN ;出错返回
ACALL RCVBYTE ;接受数据
RCVRETURN:
RET
;=========================================
START:
SETB SDA ;发送起始条件的数据信号
NOP
NOP
NOP
SETB SCL ;发送起始条件的时钟信号
NOP ;起始条件建立时间大于4.7s
NOP
NOP
CLR SDA ;发送起始信号
NOP ;起始条件锁定时间大于4s
NOP
NOP
CLR SCL ;钳住IC总线准备发送或接受数据
RET
;==================================
STOP:
CLR SDA ;发送停止条件的数据信号
NOP
NOP
NOP
SETB SCL ;发送停止条件的时钟信号
NOP ;起始条件建立时间大于4s
NOP
NOP
SETB SDA ;发送IC总线停止信号
NOP
NOP
NOP
NOP
RET
;===============================
ONETBYTE: ;送数8位;发送24C02器件总线地址
MOV BITCNT,#08H
SENTB:
RLC A ;要发送的数据左移,发送入位C
MOV SDA,C
NOP
NOP
NOP
SETB SCL ;置时钟线为高,通知被控制开始接受数据位
NOP ;保证时钟高周期大于4s
NOP
NOP
CLR SCL ;钳住总线准备接受下一个数据位
DJNZ BITCNT,SENTB ;8位没发送完继续发送
NOP
NOP
SETB SDA ;8位发送完后释放数据线准备收应答位
NOP
NOP
SETB SCL ;开始接受应答信号
NOP
NOP
CLR F0 ;预先清发送数据出错标志
JNB SDA,ACKEND ;判断是否接受应答信号正常转ACKEND
SETB F0 ;未受到应答置位错误标志
ACKEND: ;应答信号正常
NOP
CLR SCL ;发送结束钳住总线准备下一步发送或接受数据或进行其他处理
RET
;=================================
RCVBYTE:
SETB SDA ;置数据线为输入方式
MOV BITCNT,#08H ;要传送的数据长度为8位
RCV:
NOP
CLR SCL ;置时钟线为低,准备接受数据
NOP ;时钟低周期大于4.7s
NOP
NOP
NOP
NOP
SETB SCL ;置时钟线为高使数据线上数据有效
NOP
NOP
MOV C,SDA
RLC A ;接受的数据位放入ACC
NOP
NOP
DJNZ BITCNT,RCV ;8位没收完继续接受
CLR SCL ;8位接受完置时钟线和数据线
NOP
NOP
CLR SDA
SETB SDA ;接受非应答信号
NOP
NOP
SETB SCL ;置时钟线为高使应答位有效
NOP ;时钟高周期大于4.7s
NOP
SETB SDA
NOP
NOP
NOP
CLR SCL ;清时钟线钳住IC总线以便发送停止条件
RET
;===================================
DISNUMA:
DIS0A: ;前0
CJNE A,#0,DIS1A
MOV @R0,#10001000B
RET
DIS1A: ;前1
CJNE A,#1,DIS2A
MOV @R0,#11101110B
RET
DIS2A: ;前2
CJNE A,#2,DIS3A
MOV @R0,#10010010B
RET
DIS3A: ;前3
CJNE A,#3,DIS4A
MOV @R0,#10100010B
RET
DIS4A: ;前4
CJNE A,#4,DIS5A
MOV @R0,#11100100B
RET
DIS5A: ;前5
CJNE A,#5,DIS6A
MOV @R0,#10100001B
RET
DIS6A: ;前6
CJNE A,#6,DIS7A
MOV @R0,#10000001B
RET
DIS7A: ;前7
CJNE A,#7,DIS8A
MOV @R0,#11101010B
RET
DIS8A: ;前8
CJNE A,#8,DIS9A
MOV @R0,#10000000B
RET
DIS9A: ;前9
CJNE A,#9,DISA
MOV @R0,#10100000B
RET
DISA: ;前a
CJNE A,#0AH,DISB
MOV @R0,#11000000B
RET
DISB: ;前b
CJNE A,#0BH,DISC
MOV @R0,#10000101B
RET
DISC: ;前c
CJNE A,#0CH,DISD
MOV @R0,#10010111B
RET
DISD: ;前d
CJNE A,#0DH,DISE
MOV @R0,#10000110B
RET
DISE: ;前e
CJNE A,#0EH,DISF
MOV @R0,#10010001
RET
DISF: ;前f
CJNE A,#0FH,DISARET
MOV @R0,#11010001
RET
DISARET:
RET
;**********************************************
DISNUMB:
DIS0B: ;后0
CJNE A,#0,DIS1B
MOV @R0,#00010001B
RET
DIS1B: ;后1
CJNE A,#1,DIS2B
MOV @R0,#01110111B
RET
DIS2B: ;后2
CJNE A,#2,DIS3B
MOV @R0,#10010100B
RET
DIS3B: ;后3
CJNE A,#3,DIS4B
MOV @R0,#01010100B
RET
DIS4B: ;后4
CJNE A,#4,DIS5B
MOV @R0,#01110010B
RET
DIS5B: ;后5
CJNE A,#5,DIS6B
MOV @R0,#01011000B
RET
DIS6B: ;后6
CJNE A,#6,DIS7B
MOV @R0,#00011000B
RET
DIS7B: ;后7
CJNE A,#7,DIS8B
MOV @R0,#01110101B
RET
DIS8B: ;后8
CJNE A,#8,DIS9B
MOV @R0,#00010000B
RET
DIS9B: ;后9
CJNE A,#9,DISBA
MOV @R0,#01010000B
RET
DISBA: ;后a
CJNE A,#0AH,DISBB
MOV @R0,#00110000B
RET
DISBB: ;后b
CJNE A,#0BH,DISBC
MOV @R0,#00011010B
RET
DISBC: ;后C
CJNE A,#0CH,DISBD
MOV @R0,#10011001B
RET
DISBD: ;后d
CJNE A,#0DH,DISBE
MOV @R0,#00010110B
RET
DISBE: ;后e
CJNE A,#0EH,DISBF
MOV @R0,#10011000B
RET
DISBF: ;后f
CJNE A,#0FH,DISBRET
MOV @R0,#10111000B
RET
DISBRET:
RET
;**********************************************
MUSIC:
MOV R7,10
MUS:
CPL P3.3
LCALL DELAY
LCALL DELAY
CPL P3.3
DJNZ R7,MUS
RET
;*****************************************************
DELAY:
MOV R4,#0FFH
DELB:
MOV R5,#0FFH
DJNZ R5,$
DJNZ R4,DELB
RET
END
用户115412 2007-11-16 11:08
用户1293116 2007-11-12 22:09
用户1293116 2007-11-12 22:08
用户115412 2007-11-12 11:29
用户39379 2007-11-9 23:19
能否发来电路图看看啊
mxp082016@21cn.com