什么是数码管动态显示
实验中使用的实验卡资源资源方案如下:其中P0端口是一个段代码,在低级别上是有效的。P2 端口是位代码,高级别是有效的。
P2 .0门检查第一个数字管,直到P2 .7 端口检查第八个。
此选项卡的片段代码的表如下:每个数字管的片段代码都离开P0端口,即输入每个数字管的段代码是相同的。
动态显示可以使用。
对于视觉客厅,只要我们的延迟时间很短,数字显示似乎很稳定且清晰。
该过程如下所示。
上面的方法和思想写如下:org0000h start:mova,#08 H; 0; movp0段代码,一个movp2 ,#01 H; 位代码lkaldelay_1 ms mova,#0abh; 1 movp0,一个movp2 ,#02 H lcalldeledelay_1 ms mova,#1 2 h; 2 movp0,一个movp2 ,#04 H lkaldelay_1 ms move,#2 2 H; 3 movp0,一个movp2 ,#08 h lcalldelay_1 ms move,#0a1 h; 4 MOVP0,A MOVP2 ,#1 0H lkaldelay_1 ms Mova,n。
2 4 H; 5 movp0,一个movp2 ,#2 0H lcalldeledelay_1 ms mova,#04 H; 6 movp0,一个movp2 ,#4 0H lkaldelay_1 ms; Movi,#0aah; 7 MOVP0,A MOVP0,#0AAH; 我觉得使用这句话和以前的两个短语以相同的方式实现,这种习惯在将来的movp2 ,#8 0H lkaldelay_1 mms ljmpstart delay_1 ms:movr6 ,#2 temp:movr5 ,#0ffh djnzr5 ,#0ffh djnzr5 ,$ djnzr5 ,$ djnzr6 ,$ djnzr6 ,$ djnzr6 ,$ djnzr6 ,$ djnzr6 ,$ djnzr6 ,$ djnzr6 ,$ Temp ret下载以建议从第八个数字中获得测试结果 低 - 高的显示器分别为0到7 (包括点)。
★上述方法将值分配给P0或P2 一个接一个地。
如果要更改显示的数字,更改程序非常有问题。
因此,我们必须使用表5 1 搜索方法中常用的方法:搜索表的方法。
例如,当您通过P0门上的段代码时,我们可以将段代码放在表中显示,然后每次从该表中获取数字,然后将其发送到P0门。
当您通过P2 门上的位代码时,您可以使用位于另一个表中使用的位代码,然后从该表中获取数字并将其发送到P2 门。
这样,如果要更改显示的数字,则只需更改表中的数字即可。
org0000h启动:movr7 ,#0ffh; R7 ,R6 查看表时,将发送到索引寄存器A(因为添加1 后为0,然后是预设FFH)movr6 ,#0FFH循环:lcallplay1 ; CallPlay1 ; CallPlay子例程显示段代码LCALLPLAY2 ; 呼叫播放视图BitCode subroutine lkaldelay_1 ms cjnea,#8 0H,loop; 它是否达到最左数,即第八位AJMPSTART PLAY1 代码:; 搜索表并找到子例程段代码; Mova,R7 ; 印加; movr7 ,a reg7 ; R7 ; 这是MOVDPTR索引寄存器,#Tabella; +dptr; base寄存器加索引地址movp0,一个ret play2 :; table search bitcode subroutine(原理与play1 相同),r6 inca movr6 ,a movdptr,#table2 spox RET Table1 :DB08 H,0ABH,1 2 H,2 2 H,0A1 h,2 4 h,04 h,0aah; 段代码表2 :DB01 H,02 H,04 H,08 H,1 0H,2 0H,4 0H,8 0H; 表位代码delay_1 ms:movr5 ,#02 H; 延迟1 MS子例程温度:MOVR4 ,#0FFH DJNZR4 ,$ DJNZR5 ,temp ret下载到卡上以检查并获得预期的结果。
------------------------------------------------------------------------------- ------------------------ ------------------------------------------------------------------------------- ------------------------ --------------------------------------------------------------------------------------------- include
,//如果等于0x01 ,当P2 .0端口的数字管连接到unsignedchacodelcodis_code [1 1 ] = {0x08 .0xab,0x1 2 ,0x2 2 .0xa1 ,// 0x1 2 ,0x2 2 .0xa1 ,// 0.1 .2 ,2 ,3 .4 0x2 4 .0x2 4 .0x04 ,0x04 ,0x004 ,0x004 ,0x004 ,0x004 ,0x004 ,0x004 ,0x00 xa .0x2 0.0xff}; (){p0 = 0xff; //关闭所有数字。
] = dis_code [4 ]; 0; //当前偏移量为0,而(1 ){p0 = dis_buf [dis_ind ex]; //发送P0代码P0 P2 = dis_digit; //选择位(即位代码)delayms(1 ); // delay dis_digit = _crol_(dis_digit,1 ); //左侧的shiftts栅极位,下一个strobo dis_index ++的下一点; //随后的段代码dis_index&= 0x07 ; //请参阅comment}}}} voidDelayms(unsignedcharms)//延迟子程序(1 2 m振荡器晶体){unsignedChari; 所有管道一次,回到第一个开始进行下一次扫描。
接近一般方式:dis_index = dis_index&0x07 此方法非常新。
例如,在第一个周期之后,dis_index的值为0000001 ,0x07 的值保持不变,仍然是0x01 直到其价值增加。
可以用(dis_index == 8 )dis_index = 0替换此句子,效果是相同的。
★当使用上述方法实现C5 1 时,其段代码将插入阵列dis_code [1 1 ],因此,在程序中要调用的值是通过AN数组缓冲区dis_buf []加载的,以便pendic(offset(offset) )可以使用。
看来有点复杂,但是它的想法很清楚,结构清晰,通用性且易于扩展。
★此外,只需将程序的延迟扩展为延迟(1 000)并在卡上下载,您可以看到数字管实际上从下方逐渐显示至最大值。
------------------------------------------------------------------------------- ------------------------ ------------------------------------------------------------------------------- ------------------------ ------------------------------------------------------------------------------- -------------------- 在7 处,它在Peice中标记,而没有设置缓冲缓冲区dis_buf [],实现如下:#include
0x2 2 ,0xa1 ,// 0.1 ,2 ,3 ,4 0x2 4 ,0x04 ,0xaa,0x00.0x2 0.0xff}; // 5 ,6 ,7 ,8 ,9 ,OffSignedCachardetAdis_Index; //索引显示,用于识别当前显示的数字管的偏移和voidmain buffer(){p0 = 0xff; //关闭所有试管P2 = 0x00数字; 该代码发送P2 延迟(1 ); 程序(1 2 m振荡器晶体){unsignedChari; dis_index <8 ; dis_index ++){p0 = dis_code [dis_index]; //段代码发送p0端口p2 = dis_index+1 ; //位代码发送P2 端口延迟(1 ); 0到达第二个位置的三位数字显示了三个8 ,第三个数字显示了7 个和未显示四个最高数字的数字。
对伸长延迟的观察没有发现错误,我对Keil的Debuggin并不熟悉。
[2 006 .5 .2 ]发现原因,补充:我今天看了一眼,发现了上述错误的位置。
当时,我想将dis_index的值用作位代码,或者当第一个位视图0时,段代码为dis_code [0],即dis_index的值为0,并且值为值为的位代码1 目前。
当第二位视图1 时,段代码为dis_code [1 ],ILdis_index的值为1 ,位代码的值现在为2 因此,我只是使用1 个操作的添加来将P0端口的偏移值与P2 门的位代码相关联。
但是,如果您考虑到位代码的原理,则上述方法显然是错误的。
dis_index值为2 ,添加1 后,它是3 遵循上述方法时,将此3 用作位代码,正确的位代码应为4 (000001 00B)。
所以出了点问题。
实际上,此通信报告存在,但不仅是添加1 位代码应该是2 的dis_index幂。
也就是说:0--1 1 -2 2 -4 3 -8 4 --1 6 la floatpow电源操作功能(floatx,floaty)包含在数学中,返回值为xy(floatType):for(dis_index = 0; dis_index <8 ; //发送p0端口p2 =(char)pow(2 ,dis_index)段; //位代码发送P2 端口延迟(2 5 5 ); 通过在卡上再次下载并发现仍然存在问题,也就是说,当延迟很小时,显示器是混乱的,但是如果延迟时间增加(如程序中的价值),您可以看到数字管正确显示。
此外,此方法生成的代码量也很大(从写作速度来看很明显)。
这里只提出了一个想法,并且仅适用于本实验,这几乎没有意义,所以这就是全部。
[补充的结尾] ------------------------------------------------------------------------------------- - ------------------------------------------------------------------------------ ----------------------------- - - - - - - - - - - - - - - - - - - - - - - - - - 参考更改为我的选项卡,程序如下:#include
] = {0x08 .0xab,0x1 2 ,0x2 2 .0xa1 ,// 0.1 .2 ,3 .4 0x2 4 .0x04 .0xaa,0x00.0x2 0.0xff}; // 5 ,6 ,7 ,8 ,9 ,OffSignedCachardadadis_Buf [8 ]; // dis_buf显示在unsnedchardadadis_index缓冲区的基础地址中; //显示索引显示索引索引索引显示,用于识别当前显示的数字管的偏移和voidmain buffer(){p0 = 0xff; //所有数字管的关闭p2 = 0x00; FC1 7 H = 6 4 5 3 5 d,2 1 6 -6 4 5 3 5 = 1 001 US = 1 MS IE = 0x8 2 ; // 1 000001 0bt0溢出dis_buf [0] = dis_code [0x0]; dis_buf [5 ] = dis_code [0 x5 ]; = 1 ; //启动T0时(1 ); //循环等待中断} voidTimer0()interu pt1 //计时器0中断服务程序,用于数字管的动态扫描{th0 = 0xfc; //中断时间发生/TL0 = 0x1 7 米的初始重新安装值; //我觉得这个(和上级)应为0x1 8 ,而不是1 7 ,如下分析p2 = 0x00; //更正所有数字管p0 = dis_buf [dis_index]; //段代码发送p0端口p2 = dis_digit; // /位代码发送p2 端口dis_digit = _crol_(dis_digit,1 ); //门位的值向左移动,下一次中断中断时,下一个数字管已连接到下一个数字管dis_index ++; = 0x07 ; //乘车后扫描了所有8 个数字管道,他返回第一个开始进行下一次扫描}★计时器/仪表的进入脉冲的时期与机器的时期相同,这是时钟振荡的频率。
当结晶振荡器为1 2 m时,输入脉冲循环的间隔为1 U。
机器的周期为1 U。
假设T0的初始值为X,是计算的方法初始值:在此示例中,计时器使用方法1 ,即1 6 位计时器或最大值为2 1 6 = 6 5 5 3 6 此值将发生溢出,从而导致中断并输入中断处理程序。
在这里,如果要延迟1 ms,即1 000US,则有2 1 6 -X = 1 000的公式,您可以获得X = 6 4 5 3 6 ,该X = 6 4 5 3 6 在FC1 8 中转换为HexadeCimal,这是初始值TH0 = 0xFC,TL0 = 0x1 8 也就是说,计时器开始计数从6 4 5 3 6 计数,其值是1 ,000个计数后的6 5 5 3 6 在上面的示例中,初始加载值不是FC1 8 (6 4 5 3 6 ),而是FC1 7 (6 4 5 3 5 )。
我认为这可能是计数间隔为0〜6 5 5 6 5 的原因,我也想到了这个问题,我不小心写了几本书,但是第一本书使用了更多,我认为第一个更合理,因为在计算机中1 6 -bit Track不能表示6 5 5 3 6 当所有位均为1 时,表示的值为6 5 5 3 5 ,即6 5 5 3 5 h = 1 1 1 1 1 1 1 1 1 1 1 1 1 b,也可以说6 5 5 3 6 是从溢出中获得的。
当回应中断时,将成为关键。
甚至没有激活中断。
它仅在下一个计数之后发生。
确切的值应为1 001 U。
如果初始值为6 4 5 3 6 (FC1 8 ),则正是所需的值,因此上面示例中的初始值应为FC1 8 而不是FC1 7 这只是我的看法。
------------------------------------------------------------------------------- ------------------------ ------------------------------------------------------------------------------- ------------------------ ------------------------------------------------------------------------------- -------------------- ################################以前的。
此外,这八个数字模拟的数字管的最左端是第一个位置,最右端是第八位,与卡上的顺序相反,因此出于统一性,它连接的数字根据理事会。
上图还可以在不增加牵引力的情况下模拟结果,但P0端口的高水平显示为灰色,即高电阻。
数码管动态扫描方案求解
如果计算方法是错误的,则每条管道标记3 ms,刷新仅为1 6 帧。正确的计算方法如下。
每个管道的刷新不会闪烁,但显示亮度略有降低。
结果是否希望与操作时间有很大不同,因此请勿过分接受。
为了准确计算执行时间,最好模拟编译器的仿真并更准确地运行它。
实现实时时钟在数码管上显示时间
该实验在与实时手表模块DS1 3 02 的应用有关的数字管上执行实时时钟显示时间,这是下一个接口的实时时钟芯片。CHIP通过简单的串行接口与微处理器进行通信,并在几秒钟,几分钟,小时,每天,日期,每月和一年中提供信息。
该芯片旨在以低功耗以低功率运行,数据和时钟信息保留在1 μs之内。
DS1 3 02 芯片使用同步通信,只需要三行即可连接:CE(选择),I/O(数据线)和SCLK(串行手表线)。
数据可以一次传输1 个字节,也可以在爆炸中传输3 1 个字节。
该芯片具有用于主电源和备份的双电动引脚,小型充电器罐程序和7 个字节添加了临时内存。
蓝色芯片单元上的MO -DS1 3 02 的图表显示了其与电路的连接关系。
日历寄存器是学习的关键,需要精通每个位的含义。
在Blue Bridge Cup Chip单元竞赛中,该官员将提供数据包,包括日历登记册,您可以通过参考注册指南获得详细信息。
在电路中,X1 和X2 电线连接到标准的3 2 ,7 6 8 kHz石英晶体,内部振荡器与晶体一起运行。
DS1 3 02 摩西在竞争表上的工作电路图显示了主要组件的布局。
了解DS1 3 02 芯片的内部框图对于实际活动非常重要。
在学习过程中,您需要掌握主要技能,例如阅读时间,编写初始价值并转换公式。
BCD代码转换为十进制是另一个重要点。
BCD代码和十进制数字之间的熟练转换公式对于MO -DS1 3 02 的准确操作非常重要。
当DS1 3 02 芯片与蓝桥杯唯一的芯片单元竞争时,它将正式提供相应的驱动程序,包括DS1 3 02 .C和DS1 3 02 .H文件。
DS1 3 02 .C文件包含控制代码。
主要注意阅读真实时钟,写作,转换和其他活动。
在显示实时时钟时间的代码中,有必要遵循模块设计的原理并将函数分为多个模块,例如创建,阅读时间,显示时间,等。
各种模型-DS1 3 02 .C,DS1 3 02 .H和Text.c提供了部署详细信息。
最终运行结果显示了显示时间并验证代码有效性的功能。
简而言之,在实时DS1 3 02 时钟模块的数字管上显示显示时间的实现包括许多链接,例如芯片原理,注册活动,BCD代码和小数转换。
了解并掌握基本知识和细节此活动是实现此功能的关键。
通过实验和代码实施,我们可以更好地了解DS1 3 02 和它的应用程序,以后为更复杂的项目奠定了坚实的基础。