;功能说明
;用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
推荐帖子
- 电子基础知识——晶体二极管
- 本帖最后由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得捷技术专区
设计资源 培训 开发板 精华推荐
- 3.3V/6A、同步反激式转换器、以太网供电(PoE)-符合IEEE 802.3at的参考设计
- SPT8120 是一款用于无线的 16 位、20 MSPS 模数转换器 ADC
- AD9238BCP-40EBZ,用于 AD9238、2 通道、10 位、40 MSPS 模数转换器的评估板
- 对讲机dtmf解码
- LTC2862AHDD-2 PROFIBUS 兼容线路接口的典型应用
- 【训练营】物联网时钟-侯佳怡
- 使用 ON Semiconductor 的 LA4508 的参考设计
- 使用 Microchip Technology 的 TC9491A 的参考设计
- eLQFP176封装的SPC58 C Line的微型插座模块
- NCS2001SN1T1G 0.9V 单电源高顺从电流吸收器的典型应用电路