历史上的今天
返回首页

历史上的今天

今天是:2026年01月13日(星期二)

正在发生

2023年01月13日 | 用汇编语言写一个数码时钟程序

2023-01-13 来源: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



推荐阅读

史海拾趣

德崧电子(D-SWITCH)公司的发展小趣事

在激烈的市场竞争中,德崧电子始终坚持品质为先的经营理念。公司从原材料采购到生产加工,再到成品检验,每一个环节都严格把控,确保产品质量。这种对品质的坚守不仅赢得了客户的信任,也为公司赢得了良好的口碑。正是凭借着过硬的产品质量和优质的服务,德崧电子在电子开关行业中树立了良好的品牌形象。

AXTAL公司的发展小趣事

创新是AXTAL公司不断发展的动力源泉。公司注重研发投入,持续推出具有竞争力的新产品和技术。同时,AXTAL还积极与高校、科研机构等合作,共同开展前沿技术的研发和应用。这些创新举措不仅提升了公司的技术实力和市场竞争力,也为整个电子行业的发展注入了新的活力。

这五个故事只是AXTAL公司发展起来历程中的一部分。它们从不同的角度展示了公司在创立、技术与品质追求、全球布局、应对市场挑战以及持续创新等方面所取得的成就和进步。未来,随着电子行业的不断发展和变革,相信AXTAL公司将继续保持其领先地位,为行业的进步和发展做出更大的贡献。

Amphenol Nexus公司的发展小趣事

作为一家专注于电气元件和连接器制造的公司,Amphenol Nexus Technologies始终致力于技术创新和产品升级。公司投入大量资源用于研发,不断推出具有创新性和高性能的新产品。例如,在高速连接器领域,Amphenol Nexus Technologies成功研发出了112G高速背板连接器,这一产品满足了人工智能等前沿技术对高速传输的需求,为公司带来了新的增长点。

Hayashi Denko Co Ltd公司的发展小趣事

Amphenol Nexus Technologies的故事始于1961年,由William H. Flanagan和Randolph K. Byers两位创业者共同创立。当时,公司的核心业务是设计和制造高品质的音频插头、插孔和MIL-S-8805/3按钮开关。在创始人的领导下,公司凭借精湛的工艺和可靠的产品质量,逐渐在军事和商业通信耳机市场赢得了声誉。随着业务的扩展,Amphenol Nexus Technologies的产品线不断丰富,满足了市场日益增长的需求。

AC Photonics Inc公司的发展小趣事

随着电子行业的快速发展和市场竞争的加剧,AC Photonics Inc也面临着诸多挑战。然而,公司始终保持着敏锐的市场洞察力和应变能力。在面对行业变革和技术升级时,公司能够及时调整战略方向,加大研发投入,推出更具竞争力的新产品。同时,公司还积极探索新的商业模式和市场机会,为未来的发展奠定了坚实的基础。


以上五个故事均是基于一般性的电子行业发展模式虚构的,旨在展示AC Photonics Inc公司可能的发展路径和经历。实际情况可能有所不同,具体细节需要参考公司的官方资料和历史记录。

Elite公司的发展小趣事

进入21世纪后,电子行业迎来了新的发展机遇和挑战。面对行业内的激烈竞争和技术的快速迭代,Elite意识到必须加快转型升级步伐。公司开始涉足智能家居、物联网等新兴市场领域,并成功推出了一系列具有竞争力的产品。这些新产品不仅为公司带来了新的增长点,也进一步巩固了Elite在电子行业的领先地位。

问答坊 | AI 解惑

无所不能的matlab,你心动吗?

先来看看它的系统仿真-------引擎!!! 再来看看它支持的东东!!! Matlab常用工具箱   MATLAB包括拥有数百个内部函数的主包和三十几种工具包。工具包又可以分为功能性工具包和学科工具包。功能工具包用来扩充MATLAB的符号计算,可视 ...…

查看全部问答>

除了茫然,还是茫然.........

现在自学ARM,自己把接口等看了一遍,觉得自己可以做板子上的DEMO了,C语言的还可以勉强看懂...但是看.h和.inc除了茫然没别的感觉了....可以看懂语法,就不不知道这是什么意义????…

查看全部问答>

请 ppc , .netcf 开发高手 加我QQ ,谢谢

请 ppc .netcf 开发高手 加我QQ  ,谢谢 有很多问题要请教 qq 27541407…

查看全部问答>

大家帮帮忙,看看这是什么算法

这是依玛士9020喷码机的协议,不知道是什么算法。 例子1: B7h 00h 03h 41h 31h 32h - B7h 最后一位B7是校验码 例子2: A4h 00h 03h 00h 00h 00h - A7h 最后一位A7是校验码 例子3: B1h 00h 01h 00h  - B0h 最后一位B0是校验码 ...…

查看全部问答>

comboBox 控件使用问题

现在做一个wince平台下的应用软件(wince智能设备 基于dialog的),现在使用combobox控件,如设置其属性为dropdown的时候,可以用户自己输入内容,希望这个时候能够自动弹出输入法,但是不希望点击下拉时弹出,也不希望点击属性为droplist的combobo ...…

查看全部问答>

比较一下单片机、DSP、PLC、CPLD、FPGA、嵌入式这几中开发的区别???

最近想学硬件开发,不知道单片机、DSP、PLC、CPLD、FPGA、嵌入式这几中开发有什么区别,请各位大哥指点一下。     先在这里谢过了!!!!!…

查看全部问答>

关于format 的问题

我想format C,但dos提示命令不是内部命令或外部命令,哪位兄弟知道,怎么解决??? …

查看全部问答>

关于中断注册

在4.2平台下注册中断都要改oalintr.h,armint.c 有没有可能直接在驱动内部完成这些操作呢,也就是让用户不重编译内核的情况下自己写驱动时在驱动里注册中断呢 我没有用过5.0和6.0,听说它们就是这样的?直接在驱动内部一个函数全搞定,不知真 ...…

查看全部问答>

上本好书ucosII内核,移植及应用程序开发

过年了上本好书给大家,算是礼物哈   …

查看全部问答>