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

发布时间:2023-01-13  

;功能说明

;用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



文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    键盘具有连击功能,即按下某一键达到一定时长后,该键对应的功能将得到反复执行。利用这个连击功能,可以快速地调整时钟和输入闹钟程序。 3 软件编程主程序流程框图(见图3) 4 定时闹钟扫描子程序......
    机的串行接口进行串行通信时,定时计数器T1被固定为波特率发生器,因此,在软时钟设计中,总是选择T0作为定时器。 二、软时钟程序设计方法1—0.1 s计数法 0.1 s计数法的基本原理如下: 通过设置定时计数器0每经......
    基于STM32的0.96寸OLED时钟程序;用的是stm32自带的RTC时钟。硬件连接很简单,当然程序也是比较简单的,只写了温度(DS18B20),stm32自带RTC和OLED显示,大家......
    %。常见的电子钟程序由显示部分、计算部分、时钟调整部分构成,本产品硬件上完全支持倒计时器,客户只要自己修改程序就能实现倒计时功能。 为了实现LED显示器的数字显示,可以采用静态显示法和动态显示法。由于......
    今天站在技术知识的角度来看待“闹钟”。由于这一阶段定位的是基础的知识,所以今天提供的软件例程也是相对简单一点的,但明白今天的知识,相信自己都会写闹钟程序了,后期我会更新日历及闹钟的综合知识。 每天提供下载的“软件......
    用汇编语言写一个数码时钟程序;;功能说明 ;用STC的MCU的IO方式控制74HC595驱动8位数码管。 ;显示效果为: 数码时钟. ;使用Timer0的16位自动重装来产生1ms节拍,程序......
    基于AT89C52单片机实时时钟程序编写;#include‘reg52.h’ //包含单片机寄存器的头文件 #include‘intrins.h’ //包含_nop_()的头文件 sbit RS......
    stm32学习笔记之时钟控制RCC程序编写流程;RCC有多种用途,包括时钟设置,外设复位和时钟管理。 三种不同的时钟源可被用来驱动系统时钟(SYSCLK):● HSI振荡器时钟● HSE振荡器时钟......
    障系统出问题的时候可以重启一次。说的复杂一点,看门狗就是能让程序出问题是能重新启动系统 STM32的独立看门狗(IWDG)由内部专门的40KHz低速时钟驱动,即使主时钟发生故障,它也仍然有效。注意......
    关于AT89C51系统时钟中断的应用;功能强大的时钟中断 在单片机程序设计中,设置一个好的时钟中断,将能使一个CPU发挥两个CPU的功效,大大方便和简化程序的编制,提高系统的效率与可操作性。我们可以把一些例行的及需要定时执行的程序放在时钟......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>