用汇编语言写一个数码时钟程序

发布者:Jinyu521最新更新时间:2023-10-08 来源: zhihu关键字:汇编语言 手机看文章 扫描二维码
随时随地手机看文章

;功能说明

;用STC的MCU的IO方式控制74HC595驱动8位数码管。

;显示效果为: 数码时钟.

;使用Timer0的16位自动重装来产生1ms节拍,程序运行于这个节拍下, 用户修改MCU主时钟频率时,自动定时于1ms.

Fosc_KHZ EQU 22118 ;22118KHZ

STACK_POIRTER EQU 0D0H ;堆栈开始地址

Timer0_Reload EQU (65536 - Fosc_KHZ) ; Timer 0 中断频率, 1000次/秒

DIS_DOT EQU 020H

DIS_BLACK EQU 010H

DIS_ EQU 011H

P0M1 DATA 0x93 ;

P0M0 DATA 0x94 ;

P1M1 DATA 0x91 ;

P1M0 DATA 0x92 ;

P2M1 DATA 0x95 ;

P2M0 DATA 0x96 ;

P3M1 DATA 0xB1 ;

P3M0 DATA 0xB2 ;

P4M1 DATA 0xB3 ;

P4M0 DATA 0xB4 ;

P5M1 DATA 0xC9 ;

P5M0 DATA 0xCA ;

P6M1 DATA 0xCB ;

P6M0 DATA 0xCC ;

P7M1 DATA 0xE1 ;

P7M0 DATA 0xE2 ;

AUXR DATA 08EH

P4 DATA 0C0H

P5 DATA 0C8H

;IO口定义

P_HC595_SER BIT P4.0 ; //pin 14 SER data input

P_HC595_RCLK BIT P5.4 ; //pin 12 RCLk store (latch) clock

P_HC595_SRCLK BIT P4.3 ; //pin 11 SRCLK Shift data clock

;本地变量声明

Flag0 DATA 20H

B_1ms BIT Flag0.0 ; 1ms标志

LED8 DATA 30H ; 显示缓冲 30H ~ 37H

display_index DATA 38H ; 显示位索引

hour DATA 39H ;

minute DATA 3AH

second DATA 3BH ;

msecond_H DATA 3CH ;

msecond_L DATA 3DH ;

ORG 0000H ;reset

LJMP F_Main

ORG 000BH ;1 Timer0 interrupt

LJMP F_Timer0_Interrupt

;主程序

ORG 0100H ;reset

F_Main:

CLR A

MOV P0M1, A ;设置为准双向口

MOV P0M0, A

MOV P1M1, A ;设置为准双向口

MOV P1M0, A

MOV P2M1, A ;设置为准双向口

MOV P2M0, A

MOV P3M1, A ;设置为准双向口

MOV P3M0, A

MOV P4M1, A ;设置为准双向口

MOV P4M0, A

MOV P5M1, A ;设置为准双向口

MOV P5M0, A

MOV P6M1, A ;设置为准双向口

MOV P6M0, A

MOV P7M1, A ;设置为准双向口

MOV P7M0, A

MOV SP, #STACK_POIRTER

MOV PSW, #0

USING 0 ;选择第0组R0~R7

;用户初始化程序

MOV display_index, #0

MOV R0, #LED8

MOV R2, #8

L_ClearLoop:

MOV @R0, #DIS_BLACK ;上电消隐

INC R0

DJNZ R2, L_ClearLoop

CLR TR0

ORL AUXR, #(1 SHL 7) ; Timer0_1T();

ANL TMOD, #NOT 04H ; Timer0_AsTimer();

ANL TMOD, #NOT 03H ; Timer0_16bitAutoReload();

MOV TH0, #Timer0_Reload / 256 ;Timer0_Load(Timer0_Reload);

MOV TL0, #Timer0_Reload MOD 256

SETB ET0 ; Timer0_InterruptEnable();

SETB TR0 ; Timer0_Run();

SETB EA ; 打开总中断

MOV hour, #12 ; 初始化时间值

MOV minute, #0

MOV second, #0

LCALL F_DisplayRTC

;主循环

L_Main_Loop:

JNB B_1ms, L_Main_Loop ;1ms未到

CLR B_1ms

INC msecond_L ;msecond + 1

MOV A, msecond_L

JNZ L_Check1000ms

INC msecond_H

L_Check1000ms:

MOV A, msecond_L ;msecond - 1000

CLR C

SUBB A, #LOW 1000

MOV A, msecond_H

SUBB A, #HIGH 1000

JC L_Main_Loop ;if(msecond < 1000), jmp

