单片机数字时钟
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%秒
;采用中断计时
;电路图中加了两个锁存器
;采用扫描显示方式
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%秒
;采用中断计时
;电路图中加了两个锁存器
;采用扫描显示方式
相关文章推荐
- 基于单片机的带有日历功能的数字时钟
- 单片机的数字时钟例程
- 单片机的数字时钟
- 凌阳61单片机使用7段数码管显示数字时钟的程序
- 刚刚写的单片机数字时钟(定时器),献丑了
- 时钟,定时器 玩了这么久单片机,这次终于搞懂! STM32的SYSTICK
- 微软:求最大连续递增数字串/时钟问题
- 单片机控制TFT液晶屏显示数字
- 单片机的时钟
- 100脚的STM32F103VE单片机通过FSMC接口读写DS12C887时钟芯片中的寄存器
- 51单片机--8 位数码管动态显示 12 位数字
- 数字时钟
- Qt仿Android带特效的数字时钟源码分析(滑动,翻页,旋转效果)
- 单片机系统时钟与实时时钟有什么区别?为什么有的系统时钟晶振使用12M,而实时时钟使用32.768K
- <Win32_2>Bitmap位图应用1 ------ Win32的数字时钟
- 数字电路、单片机的抗干扰设计
- 单片机时钟程序(11)timing.h
- 报告论文:单片机电子时钟报告
- 利用单片机的数码管模拟时钟的显示时间
- 简易数字时钟软件详细制作过程