8位数码管显示

合集下载

秒表-八位数码管显示

秒表-八位数码管显示

秒表-八位数码管显示1;************************************************************************** 2; 标题: 秒表-八位数码管显示(汇编)3; 作者: wentao 4; 5; 日期: 2007.3.36; 软件: Keil A51 V8.007; 芯片: AT89X518; 说明: 实验板实测通过,数码管为8位共阳9; 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途!10;************************************************************************** 1112dot_l equ 30h ;30单元存储百分之一秒值13dot_h equ 31h ;31单元存储十分之一秒值14sec_l equ 32h ;32单元存储秒个位值15sec_h equ 33h ;33单元存储秒十位值16min_l equ 34h ;34单元存储分个位值17min_h equ 35h ;35单元存储分十位值18hou_l equ 36h ;36单元存储时个位值19hou_h equ 37h ;37单元存储时十位值2021dot equ 38h ;38单元为百分之一秒计数器(0.00s-0.99s)22sec equ 39h ;39单元为秒计数器(00s-59s)23min equ 40h ;40单元为分计数器(00m-59m)24hou equ 41h ;41单元为时计数器(00h-00h)2526dis_b equ 42h ;dis_b(42单元)作为位码选通数码管27dis_r equ 43h ;dis_r(43单元)为取段码时的偏移量2829key_t equ 44h ;44单元为键按下的次数标记3031K bit p1.4 ;K键与P1.4相连3233 org 0000h34 ajmp start35 org 000bh ;定时器0的中断入口地址36 ajmp time0 ;跳到定时器0的中断服务程序处37 org 001bh ;定时器1的中断入口地址38 ajmp time1 ;跳到定时器1的中断服务程序处39 org 0030h40start:41 mov p2,#0xff ;关所有数码管42 mov p1,#0xff ;p1为准双向口,作输入时先写14344 mov dis_b,#0x7f ;初始选通P2.7口数码管45 mov dis_r,#0 ;初始化偏移量为046 mov dot,#0 ;百分之一秒计数器清零47 mov sec,#0 ;秒计数清零48 mov min,#0 ;分计数清零49 mov hou,#0 ;时计数清零50 mov key_t,#0 ;键按下次数清零5152 mov tmod,#00010001b ;定时/计数器0、1工作于方式153 mov th0,#0xd8 ;预置定时常数55536(d8f0),产生10ms时基信号54 mov tl0,#0xf055 mov th1,#0xfc ;预置定时常数64536(fc18),产生1ms间隔用于动态显示56 mov tl1,#0x185758 setb ea ;开总中断59 setb et0 ;定时/计数器0允许中断60 setb et1 ;定时/计数器1允许中断61 clr tr0 ;关定时/计数器062 setb tr1 ;开定时/计数器16364lop:65 jb K,lop ;键(P1.4)未按下则返回66 lcall d_10ms ;延时10ms消抖67 jb K,lop ;是抖动则返回重新扫描68 jnb K,$ ;等待键松开69 lcall key_to ;调用键处理部分70 ajmp lop ;循环显示7172key_to: ;键处理子程序73 inc key_t ;键按下次数加174 mov a,key_t ;按下次数送入a75 cjne a,#1,key_2 ;不是1次继续检测是否是第2次76 setb tr0 ;第1次按下启动定时器077 ret78key_2: cjne a,#2,key_3 ;也不是2次继续检测是否是第3次79 clr tr0 ;第2次按下关闭定时器080 ret81key_3: cjne a,#3,back ;也不为3则结束82 mov dot,#0 ;第3次按下将四个计数器清零83 mov sec,#084 mov min,#085 mov hou,#086 mov key_t,#0 ;按键次数清零87back: ret88;--------------------------------------------------------------------------------89time0: ;定时器0中断服务程序90 push psw ;保护现场91 push acc9293 inc dot ;百分之一秒计数器加194 mov a,dot ;计数器值送入a95 cjne a,#100,over ;未计到100则返回继续计数96 mov dot,#0 ;计到100后清零97 inc sec ;秒计数器加1(进位10ms*100=1s)98 mov a,sec ;秒计数值送入a99 cjne a,#60,over ;未计到60则返回继续计数100 mov sec,#0 ;计到60后秒计数器清零101 inc min ;分计数器加1(进位60s=1m)102 mov a,min ;分计数值送入a103 cjne a,#60,over ;未计到60则返回继续计数104 mov min,#0 ;计到60后分计数器清零,重新计时105 inc hou ;时计数器加1(进位60m=1h)106 mov a,hou ;时计数器送入a107 cjne a,#100,over ;未计到100则返回继续计数108 mov hou,#0 ;计到100后清零109110over: mov th0,#0xd8 ;重置定时常数111 mov tl0,#0xf0112 pop acc ;恢复现场113 pop psw114 reti ;中断返回115;--------------------------------------------------------------------------------116time1: ;定时器1中断服务程序117 push psw ;保护现场118 push acc119 push b120 ;以下是百分之一秒计数器值个位十位分开121 mov a,dot ;百分之一秒计数器值送入a(被除数)122 mov b,#10 ;除数10送入b123 div ab ;a除以b124 mov dot_l,b ;余数b(百分之一秒值)送入百分之一秒存储单元125 mov dot_h,a ;商a(十分之一秒值)送入十分之一秒存储单元126 ;以下是秒计数器值个位十位分开127 mov a,sec ;秒计数器值送入a(被除数)128 mov b,#10 ;除数10送入b129 div ab130 mov sec_l,b ;余数b(秒个位值)送入秒个位存储单元131 mov sec_h,a ;商a(秒十位值)送入秒十位存储单元132 ;以下是分计数器值个位十位分开133 mov a,min ;分计数器值送入a(被除数)134 mov b,#10 ;除数10送入b135 div ab136 mov min_l,b ;余数b(分个位值)送入分个位存储单元137 mov min_h,a ;商a(分十位值)送入分十位存储单元138 ;以下是时计数器值个位十位分开139 mov a,hou ;时计数器值送入a(被除数)140 mov b,#10 ;除数10送入b141 div ab142 mov hou_l,b ;余数b(小时个位值)送入时个位存储单元143 mov hou_h,a ;商a(小时十位值)送入时十位存储单元144145 mov dptr,#table ;数码管段码表首址送入dptr146147 mov a,#dot_l ;取百分之一秒值的地址148 add a,dis_r ;基址+偏移量149 mov r0,a ;R0为欲显示值的地址150 mov a,@r0 ;取欲显示值送入a151 ; dis_r : 0 1 2 3 4 5 6 7152 ;对应单元: dot_l dot_h sec_l sec_h min_l min_h hou_l hou_h153 movc a,@a+dptr ;取对应值的段码154 mov p2,dis_b ;位码送入P2口155156 mov r0,dis_b ;取位码判断是否为需加小数点的位[liuwentao]157 cjne r0,#0xdf,b3 ;不是P2.5再判断是否为P2.3158 ajmp add_dot ;是P2.5则段码加上小数点显示159b3: cjne r0,#0xf7,b1 ;也不是P2.3再判断是否为P2.1160 ajmp add_dot ;是P2.3则段码加上小数点显示161b1: cjne r0,#0xfd,com ;也不是P2.1则正常送段码162163add_dot: anl a,#0x7f ;是P2.5,P2.3,P2.1则段码和7f做与操作使对应位显示小数点164com: mov p0,a ;段码送入P0口165166 inc dis_r ;偏移量加1,下次中断时显示下个数167 anl dis_r,#0x07 ;dis_r增到8时自动清0(使之在0到7间循环)168169 mov a,dis_b ;位码循环右移,下次中断时选通下个数码管170 rr a171 mov dis_b,a172173 mov th1,#0xfc ;重置定时常数174 mov tl1,#0x18175176 pop b177 pop acc ;恢复现场178 pop psw179 reti180181d_10ms: mov r5,#20 ;1+(1+2*255)*20+2*20=10.261ms@12M182temp1: mov r6,#255 ;1+2*255183 djnz r6,$184 djnz r5,temp1185 ret186187table: db 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf ;段码表188 ; 0 1 2 3 4 5 6 7 8 9 - 对应内容189190end191/************************************************************************** 192* 标题: 八位数码管显示(C51)193* 作者: wentao 194 195* 日期: 2007.3.3196* 软件: Keil C51 V8.02197* 芯片: AT89X51198* 说明: 实验板实测通过,数码管为8位共阳199* 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途!200**************************************************************************/ 201202#include <reg51.h>203#include <intrins.h>204#define uchar unsigned char205206void delay_ms(uchar ms); // 延时毫秒@12M,ms最大值255207void key_scan(); // 按键扫描208void key_to(); // 按键处理209210uchar code dis_code[11] = {0xc0,0xf9,0xa4,0xb0,0x99, //段码表211 // 0 1 2 3 4 对应内容212 0x92,0x82,0xf8,0x80,0x90,0xbf};213 // 5 6 7 8 9 -214215uchar data dis[8]; // dis[0]为百分之一秒值,dis[1]为十分之一秒值216 // dis[2]为秒个位值,dis[3]为秒十位值217 // dis[4]为分个位值,dis[5]为分十位值218 // dis[5]为时个位值,dis[6]为时十位值219220uchar data dot = 0; // 百分之一秒计数器(0.00s-0.99s)221uchar data sec = 0; // 秒计数器(00s-59s)222uchar data min = 0; // 分计数器(00m-59m)223uchar data hou = 0; // 时计数器(00h-99h)224225uchar data dis_b; // dis_b为位码选通数码管226uchar data dis_r; // dis_r为取段码时的偏移量227228uchar data key_t = 0; // 按键次数,初始为0229230sbit K = P1^4; // K键与P1.4相连231232void main()233{234 P2 = 0xff; // 关所有数码管235 P1 = 0xff; // p1为准双向口,作输入时先写1236 dis[2] = 10; // '-'在段码表中偏移量为10237 dis[5] = 10; // '-'在段码表中偏移量为10238 dis_b = 0x7f; // 初始选通P2.7口数码管239 dis_r = 0; // 初始化偏移量为0240241 TMOD = 0x11; // 定时/计数器0,1工作于方式1242 TH0 = 0xd8; // 预置定时常数55536(d8f0),产生10ms时基信号243 TL0 = 0xf0;244 TH1 = 0xfc; // 预置定时常数64536(fc18),产生1ms间隔用于动态显示245 TH1 = 0x18;246 EA = 1; // 开总中断247 ET0 = 1; // 定时/计数器0允许中断248 ET1 = 1; // 定时/计数器1允许中断249 TR0 = 0; // 关闭定时/计数器0250 TR1 = 1; // 启动定时/计数器1251 while(1)252 {253 if(K != 1) // 有键按下254 {255 delay_ms(10); // 延时10ms去抖256 if(K != 1) // 确定是有键按下257 {258 while(K != 1); // 等待键松开259 key_to(); // 按键处理260 }261 }262 }263}264void key_to() // 按键处理子程序265{266 key_t++; // 按键次数加1267 if(key_t == 1) // 第一次按下268 TR0 = 1; // 启动定时器0269 else270 {271 if(key_t == 2) // 第二次按下272 TR0 = 0; // 关闭定时器0273 else274 {275 if(key_t == 3) // 第三次按下276 {277 dot = 0; // 四个计数器清零278 sec = 0;279 min = 0;280 hou = 0;281 key_t = 0; // 按键次数清零282 }283 }284 }285286}287void tiem0(void) interrupt 1 // T/C0中断服务程序(产生10ms时基信号) 288{289 dot++; // 百分之一秒计数器加1290 if(dot == 100) // 计数值到100291 {292 dot = 0; // 清零293 sec++; // 秒计数器加1(进位10ms*100=1s)294 if(sec == 60) // 秒计数值到60295 {296 sec = 0; // 秒计数器清零297 min++; // 分计数器加1(进位60s=1m)298 if(min == 60) // 分计数到60299 {300 min = 0; // 分计数器清零301 hou++; // 时计数器加1(进位60m=1h)302 if(hou == 100) // 时计数器到100303 hou = 0; // 时计数器清零304 }305 }306 }307 TH0 = 0xd8; // 重置定时常数308 TL0 = 0xf0;309}310void time1(void) interrupt 3 // T/C1中断服务程序(延时1ms数码管动态显示) 311{312 uchar data t = 0; // 段码临时变量313314 dis[0] = dot % 10; // 百分之一秒计数器个位分离出来赋绐dis[0] 315 dis[1] = dot / 10; // 百分之一秒计数器十位分离出来赋绐dis[1] 316 dis[2] = sec % 10; // 秒计数器个位赋绐dis[2]317 dis[3] = sec / 10; // 秒计数器十位赋绐dis[3]318 dis[4] = min % 10; // 分计数器个位赋绐dis[4]319 dis[5] = min / 10; // 分计数器十位赋绐dis[5]320 dis[6] = hou % 10; // 时计数器个位赋绐dis[6]321 dis[7] = hou / 10; // 时计数器十位赋绐dis[7]322323 t = dis_code[dis[dis_r]]; // 取出段码放入临时变量t324325 // 判断位码如果为显示P2.5,P2.3,P2.1则对应段码应加上小数点显示326 // 和0x7f(01111111)做与操作使原段码加上小数点变为新段码327328 if(dis_b == 0xdf | dis_b == 0xf7 | dis_b == 0xfd)329 t &= 0x7f;330331 P2 = dis_b; // 位码送P2口332 P0 = t; // 段码送P0口333334 dis_r++; // 偏移量加1,下次中断时显示下个数335 dis_r &= 0x07; // dis_r增到8时自动清0(使之在0到7间循环) 336337 dis_b = _cror_(dis_b,1); // 位码循环右移,下次中断时选通下个数码管338339 TH1 = 0xfc; // 重置定时常数340 TL1 = 0x18;341342}343void delay_ms(uchar ms) // 延时毫秒@12M,ms最大值255344{345 uchar i;346 while(ms--)347 for(i = 0; i < 124; i++);348}广州珍珠岩,广州珍珠岩厂 Ce57uICIJeu8。

八位数码管扫描显示电路的设计

八位数码管扫描显示电路的设计

《EDA技术及应用》课程设计报告题目:八位数码管扫描显示电路的设计院(系):机电与自动化学院专业班级:电气自动化技术学生姓名:学号:指导教师:20 年6月10日至20 年6月23日华中科技大学武昌分校4、课程设计使用设备(1)EDA及SOPC综合实验平台;(2)导线若干;(3)PC机;(4)Quartus II开发工具软件。

目录摘要................................................................1.课程设计题目及要求 (1)1.1设计题目 (1)1.2L E D显示器的动态扫描驱动电路 (1)1.3设计方案论证 (1)2.L E D显示器动态扫描驱动电路各单元电路设计 (3)2.1计数器与译码器的设计 (3)2.2一位共阳极L E D动态驱动电路设计 (4)2.3七段数码管的设计 (5)3.L E D显示器动态扫描系统设计 (7)3.1整体电路图及工作原理 (7)3.2V H D L程序设计 (7)3.3电路参数计算 (10)4.Q u a r t u s运行调试 (12)4.1时序仿真 (12)4.2硬件逻辑验证 (13)4.3调试结果分析 (13)4.4调试中出现的问题及解决方法 (14)5.设计总结 (15)6.参考文献 (16)摘要本文通过一个3-8译码器电路,将输入的4位2进制数转换为与LED显示对应的8位段码,位码就是LED的显示使能端,对于共阳级的LED而言,高电平使能。

要使8个数码管动态扫描显示,就是把所有数码管的相同段并联在一起,通过选通信号分时控制各个数码管的公共端,循环点亮多个数码管,并利用人眼的视觉暂留现象,只要扫描的频率大于50Hz,将看不到闪烁现象。

使用Quartus II6.0软件设计一个VHDL程序并对设计方案进行仿真,再硬件调试经检测输出正确的设计要求结果。

关键词:动态扫描Quartus II6.0 VHDLAbstractIn this paper, through a 3-8 decoder circuit, the input of four hexadecimal number into 2 and eight LED display the corresponding section of code, a codeis the LED display can make side, for the LED with Yang level, high level canmake. To makeeight digital tube dynamic scans showed that is all the samesegment digital tube connected in parallel, through the gating signal time-sharing control public side, the digital tube loop light multiple digital tube, and use the eye of the phenomenon of persistence of vision, as long as the scanning frequency is more than 50 hz, will see the flicker phenomenon. Using Quartus II6.0 a VHDL program design and the software design simulation, and hardware debugging through testing output correct design requirementsKey words: dynamic scanning Quartus II6.0 VHDL1. 课程设计题目及要求1.1设计题目八位数码管扫描显示电路的设计设计主要内容:本课题要求掌握使用Quartus II设计数字系统的设计思路和设计方法。

51单片机应用:8只数码管同时显示多个不同字符

51单片机应用:8只数码管同时显示多个不同字符

51单片机应用:8只数码管同时显示多个不同字符设计要求单片机控制8只数码管,同时显示8个字符。

例如,从左至右显示“”,接着显示“”,在接着显示“”,……“”,“”,分析及方案设计:本题可以采用扩展I/O口或直接用单片机自身的I/O口的方法实现。

为节省硬件设施并使电路连线尽量简单,采用直接使用单片机自身I/O口的方式,8个数码管同时显示数字则需采用动态显示方法,初步设定以P0口给出数码管显示字段,P1口选中某一时刻动态点亮的数码管。

软件设计可以有以下几种方案:a)将全部显示状态列出,放在主程序中不断循环b)将显示状态放入8个数组中,每个状态循环一次后主程序重新开始循环c)只设置两个数组,其中一个取值不变,为正序的从1到8的共阳极数码管段码,另一个数组中的数值不断被修改,即每次显示状态改变的时候都相应改变一次,如从的段码改为的段码。

从上述方案可以看出,若设置太多的数组或列出所有显示状态,程序虽然清晰易懂但占用程序存储空间明显较大,且用delay()函数延时的话会不断占用CPU;用两个数组和两个定时器虽然算法略复杂,但程序可以达到最简化。

详细的方案说明:1)采用数码管动态显示方法。

2)8个数码管由P3控制位选,即决定某一时刻哪一个数码管亮,由P0发出的总线控制显示的段码。

3)定时器T0和T1同时工作,定时时间均为0."5毫秒,采用方式1定时,每次溢出后由软件重装初值。

4)设置中间变量temp,用于不断左移并给P3赋值;数组display[]为code 即取之不变的数组,数组show[]中的取值变化。

5)每次T0计数溢出时,temp左移一次,相应的P3左移一次,数码管由第i 个点亮变为第i+1个点亮,与此同时赋给P0口的值由show[i]变为show[i+1],达到动态显示的效果。

6)定时器T1也是每0."5毫秒计数溢出一次,但只有到1秒时才执行定时器1中断中修改数组show[]取值的程序,用变量t记录T1溢出的次数,达到200次时数组show[]中的内容开始进行修改并且t清零。

【CPLD EPM570】Verilog实现8位8段数码管显示

【CPLD EPM570】Verilog实现8位8段数码管显示

Verilog实现8位8端数码管显示1 原理图2个4位的数码管,组成的8位8段数码管,每个4位数码管的数据线独立,其实是可以以总线形式连接在一起的,可以减少IO。

共阳极的供电端用了三极管增加驱动,否则IO供电驱动多个数码管时有困难。

2 CPLD代码module LED_8segment (clk_24m,reset_n,Bit_line, //数码管位选择线。

Data_line_h, //高4位数码管数据线。

Data_line_l //低4位数码管数据线。

);input wire clk_24m;input wire reset_n;output wire [7:0] Bit_line; //8位位选择线,对应8位的数码管。

output wire [0:7] Data_line_h; //8位数据线,对应abcdefg和dp共8段LED。

output wire [0:7] Data_line_l;/****************************************************************************** 24M时钟分频,用于内部控制及计数等。

******************************************************************************/ reg [16:0] count_div1;wire condition_183; //183 Hz时钟信号。

always @ (posedge clk_24m or negedge reset_n)beginif(reset_n == 1'b0)count_div1 <= 16'h00000;elsecount_div1 <= count_div1 + 16'h00001;end/****************************************************************************** condition_183:183Hz时钟信号,高电平持续一个24MHz时钟周期,其余时间为低电平。

8位数码管

8位数码管

8位数码管一、概述8位数码管是一种用于显示数字的电子元件,通常由8个LED组成。

每个LED 可以显示0到9之间的数字,以此来组合显示各种数字。

在数字显示领域,8位数码管被广泛应用于各种设备和仪器中,如计时器、温度计、电子秤等。

本文将介绍8位数码管的工作原理、应用场景和未来发展方向。

二、工作原理8位数码管内部由多个LED灯组成,每个LED代表一个数字。

通过控制不同LED的点亮状态,可以实现显示不同数字的功能。

常见的8位数码管有两种类型:共阴极和共阳极。

共阴极的数码管,当给LED提供正电流时,LED点亮;而共阳极的数码管则是给予负电流时,LED点亮。

控制8位数码管显示数字的关键是通过微控制器或驱动芯片来控制各个LED的点亮状态。

三、应用场景8位数码管在各个行业有着广泛的应用,下面列举了一些常见的应用场景:1.电子秤: 用于显示称重结果。

2.计时器: 用于显示时间或倒计时。

3.电子游戏机: 用于显示玩家得分。

4.仪器仪表: 用于显示各种数据。

5.电子产品: 用于显示各种状态信息。

四、未来发展方向随着科技的不断进步,8位数码管的应用也在不断拓展和升级。

未来,我们可以期待以下方向的发展:1.高清晰度: 开发更高分辨率的数码管,提高显示效果。

2.更低功耗: 降低数码管的功耗,延长电池寿命。

3.多功能显示: 实现数码管显示多种信息,如图标、文字等。

4.智能控制: 结合传感器技术,实现自动调节显示内容。

五、结语总的来说,8位数码管作为一种数字显示设备,在各种行业中发挥着重要作用。

未来随着技术的不断发展和创新,我们有信心数码管将会有更加广泛的应用和更出色的性能。

希望本文能对读者对8位数码管有所了解并引发更多关于数码管的思考。

8段数码管动态显示详解

8段数码管动态显示详解

原理图:8 个数码管它的数据线并联接到 JP5,位控制由 8 个 PNP 型三级管驱动后由 JP8 引出。

个。

我们分别把他命名为 A,B,C,D,E,F,G,H搞懂了这个原理, 我们如果要显示一个数字 2, 那么 A,B,G,E,D 这 5 个段的发光管亮就可以了。

也就是把B,E,H(小数点)不亮,其余全亮。

根据硬件的接法我们编出以下程序。

当然在此之前,还必须指定哪一个数码管亮,这里我们就指定最后一个 P2.7。

显示数字 2 则是 C,F,H(小数点)不亮,同时由于接法为共阳接法,那么为 0(低电平)是亮为 1(高电平)是灭。

从高往低排列,(p0.7_p0.0)写成二进制为 01111110,把他转化为 16 进制则为A2H。

我们可以根据硬件的接线把数码管显示数字编制成一个表格,以后直接调用就行了。

原理图中把所有数码管的 8 个笔划段 a-h 同名端连在一起,而每一个显示器的公共极 COM 是各自独立地受 I/O 线控制。

CPU 向字段输出口送出字形码时,所有显示器接收到相同的字形码,由 8 个 PNP 的三极管,来控制这 8 位哪一位工作,例如上面的例子中我们选中的是 P2.7.就是最后的一位亮了. 同样的如果要第一位亮, 只需要把程序 CLR P2.7 改为 CLR P2.0 即可。

在这里就有了一个矛盾, 所有数码管的 8 个笔划段 a-h 同名端连在一起, 那么在一个屏幕上如何显示0,1,2,3,4,5 这样不同的数字呢? 的确, 在这样的接法中,同一个瞬间所有的数码管显示都是相同的, 不能显示不同的数字。

在单片机里,首先显示一个数, 然后关掉.然后显示第二个数,又关掉, 那么将看到连续的数字显示,轮流点亮扫描过程中,每位显示器的点亮时间是极为短暂的(约 1ms),由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位显示器并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感。

8位数码管动态显示电路设计

8位数码管动态显示电路设计

电子课程设计— 8位数码管动态显示电路设计学院:电子信息工程学院专业、班级:姓名:学号:指导老师:2014年12月目录一、设计任务与要求................................................. (3)二、总体框图................................................. (3)三、选择器件................................................. (3)四、功能模块................................................. (9)五、总体设计电路图................................................. . (10)六、心得体会.................................................. .. (12)8位数码管动态显示电路设计一、设计任务与要求1. 设计个8位数码管动态显示电路,动态显示1、2、3、4、5、6、7、8。

2. 要求在某一时刻,仅有一个LED数码管发光。

3. 该数码管发光一段时间后,下一个LED发光,这样8只数码管循环发光。

4. 当循环扫描速度足够快时,由于视觉暂留的原因,就会感觉8只数码管是在持续发光。

5、研究循环地址码发生器的时钟频率和显示闪烁的关系。

二、总体框图设计的总体框图如图2-1所示。

图2-1总体框图三、选择器件 1、数码管数码管是一种由发光二极管组成的断码型显示器件,如图1所示。

U13DCD_HEX图1 数码管数码管里有八个小LED 发光二极管,通过控制不同的LED 的亮灭来显示出不同的字形。

数码管又分为共阴极和共阳极两种类型,其实共阴极就是将八个LED 的阴极连在一起,让其接地,这样给任何一个LED 的另一端高电平,它便能点亮。

DS1302汇编数码管显示8位

DS1302汇编数码管显示8位

/*****************************************电路P1口接74HC573锁存4位数码管位远,P0接4位数码管段选。

P2.5,p2.6,p2.7接DS1302. *****************************************/ORG 0000HAJMP STARTORG 000BHAJMP TIM0SCLK EQU P2^7IO EQU P2^6RST EQU P2^5ALL_FLAG EQU 31H ;标志位SEC EQU 32H ;秒MIN EQU 33H ;分HOUR EQU 34H ;时DAY EQU 35H ;日MON EQU 36H ;月WEEK EQU 37H ;星期YEAR EQU 38H ;年DS_DAT EQU 39HDS_ADD EQU 3AHDS_DATA EQU 3BHS1 EQU r7ORG 70HSTART:MOV TMOD ,#00000001BMOV TH0 ,#HIGH(65536-1000);HIGH和LOW写反了会错MOV TL0 ,#LOW(65536-1000)SETB EASETB ET0SETB TR0LCALL DS_INITLOOP2:CALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYLCALL DS_R_TIMEsjmp LOOP2DELAY:MOV R1,#10 ;1ms延时子程序D0: MOV R2,#248DJNZ R2,$DJNZ R1,D0RET/***************************************** DS1302写字节函数*****************************************/ DS_W_BYTE:MOV R0,#08MOV A,DS_DATDS_W1:RRC AMOV IO,CNOPSETB SCLKnopCLR SCLKDJNZ R0,DS_W1RET/***************************************** DS1302读字节函数*****************************************/ DS_R_BYTE:SETB IOMOV A,#00HMOV R0,#08DS_R1:MOV C,IORRC ASETB SCLKNOPCLR SCLKNOPDJNZ R0,DS_R1MOV DS_DA T,ARET/***************************************** DS1302读数据函数入口地址存至DS_ADD;读取到的数据存入DS_DA T *****************************************/ DS_R_DAT:CLR RSTNOPCLR SCLKNOPSETB RSTNOPMOV DS_DA T,DS_ADDLCALL DS_W_BYTELCALL DS_R_BYTESETB SCLKCLR RSTNOPNOPSETB SCLKNOPNOPCLR IONOPNOPsetb IONOPNOPRET/***************************************** DS1302写数据函数入口地址DS_ADD,入口数据DS_DA TA*****************************************/ DS_W_DAT:CLR RSTNOPCLR SCLKNOPSETB RSTNOPMOV DS_DA T,DS_ADDLCALL DS_W_BYTEMOV DS_DA T,DS_DATALCALL DS_W_BYTEMOV DS_DA T,ASETB SCLKCLR RSTNOPNOPSETB SCLKNOPNOP ;加了延时CLR IONOPNOPsetb IONOPNOPRET/*****************************************DS1302读时间函数入口地址DS_ADD,*****************************************/DS_R_TIME:MOV DS_ADD,#81HLCALL DS_R_DATMOV SEC,DS_DATMOV DS_ADD,#83HLCALL DS_R_DATMOV MIN,DS_DATMOV DS_ADD,#85HLCALL DS_R_DATMOV HOUR,DS_DATMOV DS_ADD,#87HLCALL DS_R_DATMOV DAY,DS_DATMOV DS_ADD,#89HLCALL DS_R_DATMOV MON,DS_DATMOV DS_ADD,#8BHLCALL DS_R_DATMOV WEEK,DS_DATMOV DS_ADD,#8DHLCALL DS_R_DATMOV YEAR,DS_DATRET/*****************************************DS1302写时间函数入口地址DS_ADD,入口数据*****************************************/DS_W_TIME:CLR RSTCLR SCLKMOV DS_ADD,#8EH ;语序写MOV DS_DATA,#00HLCALL DS_W_DA TMOV DS_ADD,#80HMOV DS_DATA,SECLCALL DS_W_DA TMOV DS_ADD,#82HMOV DS_DATA,MINLCALL DS_W_DA TMOV DS_ADD,#84HMOV DS_DATA,HOURLCALL DS_W_DA TMOV DS_ADD,#86HMOV DS_DATA,DAYLCALL DS_W_DA TMOV DS_ADD,#88HMOV DS_DATA,MONLCALL DS_W_DA TMOV DS_ADD,#8AHMOV DS_DATA,WEEKLCALL DS_W_DA TMOV DS_ADD,#8CHMOV DS_DATA,YEARLCALL DS_W_DA TMOV DS_ADD,#8EH ;写保护MOV DS_DATA,#80HLCALL DS_W_DA TRET/*****************************************DS1302初始化*****************************************/DS_INIT:CLR RSTCLR SCLKMOV DS_ADD,#8EH ;允许写MOV DS_DATA,#00HLCALL DS_W_DA TMOV DS_ADD,#90HMOV DS_DATA,0xa5LCALL DS_W_DA TMOV DS_ADD,#80HMOV DS_DATA,#00HLCALL DS_W_DA TMOV DS_ADD,#82HMOV DS_DATA,#00HLCALL DS_W_DATMOV DS_ADD,#84HMOV DS_DATA,#23HLCALL DS_W_DA TMOV DS_ADD,#86HMOV DS_DATA,#16HLCALL DS_W_DA TMOV DS_ADD,#88HMOV DS_DATA,#12HLCALL DS_W_DA TMOV DS_ADD,#8aHMOV DS_DATA,#02HLCALL DS_W_DA TMOV DS_ADD,#8cHMOV DS_DATA,#14HLCALL DS_W_DA TMOV DS_ADD,#8EH ;写保护MOV DS_DATA,#80HLCALL DS_W_DA TRETTIM0:PUSH ACCPUSH PSWPUSH DPHPUSH DPLPUSH BMOV TH0 ,#HIGH(65536-1000) MOV TL0 ,#LOW(65536-1000) MOV A ,SECMOV B,#16DIV ABMOV 50H ,BMOV 51H, AMOV A,MINMOV B,#16DIV ABMOV 52H,BMOV 53h,AMOV A,HOURMOV B ,#16DIV ABMOV 54H,BMOV 55H,AINC S1MOV DPTR,#TABMOV P1,#0HCJNE S1,#1H,Z1NOPNOPMOV A ,50HMOVC A,@A+DPTRMOV P0,ASETB P1.0SJMP LOOPZ1:CJNE S1,#02H,Z2MOV A,51H MOVC A,@A+DPTRMOV P0,ASETB P1.1SJMP LOOPZ2:CJNE S1,#03H,Z3MOV P0,#0BFH SETB P1.2SJMP LOOPZ3:CJNE S1,#04H,Z4MOV A,52H MOVC A,@A+DPTRMOV P0,ASETB P1.3SJMP LOOPZ4:CJNE S1,#05H,Z5MOV A,53H MOVC A,@A+DPTRMOV P0,ASETB P1.4SJMP LOOPZ5:CJNE S1,#06H,Z6MOV P0,#0BFHSETB P1.5SJMP LOOPZ6:CJNE S1,#07H,Z7MOV A,54HMOVC A,@A+DPTRMOV P0,ASETB P1.6SJMP LOOPZ7:CJNE S1,#08H,Z8MOV A,55HMOVC A,@A+DPTRMOV P0,ASETB P1.7MOV S1,#0HSJMP LOOPZ8:LJMP 00HLOOP:POP BPOP DPLPOP DPHPOP PSWPOP ACCRETITAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFHEND。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

;************** DS1302 端口位定义**************IO_DA TA BIT P1.1 ; 数据传送总线SCLK BIT P1.0 ; 时钟控制总线RST BIT P1.2 ; 复位总线K1 EQU P1.4 ;独立键K2 EQU P1.5K3 EQU P1.6K4 EQU P1.7BEEP EQU P3.3 ;蜂鸣器RELAY EQU P3.5 ;继电器T_CONU EQU 22H ;中断计数TIME_L EQU 23H ;定时初值TIME_H EQU 24HTIME_DA TA EQU 50H ;显示时间单元首地址DA TE_DATA EQU 60H ;显示日期单元首地址DS_DA TA EQU 58H ;显示定时时间首地址;------------------------------------------------ORG 0000HAJMP MAINORG 000BHAJMP INT_T0ORG 0080H;------------------------------------------------MAIN:MOV TMOD,#01H ;T0,方式1MOV TIME_L,#00H ;50MS定时值MOV TIME_H,#4CHMOV T_CONU,#00H ;中断次数MOV IE,#82H ;EA=1,ET0=1MOV A,#00HMOV R0,#40H ;从40H单元开始MOV R1,#40H ;清64个单元M_CLEAR: MOV @R0,AINC R0DJNZ R1,M_CLEARMOV 7FH,#0AH ;送熄灭符SETB BEEPLCALL TIME_DELAY ;调显示延时LCALL PROSET ;DS1302初始化MAIN1:LCALL GET_TIME ;从DS1302读数据程序LCALL CHULI ;实时时间数据处理MOV R0,#TIME_DATA ;显示时、分、秒LCALL DISPMOV R0,#TIME_DATALCALL TIME_DISPLAYLCALL SET_KEY ;键功能程序;001LCALL COMP ;实时时间与定时时间比较JB K1,MAIN1CALL BEEP_BLMAIN2:LCALL CHULI ;日期数据处理MOV R0,#DA TE_DATALCALL DISP ;显示年、月、日MOV R0,#DA TE_DATALCALL TIME_DISPLAYJB K1,MAIN2CALL BEEP_BLMAIN3:LCALL DS_CHULI ;定时时间数据处理MOV R0,#DS_DA TALCALL DS_SP ;显示定时时间MOV R0,#DS_DA TALCALL DS_DISPLAYJB K1,MAIN3CALL BEEP_BLAJMP MAIN1;--------------------------------------------;中断服务子程序;300MS对闪动标记取反一次;-------------------------------------------- INT_T0:PUSH ACCPUSH PSWMOV TL0,TIME_LMOV TH0,TIME_HINC T_CONUMOV A,T_CONUCJNE A,#06H,INT_ENDMOV T_CONU,#00HCPL 0AHINT_END:POP PSWPOP ACCRETI;--------------------------------------------;DS1302 初始化子程序; (R0)=数据(R1)=地址;--------------------------------------------PROSET:CLR RST ;DS1302复位CLR SCLKNOPNOPSETB RST;MOV R1,#80H ;写秒寄存器;MOV R0,#00H ;启动振荡器;LCALL WRITE;MOV R1,#82H ;写分寄存器;MOV R0,#58H;LCALL WRITE;MOV R1,#84H ;写时寄存器;MOV R0,#80H;LCALL WRITEMOV R1,#90H ;写充电寄存器MOV R0,#0ABHLCALL WRITERET;===============================================;读时间、日期数据子程序;存放单元40H - 46H;=============================================== GET_TIME:MOV R1,#81H ;读秒LCALL READMOV 40H,R0MOV R1,#83H ;读分LCALL READMOV 41H,R0MOV R1,#85H ;读时LCALL READMOV 42H,R0MOV R1,#87H ;读出日期LCALL READMOV 43H,R0MOV R1,#89H ;读出月份LCALL READMOV 44H,R0MOV R1,#8BH ;读出星期LCALL READMOV 46H,R0MOV R1,#8DH ;读出年LCALL READMOV 45H,R0RET;================================================;写DS1302 子程序;================================================ WRITE:CLR SCLKNOPNOP1SETB RSTNOPMOV A,R1 ; (R0)=数据(R1)=地址MOV R2,#08HWRI_01:RRC A ;传输地址到DS1302NOPNOPCLR SCLKNOPNOPMOV IO_DA TA,CNOPNOPSETB SCLKNOPNOPDJNZ R2,WRI_01CLR SCLKNOPNOPMOV A,R0MOV R2,#08HWRI_02:RRC A ;传输数据到DS1302NOPCLR SCLKNOPNOPMOV IO_DA TA,CNOPNOPSETB SCLKNOPNOPDJNZ R2,WRI_02CLR SCLKNOPNOPCLR RSTNOPNOPRET;================================================= ;读DS1302 子程序;================================================= READ:CLR SCLKNOPNOPSETB RSTNOPNOPMOV A,R1MOV R2,#08HREAD_01:RRC ANOP ;先传输地址到DS1302MOV IO_DA TA,CNOPNOPSETB SCLKNOPNOPCLR SCLKNOPNOPDJNZ R2,READ_01NOPNOPSETB IO_DA TACLR ACLR CMOV R2,#08HREAD_02:CLR SCLKNOPNOPMOV C,IO_DA TANOPNOPRRC A ;再从DS1302接收数据NOPNOPSETB SCLKNOPNOPDJNZ R2,READ_02MOV R0,ACLR RSTRET;==============================================;实时时间、日期数据处理子程序;============================================== CHULI:MOV A,40H ;处理秒数据ANL A,#0FHMOV 50H,AMOV 70H,AMOV A,40HANL A,#11110000BSWAP AMOV 51H,AMOV 71H,A;---------------------------------------------MOV A,41H ;处理分数据ANL A,#0FHMOV 52H,AMOV 72H,AMOV A,41HANL A,#11110000BSWAP AMOV 53H,AMOV 73H,A;---------------------------------------------MOV A,42H ;处理时数据ANL A,#0FHMOV 54H,AMOV 74H,AMOV A,42HANL A,#11110000BSWAP AMOV 55H,AMOV 75H,A;----------------------------------------------MOV A,43H ;处理日数据ANL A,#0FHMOV 60H,AMOV 76H,AMOV A,43HANL A,#11110000BSWAP AMOV 61H,AMOV 77H,A;---------------------------------------------MOV A,44H ;处理月数据ANL A,#0FHMOV 62H,AMOV 78H,AMOV A,44HANL A,#11110000BSWAP AMOV 63H,AMOV 79H,A;---------------------------------------------MOV A,45H ;处理年数据ANL A,#0FHMOV 64H,AMOV 7AH,AMOV A,45H2ANL A,#11110000BSWAP AMOV 65H,AMOV 7BH,A;----------------------------------------------MOV A,46H ;处理周数据MOV 66H,AMOV 7CH,ARET;=============================================;实时时间、日期查表取数子程序;============================================= DISP: ;MOV R0,#TIME_DATAMOV R3,#06HDISP1: MOV A,@R0MOV DPTR,#TAB_NUMOVC A,@A+DPTRMOV @R0,AINC R0DJNZ R3,DISP1RET;================================================== ;时间、日期显示子程序;================================================== TIME_DISPLAY:;MOV R0,#TIME_DATA ;取得显示单元首地址MOV R1,#07FH ;从第一个数码管开始,位码MOV R2,#08H ;共8个数码管DISLP: MOV P0,@R0 ;获得当前单元数据MOV A,R1MOV P2,A ;数码显示JB ACC.5,DISLP1 ;第三位数码管显示-MOV P0,#0f7HJMP DISLP3DISLP1: JB ACC.2,DISLP2 ;第六位数码管显示-MOV P0,#0f7HJMP DISLP3DISLP2: INC R0DISLP3: MOV A,R1 ;为下一个数准备RR A ;下一个单元MOV R1,A ;保存LCALL DELAY ;为了保证数码管亮度,延时DJNZ R2,DISLP 复显示,直到全部数据刷新过RET ;返回DELAY:MOV R4,#0AHL15: MOV R5,#64HL16: DJNZ R5,L16DJNZ R4,L15RET;****************************************************** SET_KEY: ;001SETB K1 ;增加键SETB K2 ;减少键SETB K3 ;选择键SETB K4 ;定时设定功能键NOPJB K4,KEY01 ;002LCALL BEEP_BLJMP DS_KEY ;进入定时值设定子程序;002KEY01: JB K2,KEY02LCALL BEEP_BLJMP SET_TIME ;进入时间设定子程序KEY02: JB K3,KEY03LCALL BEEP_BLCPL 20H.0 ;止闹标记取反KEY03: RET;-----------------------------------------------------DS_KEY: ;002CALL DS_DELAY ;003JNB K4,$LCALL DSSETCALL DS_DELAYRET;==============================================;实时时间设定子程序;K1为加键、K2为减键、K3为选择键;==============================================SET_TIME:MOV R1,#8EH ;写保护寄存器MOV R0,#00H ;允许写入LCALL WRITEMOV R1,#80H ;写秒寄存器MOV R0,#80H ;停止振荡器工作LCALL WRITESETB TR0K001: CALL TIME_DELAY ;校时JNB K3,K001 ;K3为位移键K010:CALL CHULIJNB 0AH,KH01MOV 54H,7FH ;送入熄灭符MOV 55H,7FHJMP KH02KH01: MOV 54H,74H ;送实时值MOV 55H,75H ;送实时值KH02: MOV R0,#TIME_DATACALL DISPMOV R0,#TIME_DATACALL TIME_DISPLAYJNB K1,K011AJNB K2,K011BJNB K3,K002JMP K010K011A:MOV A,42HADD A,#01HDA AMOV 42H,AXRL A,#24HJNZ K012AMOV 42H,#00HK012A: MOV R1,#84H ;写时寄存器MOV R0,42HLCALL WRITECALL TIME_DELAYJMP K010K011B:MOV A,42HXRL A,#00HJZ K012BSETB C ;求补运算CLR AADDC A,#99H ;加99SUBB A,#01H ;减去减数ADD A,42H ;加被减数DA A ;十进制调整MOV 42H,A ;XRL A,#00HJNZ K012CK012B: MOV 42H,#23HK012C: MOV R1,#84H ;写时寄存器MOV R0,42HLCALL WRITECALL TIME_DELAYJMP K010;-------------------------------------------------K002: CALL TIME_DELAY ;校分JNB K3,K002 ;K3为位移键K020: CALL CHULIJNB 0AH,KM013MOV 52H,7FH ;送入熄灭符MOV 53H,7FHJMP KM02KM01: MOV 52H,72H ;送实时值MOV 53H,73H ;送实时值KM02: MOV R0,#TIME_DATACALL DISPMOV R0,#TIME_DATACALL TIME_DISPLAYJNB K1,K021AJNB K2,K021BJNB K3,K003JMP K020K021A:MOV A,41HADD A,#01HDA AMOV 41H,AXRL A,#60HJNZ K022AMOV 41H,#00HK022A: MOV R1,#82H ;写分寄存器MOV R0,41HLCALL WRITECALL TIME_DELAYJMP K020;---------------------------------------------------K021B:MOV A,41HXRL A,#00HJZ K022BSETB C ;求补运算CLR AADDC A,#99H ;加99SUBB A,#01H ;减去减数ADD A,41H ;加被减数DA A ;十进制调整MOV 41H,A ;XRL A,#00HJNZ K022CK022B: MOV 41H,#59HK022C: MOV R1,#82H ;写分寄存器MOV R0,41HLCALL WRITECALL TIME_DELAYJMP K020;---------------------------------------------------K003: CALL DATE_DELAY ;校日JNB K3,K003 ;K3为位移键K030: CALL CHULIJNB 0AH,KR01MOV 60H,7FH ;送入熄灭符MOV 61H,7FHJMP KR02KR01: MOV 60H,76H ;送实时值MOV 61H,77H ;送实时值KR02: MOV R0,#DA TE_DATACALL DISPMOV R0,#DA TE_DATACALL TIME_DISPLAYJNB K1,K031AJNB K2,K031BJNB K3,K004JMP K030K031A:MOV A,43HADD A,#01HDA AMOV 43H,AXRL A,#32HJNZ K032AMOV 43H,#00HK032A: MOV R1,#86H ;写日寄存器MOV R0,43HLCALL WRITECALL DA TE_DELAYJMP K030K031B:MOV A,43HXRL A,#00HJZ K032BSETB C ;求补运算CLR AADDC A,#99H ;加99SUBB A,#01H ;减去减数ADD A,43H ;加被减数DA A ;十进制调整MOV 43H,AXRL A,#00HJNZ K032CK032B: MOV 43H,#31HK032C: MOV R1,#86H ;写日寄存器MOV R0,43HLCALL WRITECALL DA TE_DELAYJMP K030;------------------------------------------------K004: CALL DATE_DELAY ;校月JNB K3,K004 ;K3为位移键K040: CALL CHULIJNB 0AH,KC01MOV 62H,7FH ;送入熄灭符MOV 63H,7FHJMP KC02KC01: MOV 62H,78H ;送实时值MOV 63H,79H ;送实时值KC02: MOV R0,#DA TE_DATACALL DISPMOV R0,#DA TE_DATACALL TIME_DISPLAYJNB K1,K041AJNB K2,K041BJNB K3,K005JMP K040K041A:MOV A,44HADD A,#01HDA AMOV 44H,AXRL A,#13HJNZ K042AMOV 44H,#00HK042A: MOV R1,#88H ;写月寄存器MOV R0,44HLCALL WRITECALL DA TE_DELAYJMP K040K041B:MOV A,44HXRL A,#00HJZ K042BSETB C ;求补运算CLR AADDC A,#99H ;加99SUBB A,#01H ;减去减数ADD A,44H ;加被减数DA A ;十进制调整MOV 44H,A ;XRL A,#00HJNZ K042CK042B: MOV 44H,#12HK042C: MOV R1,#88H ;写月寄存器MOV R0,44HLCALL WRITECALL DA TE_DELAYJMP K0404;-----------------------------------------------K005: CALL DATE_DELAY ;校年JNB K3,K005 ;K3为位移键K050: CALL CHULIJNB 0AH,KY01MOV 64H,7FH ;送入熄灭符MOV 65H,7FHJMP KY02KY01: MOV 64H,7AH ;送实时值MOV 65H,7BH ;送实时值KY02: MOV R0,#DA TE_DATACALL DISPMOV R0,#DA TE_DATACALL TIME_DISPLAYJNB K1,K051AJNB K2,K051BJNB K3,K008JMP K050K051A:MOV A,45HADD A,#01HDA AMOV 45H,AXRL A,#9AHJNZ K052AMOV 45H,#00HK052A: MOV R1,#8CH ;写年寄存器MOV R0,45HLCALL WRITECALL DA TE_DELAYJMP K050K051B:MOV A,45HXRL A,#00HJZ K052BSETB C ;求补运算CLR AADDC A,#99H ;加99SUBB A,#01H ;减去减数ADD A,45H ;加被减数DA A ;十进制调整MOV 45H,A ;XRL A,#00HJNZ K052CK052B: MOV 45H,#99HK052C: MOV R1,#8CH ;写年寄存器MOV R0,45HLCALL WRITECALL DA TE_DELAYJMP K050;-------------------------------------------------K008: JNB K3,K008MOV R1,#80H ;写秒寄存器MOV R0,#00H ;启动振荡器工作LCALL WRITEMOV R1,#8EH ;写保护寄存器MOV R0,#80H ;禁止写入LCALL WRITECALL DA TE_DELAYCLR 0AHCLR TR0CALL BEEP_BLRET;================================================= ;定时时间设定子程序;K1为加键、K2为减键、K3为选择键;================================================= DSSET:SETB TR0DS01: LCALL DS_DELAY ;定时分设定JNB K4,$DS010: CALL DS_CHULIJNB 0AH,DS01_1MOV 58H,7FH ;送入熄灭符MOV 59H,7FHJMP DS01_2DS01_1: MOV 58H,70H ;送实时值MOV 59H,71H ;送实时值DS01_2: MOV R0,#58HLCALL DS_SPMOV R0,#58HLCALL DS_DISPLAYJNB K1,DS01A ;加键JNB K2,DS01B ;减键JNB K3,DS02JMP DS010DS01A: ;加MOV A,48HADD A,#01HDA AMOV 48H,AXRL A,#60HJNZ DS011MOV 48H,#00HDS011: LCALL DS_DELAYJMP DS010DS01B: MOV A,48H ;判48H是否为0XRL A,#00HJZ DS012SETB C ;减CLR A ;求补运算ADDC A,#99H ;加99SUBB A,#01H ;减去减数ADD A,48H ;加被减数DA A ;十进制调整MOV 48H,A ;XRL A,#00HJNZ DS013DS012: MOV 48H,#59HDS013: CALL DS_DELAYJMP DS010;----------------------------------------------DS02: LCALL DS_DELAY ;定时时设定JNB K3,$DS020:CALL DS_CHULIJNB 0AH,DS02_1MOV 5AH,7FH ;送入熄灭符MOV 5BH,7FHJMP DS02_2DS02_1: MOV 5AH,72H ;送实时值MOV 5BH,73H ;送实时值DS02_2: MOV R0,#58HLCALL DS_SPMOV R0,#58HLCALL DS_DISPLAYJNB K1,DS02AJNB K2,DS02BJNB K3,DS03JMP DS020DS02A: MOV A,49H ;加ADD A,#01HDA AMOV 49H,AXRL A,#24HJNZ DS021MOV 49H,#00HDS021: LCALL DS_DELAYJMP DS020DS02B: MOV A,49H ;判49H是否为0XRL A,#00HJZ DS022SETB C ;减CLR A ;求补运算ADDC A,#99H ;加99SUBB A,#01H ;减去减数ADD A,49H ;加被减数DA A ;十进制调整5MOV 49H,A ;XRL A,#00HJNZ DS023DS022: MOV 49H,#23HDS023: CALL DS_DELAYJMP DS020;-------------------------------------------DS03: CALL DS_DELAYJNB K3,$DS030: CALL DS_CHULIJNB 0AH,DS03_1MOV 5CH,7FH ;送入熄灭符JMP DS03_2DS03_1: MOV 5CH,74H ;送实时值DS03_2: MOV R0,#58HLCALL DS_SPMOV R0,#58HLCALL DS_DISPLAYJNB K3,DS04JNB K1,DS03AJMP DS030DS03A: CPL 20H.1 ;报警标记取反JNB 20H.1,DS031MOV 4AH,#01H ;报警标记=1,允许报警AJMP DS032DS031: MOV 4AH,#00H ;报警标记=0,禁止报警DS032: LCALL DS_DELAYJMP DS030;--------------------------------------------DS04: CLR TR0CLR 0AHCALL BEEP_BLLCALL DS_DELAYRET;=============================================;定时时间数据处理子程序;=============================================DS_CHULI: ;004MOV A,48H ;处理分数据ANL A,#0FHMOV 58H,AMOV 70H,AMOV A,48HANL A,#0F0HSWAP AMOV 59H,AMOV 71H,AMOV A,49H ;处理时数据ANL A,#0FHMOV 5AH,AMOV 72H,AMOV A,49HANL A,#0F0HSWAP AMOV 5BH,AMOV 73H,AMOV A,4AH ;处理定时标记ANL A,#01HMOV 5CH,AMOV 74H,ARET;================================================== ;定时时间查表取数子程序;================================================== DS_SP: ;MOV R0,#58H ;005MOV R3,#05HDS_SP1: MOV A,@R0MOV DPTR,#TAB_NUMOVC A,@A+DPTRMOV @R0,AINC R0DJNZ R3,DS_SP1RET;================================================== ;定时时间显示子程序;================================================== DS_DISPLAY: ;006;MOV R0,#58H ;取得设定显示单元首地址MOV R1,#07FH ;从第一个数码管开始MOV R2,#07H ;共7个数码管DSPLAY: MOV P0,@R0 ;获得当前单元数据MOV A,R1MOV P2,A ;数码显示JB ACC.5,DSLP1 ;第三位数码管显示“-”MOV P0,#0f7HJMP DSLP3DSLP1: JB ACC.2,DSLP2 ;第六位数码管显示“-”MOV P0,#0f7HJMP DSLP3DSLP2: INC R0DSLP3: MOV A,R1 ;为下一个数准备RR A ;下一个单元MOV R1,A ;保存LCALL DELAYDJNZ R2,DSPLAY ;重复显示,直到全部数据刷新过RET ;返回;================================================== ;实时时间与设定时间比较子程序;20H.0 止闹标记,=0,允许,=1,禁止。

相关文档
最新文档