MOV msecond_L, #0 ;if(msecond >= 1000)

MOV msecond_H, #0

LCALL F_RTC

LCALL F_DisplayRTC

LJMP L_Main_Loop

F_DisplayRTC:

PUSH B ;B入栈

MOV A, hour

MOV B, #10

DIV AB

MOV LED8, A

MOV LED8+1, B

MOV LED8+2, #DIS_;

MOV A, minute

MOV B, #10

DIV AB

MOV LED8+3, A;

MOV LED8+4, B;

MOV LED8+5, #DIS_;

MOV A, second

MOV B, #10

DIV AB

MOV LED8+6, A;

MOV LED8+7, B;

POP B ;B出栈

RET

F_RTC:

INC second ; second + 1

MOV A, second

CLR C

SUBB A,#60

JC L_QuitRTC ; second >= 60?

MOV second, #0;

INC minute ; minute + 1

MOV A, minute

CLR C

SUBB A,#60

JC L_QuitRTC ; minute >= 60?

MOV minute, #0

INC hour ; hour + 1

MOV A, hour

CLR C

SUBB A,#24

JC L_QuitRTC ; hour >= 24?

MOV hour, #0

L_QuitRTC:

RET

; 显示相关程序

T_Display: ;标准字库

; 0 1 2 3 4 5 6 7 8 9 A B C D E F

DB 03FH,006H,05BH,04FH,066H,06DH,07DH,007H,07FH,06FH,077H,07CH,039H,05EH,079H,071H

; black - H J K L N o P U t G Q r M y

DB 000H,040H,076H,01EH,070H,038H,037H,05CH,073H,03EH,078H,03dH,067H,050H,037H,06EH

; 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1

DB 0BFH,086H,0DBH,0CFH,0E6H,0EDH,0FDH,087H,0FFH,0EFH,046H

T_COM:

DB 001H,002H,004H,008H,010H,020H,040H,080H ; 位码

F_Send_595:

PUSH 02H ;R2入栈

MOV R2, #8

L_Send_595_Loop:

RLC A

MOV P_HC595_SER,C

SETB P_HC595_SRCLK

CLR P_HC595_SRCLK

DJNZ R2, L_Send_595_Loop

POP 02H ;R2出栈

RET

F_DisplayScan:

PUSH DPH ;DPH入栈

PUSH DPL ;DPL入栈

PUSH 00H ;R0 入栈

MOV DPTR, #T_COM

MOV A, display_index

MOVC A, @A+DPTR

CPL A

LCALL F_Send_595 ;输出位码

MOV DPTR, #T_Display

MOV A, display_index

ADD A, #LED8

MOV R0, A

MOV A, @R0

MOVC A, @A+DPTR

LCALL F_Send_595 ;输出段码

SETB P_HC595_RCLK

CLR P_HC595_RCLK ; 锁存输出数据

INC display_index

MOV A, display_index

ANL A, #0F8H ; if(display_index >= 8)

JZ L_QuitDisplayScan

MOV display_index, #0; ;8位结束回0

L_QuitDisplayScan:

POP 00H ;R0 出栈

POP DPL ;DPL出栈

POP DPH ;DPH出栈

RET

F_Timer0_Interrupt: ;Timer0 1ms中断函数

PUSH PSW ;PSW入栈

PUSH ACC ;ACC入栈

LCALL F_DisplayScan ; 1ms扫描显示一位

SETB B_1ms ; 1ms标志

POP ACC ;ACC出栈

POP PSW ;PSW出栈

RETI

END



关键字:汇编语言 引用地址:用汇编语言写一个数码时钟程序

上一篇:用C语言写一个温度测量显示程序
下一篇:用C语言写一个驱动数码管程序

推荐阅读最新更新时间:2024-11-08 10:53

基于51汇编语言的外部中断
  主程序显示八位流水灯;   外部中断0:左右四位闪烁三次;   外部中断1:各位间隔闪烁三次。   仿真电路如下:      ;程序如下:   ORG 0000H   LJMP START   ORG 0003H   LJMP X0_INT   ORG 0013H   LJMP X1_INT   ORG 0030H   START:   SETB IT0   SETB IT1   SETB EX0   SETB EX1   SETB EA   MOV SP, #50H   ;----------------------   MOV A, #0FEH   LOOP:   MOV P1, A   CALL DELAY   RL
[单片机]
基于51<font color='red'>汇编语言</font>的外部中断
ARM基础:为何C语言(的函数调用)需要堆栈,而汇编语言却不需要堆栈
之前看了很多关于uboot的分析,其中就有说要为C语言的运行,准备好堆栈。 而自己在Uboot的start.S汇编代码中,关于系统初始化,也看到有堆栈指针初始化这个动作。但是,从来只是看到有人说系统初始化要初始化堆栈,即正确给堆栈指针sp赋值,但是却从来没有看到有人解释,为何要初始化堆栈。所以,接下来的内容,就是经过一定的探究,试图来解释一下,为何要初始化堆栈,即: 为何C语言的函数调用要用到堆栈,而汇编却不需要初始化堆栈。 要明白这个问题,首先要了解堆栈的作用。 关于堆栈的作用,要详细讲解的话,要很长的篇幅,所以此处只是做简略介绍。 总的来说,堆栈的作用就是:保存现场/上下文,传递参数。 1.保存现场/上下文 现场
[单片机]
单片机汇编语言 如何实现点亮熄灭二极管
main: mov P0, #10011000B //P0口输出高电平 lcall Delay //延时 mov P0, #11111111B lcall Delay ljmp main //长转移到起始地址main标号处 Delay: mov R7, #250 D1: mov R6, #250 D2: djnz R6, D2 //R6寄存器不为0 则转移到D2标号处 djnz R7, D1 //R7寄存器不为0 则转移到D1标号处 ret end 用汇编语言写了这个程序之后,感觉就是 毫无所获的快感,因为感觉用汇编语言编写的速度太慢了,效率太低了。 于是就想: 是否 要开始学习汇编语言编写单片机程序呢
[单片机]
汇编语言教程-段寄存器的说明语句
  在汇编语言源程序中可以定义多个段,每个段都要与一个段寄存器建立一种对应关系。建立这种对应关系的说明语句格式如下:   ASSUME段寄存器名:段名   其中:段寄存器是CS、DS、ES、SS、FS和GS,段名是在段定义语句说明时的段名。   在一条ASSUME语句中可建立多组段寄存器与段之间的关系,每种对应关系要用逗号分隔。例如,   ASSUME CS:CODE1, DS:DATA1   上面的语句说明了:CS对应于代码段CODE1,DS对应于数据段DATA1。   在ASSUME语句中,还可以用关键字NOTHING来说明某个段寄存器不与任何段相对应。下面语句说明了段寄存器ES不与某段相对应。   ASSUME ES:NOT
[单片机]
STM8S汇编入门(1-3)
不知是心血来潮,还是其它因素,突然又想起玩汇编语言了。这几年也没少跟单片机打交道,包括51系列,430系列,ARM系列,但都是用C语言来开发。不过由于使用C语言,实际上对这些CPU的了解还是不够深刻,当然除了51之外,因为那是我多年前曾经用汇编开发过的芯片。尽管当今C语言已经在嵌入式产品的开发过程中成为主流,但我个人依然认为,要想真正了解CPU的特点,还得用汇编语言。不知道这种观点是对还是错,也许是因为自己从硬件做起,写过机器码,用汇编语言做过优化,因此对汇编语音有一种特殊的偏爱。 系列的芯片用多了,感觉有时写起程序来不太方便,因此总想寻找一些其它的8位单片机玩玩,正好手头有一个ST的三合一开发板,那是09年参加ST研讨会上买
[单片机]
单片机C语言编程应注意的若干问题
作为一种结构化的程序设计语言,C语言的特点就是可以使你尽量少地对硬件进行操作,具有很强的功能性、结构性和可移植性,常常被优选作为单片机系统的编程语言。但是基于单片机的C语言和标准C语言有很大区别,如何结合单片机的系统资源,用C语言开发符合实际工程需要的单片机系统,对用编程者来说具有十分重要的意义。 1 单片机C语言主要特点 用C 编写程序比汇编更符合人们的思考习惯,开发者可以摆脱与硬件无必要的接触,更专心的考虑功能和算法而不是考虑一些细节问题,这样就减少了开发和调试的时间。C语言具有良好的程序结构,适用于模块化程序设计,因此采用C语言设计单片机应用系统程序时,首先要尽可能地采用结构化的程序设计方法,将功能模块化,由不同的
[单片机]
单片机C语言编程应注意的若干问题
51单片机汇编语言程序调用指令RET RETI
控制转移 指令 用于控制程序的流向,所控制的范围即为程序存储器区间,MCS-51系列单片机的控制转移 指令 相对丰富,有可对64kB程序空间地址单元进行访问的长调用、长转移指令,也有可对2kB字节进行访问的绝对调用和绝对转移指令,还有在一页范围内短相对转移及其它无条件转移指令,这些指令的执行一般都不会对标志位有影响。 . 子程序调用指令(1条) 子程序是为了便于程序编写,减少那些需反复执行的程序占用多余的地址空间而引入的程序分支,从而有了主程序和子程序的概念,需要反复执行的一些程序,我们在编程时一般都把它们编写成子程序,当需要用它们时,就用一个调用命令使程序按调用的地址去执行,这就需要子程序的调用指令和返回指令。 LCALL
[单片机]
如何在C51文件和汇编语言文件中相互调用对方的函数?
如何在C51文件和汇编语言文件中相互调用对方文件中的函数? 答:汇编语言文件中对于函数的调用方法,与调用汇编语言中的函数一样,如: LCALL DISPLAY 在C语言文件中调用汇编语言中的函数,必须先声明再调用。声明格式如下: extern 返回值类型 函数名(参数表); 例如: extern unsigned char right_shift ( char, char );
[单片机]

推荐帖子

电子基础知识——晶体二极管
本帖最后由jameswangsynnex于2015-3-320:02编辑晶体二极管在电路中常用“D”加数字表示,如:D5表示编号为5的二极管。1、作用:二极管的主要特性是单向导电性,也就是在正向电压的作用下,导通电阻很小;而在反向电压作用下导通电阻极大或无穷大。正因为二极管具有上述特性,无绳电话机中常把它用在整流、隔离、稳压、极性保护、编码控制、调频调制和静噪等电路中。电话机里使用的晶体二极管按作用可分为:整流二极管(如1N4004)、隔离二极管
yueyue 移动便携
ShineBlink超低代码IoT芯片App远程控制继电器接入机智云
一、实现的功能描述App远程控制一路继电器的闭合和断开。二、UI配置描述本例程中所包含的UI配置代码如下: UI=复制代码例程中用了类型为3的控件,关于该类型控件的具体描述可以参看官网中关于ShineBlink云的教程。基于以上UI配置,当设备上电后,我们在小程序中可以看到系统为我们自动生成的小程序页如下:三、本实验教学目的掌握基于ShineBlink的: 基于WiFi或4G接入ShineBlink免开发
毛球大大 RF/无线
触摸屏问题,请各位帮助!
我嵌入式LINUX,用的是四线电阻触摸屏,现在有个问题是,在使用测试程序读取值时,触摸屏的左上角某个区域(有五分之一大小)的数据总是最大值(X:640,Y:480).不知道是什么原因?分可再加触摸屏问题,请各位帮助!没有回答,还是没看见?有用过恒颐高科H2410EB板子的吗????
bing 嵌入式系统
微处理器设计:从设计规划到工艺制造
本书以微处理器设计为中心,内容涵盖了从设计规划到工艺制造的全部设计流程。全书共11章,对设计中需要的所有步骤进行了一一介绍,重点讲述了微处理器的发展历程、计算机部件、设计规划、计算机架构、微处理器架构、逻辑设计、电路设计、版图、半导体制造、微处理器封装以及硅片的调试和测试。https://download.eeworld.com.cn/detail/eisbergeisberg/625366微处理器设计:从设计规划到工艺制造感谢分享
arui1999 下载中心专版
【CY8CPROTO-063-BLE】1.开箱初见
【CY8CPROTO-063-BLE】1.开箱初见很高兴能参与这次的开发板评测,被幸运选中。这次使用的是英飞凌的PSoCBLE开发板,这是一块基于PSoC63BLE模块(CYBLE-416045-02)的完整硬件工具的开发板,包括一个LED、一个按钮和若干电流测量跳线。该板采用卡扣外形结构,用户可将KitProg板载编程器和调试器模块与目标板分离开来,以便单独使用。模块保留了PSoCMCU的所有可编程性和灵活性,将可编程且可重新配置的模拟和数字模块与灵活的自动路由以及数字可编程逻
Tristan_C RF/无线
【2024 DigiKey创意大赛】- 基于毫米波雷达的生命体征检测及健康监护系统-作品提交
基于毫米波雷达的生命体征检测及健康监护系统作者:zygalaxy一、作品简介作品照片:作品功能介绍:本系统融合毫米波雷达与多传感器技术,提供心率、呼吸频率监测及睡眠质量分析,实时数据可通过LCD屏和手机APP查看;摔倒检测功能在确认后自动报警并通知相关联系人;环境监测温湿度,异常时自动提醒用户采取措施。系统设计全面监控健康与环境,提升生活安全与舒适度。物料清单及简介:1、毫米波雷达传感器(MR60BHA1和MR60ADF)用于非接触式
zygalaxy DigiKey得捷技术专区
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved