您的位置:首页 > 其它

单片机数字时钟

2009-03-10 13:18 274 查看
ORG 00H
JMP INIT

ORG 000BH ;//////////定时器中断入口
;///////////////外部中断1入口///////////////////////////////////////
;///////////键盘中断函数结束
;------------------------------------------<定时器益处处理函数>-----------------
MOV TH0,#0D8H;定时器初始值;55536 + 10000 = 0FFH ;益处时间为1/100秒
MOV TL0,#0F0H
SETB TR0;开始记时
INC 08H
DJNZ 0CH,FOR_SHOW_TIME;毫秒益处向秒钟进位
MOV 08H,#00H
MOV 0CH,#64H
INC 09H
DJNZ 0DH,FOR_SHOW_TIME;秒钟益处,向分钟进位
MOV 09H,#00H
MOV 0DH,#3CH
INC 0AH
DJNZ 0EH,FOR_SHOW_TIME;分钟益处,向小时进位
MOV 0AH,#00H
MOV 0EH,#3CH
INC 0BH
DJNZ 0FH,FOR_SHOW_TIME;小时益处,新的一天开始了
MOV 0BH,#00H
MOV 0FH,#18H
FOR_SHOW_TIME:;将一个16进制转化成为两个10进制显示
;/////////////////////////从08H 开始
MOV A,08H
MOV B,#0AH
DIV AB
MOV 11H,A
MOV 10H,B

MOV A,09H
MOV B,#0AH
DIV AB
MOV 13H,A
MOV 12H,B

MOV A,0AH
MOV B,#0AH
DIV AB
MOV 15H,A
MOV 14H,B

MOV A,0BH
MOV B,#0AH
DIV AB
MOV 17H,A
MOV 16H,B
RETI

;/////////////////////////////////////////////////////////////////////////
INIT:;初始化
SETB EA;设置CPU允许中断
SETB ET0;设置定时器0中断允许
MOV TMOD,#01H;设置T1工作方式 ---> 1 有软件启动 --->SETB TR1 即可
MOV TH0,#0D8H;定时器初始值;55536 + 10000 = 0FFH ;益处时间为1/100秒
MOV TL0,#0F0H
SETB TR0;开始记时

MOV SP,#2FH;堆栈初始化
;//////////////以下内存分配
;/////////////时间进位控制数据
MOV 08H,#00H;豪秒记数
MOV 09H,#00H;秒钟记数
MOV 0AH,#00H;分钟记数
MOV 0BH,#00H;小时记数
MOV 0CH,#64H;毫秒进位---->100
MOV 0DH,#3CH;秒钟进位---->60
MOV 0EH,#3CH;分钟进位---->60
MOV 0FH,#18H;小时进位---->24
;////////;显示数据储存区
MOV 10H,#00H
MOV 11H,#00H
MOV 12H,#00H
MOV 13H,#00H
MOV 14H,#00H
MOV 15H,#00H
MOV 16H,#00H
MOV 17H,#00H
;///////////////////////////////////////////
MOV R0,10H ;当前显示数据 10H->17H
MOV R1,#10000000B ;指定显示控制
MOV R2,#08H ;扫描数量控制 =》 8
MOV R3,#00H ;本次按键的数据 行列分别存放在高低4位中==================
MOV R4,#00H ;按键的编码 0----------->F 有R3转化得到
MOV R5,#00H

;////////////////////////////////////////////////////////////////////////////////////////////////////

BEGIN:
JMP SHOW;---------->CALL ^^
JMP BEGIN

;/////////////////////////////////////////////////////////////////////////////////////////////////////
;说明:函数每调用一次,就完成共8位数据的显示;
;显示内容从 10H^^^^^^^17H;
;显示从8255 的 B C 口输出

SHOW:;显示函数;嵌入大延时程序中
MOV A,@R0; ? MOV A,@R3不可以
MOV DPTR,#SHOWTAB ;查表取字型
MOVC A,@A+DPTR
MOV P1,A
MOV P3,R1

MOV A,R1;;显示位移动
RR A
MOV R1,A
INC R0

CALL DELAY
DJNZ R2,SHOW ;限制显示循环 ---------->8次
MOV R1,#10000000b ;指定显示控制
MOV R2,#08H ;扫描数量控制 =》 8
MOV R0,#10H ;当前显示数据 10H->17H
JMP BEGIN;------------>RET
;/////////////////////////////////////////////////////
SHOWTAB:DB 0C0H,0F9H ;;共阳LED显示表
DB 0A4H,0B0H
DB 99H,92H
DB 82H,0F8H
DB 80H,90H
DB 88H,83H
DB 0C6H,0A1H
DB 86H,8EH
;////////////////////////////////////////////////////////////////////////////

DELAY:MOV R6,#022H ;延时
DL1:MOV R7,#06H
NOP
NOP
NOP
NOP
DL2:
DJNZ R7,DL2
DJNZ R6,DL1
RET

;代码在WAVE2.9 和PROTUALS6.0下仿真通过

;可以精确到1%秒

;采用中断计时

;电路图中加了两个锁存器

;采用扫描显示方式
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: