什么是数码管动态显示
本实验中使用的实验板的资源电路图如下:其中P0端口是一个段代码,在低级别上是有效的。P2 端口是位代码,高级别是有效的。
P2 .0端口控制第一个数字管道到P2 .7 端口,控制了第八个。
该板的片段COD表如下:每个数字管的段代码都是从P0端口发送的,即,从每个数字管道输入段代码是相同的。
动态屏幕可以使用。
在视觉逗留中,只要我们的延迟时间足够短,数字屏幕就可以非常稳定且清晰。
该过程在下面显示。
上述方法和想法写如下:org0000h start:mova,#08 H; 0; 段代码movp0,movp2 ,#01 H; 位代码LCALLDELAY_1 MS MOVA,#0ABH; 1 movp0,一个movp2 ,#02 H lcalldelay_1 ms mova,#1 2 h; 2 movp0,一个movp2 ,#04 H lcalldelay_1 ms mova,#2 2 H; 3 movp0,a movp2 ,#08 h lcalldelay_1 ms mova,#0a1 h; 4 movp0,一个movp2 ,#1 0H lcalldelay_1 ms mova,#2 4 H; 5 movp0,一个movp2 ,#2 0H lcalldelay_1 ms mova,#04 H; 6 movp0,一个movp2 ,#4 0H lcalldelay_1 ms; Mova,#0aah; 7 MOVP0,A MOVP0,#0AAH; 我觉得使用此短语和以上两个句子以相同的方式实现,此习惯在将来可以在Movp2 ,#8 0H lcalldelay_1 ms ljmpstart delome_1 ms:movr6 ,#2 temp:movr5 ,#0ffh djnzr5 ,#0ffh djnzr5 ,#2 它是向董事会获得的,以获得八个$的测试结果 DJNZR6 ,Temp ret将其下载到板上,以分别从低屏幕到高屏幕0到7 分别从八个$ DJNZR6 数字获得测试结果(包括点)。
★该方法超过将值连续分配给P0或P2 如果要更改显示的数字,更改程序非常麻烦。
因此,我们需要在5 1 微控制器中使用经常使用的方法:表查找方法。
例如,当我们在P0端口上发送片段代码时,我们可以添加要在表中显示的段代码,然后每次从该表中获取数字并将其发送到P0端口。
当您在P2 端口上发送BIT代码时,您可以在另一个表中添加要使用的位代码,并每次从该表中获取数字并将其发送到P2 端口。
这样,如果要更改显示的数字,则只需要更改表中的数字即可。
org0000h启动:movr7 ,#0ffh; r7 ,r6 查找表格时,它将发送到索引寄存器A(因为添加1 后为0,因此是预设FFH)movr6 ,#0ffh loop:lcallplay1 ; CallPlay1 ; CallPlay子例程显示段代码LCALLPLAY2 ; 呼叫播放显示BitCode subroutine lcalldelay_1 ms cjnea,#8 0H,loop; 它是否达到左数,也就是说,第8 位代码ajmpstart Play1 :; 搜索表并查找段代码子例程; Mova,R7 ; 印加; movr7 ,a reg7 ; R7 ; 这里是索引寄存器movdptr,#table1 ; +dptr; 基本寄存器加索引寄存器地址movp0,re ret play2 :; 表搜索表BitCode子例程(原理与Play1 相同)Mova,R6 Inca Movr6 ,A MovdPtr,#Table2 Movca,@A+Dptr movp2 ,ret table1 :db08 h,0abh,0abh,1 2 h,1 2 h,2 2 ,2 2 ,2 2 ,2 2 ,2 4 1 h,2 4 h,2 4 h,2 4 h,2 4 h,2 4 h,2 4 h,2 4 h,2 4 h,2 4 h, 0aah; 段代码表2 :DB01 H,02 H,04 H,08 H,1 0H,2 0H,4 0H,8 0H; 位代码表延迟_1 MS:MOVR5 ,#02 H; 延迟1 MS子例程温度:MOVR4 ,#0FFH DJNZR4 ,$ DJNZR5 ,TEMP RETT将其延迟到董事会以确认并获得预期的结果。
----------------------------------------------------------------------------- -------------------------------------------------------------------------- --------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------- ------ ------------------------------------------------------------------------- ----------------------------------------------------------------------------- -------------------------------------------------------------------------- ----------------------------包括
,//如果等于0x01 ,当数字管道P2 .0连接到USignerTcharcodedis_code [1 1 ] = {0x08 .0xab,0x1 2 ,0x2 2 .0xa1 ,// 0x1 2 ,0x2 2 .0xa1 ,// 0.1 ,2 ,3 ,4 0x2 4 0x2 4 ,0x04 ,0x04 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x2 0.0xff}; (){p0 = 0xff; //关闭所有数字绳索P2 = 0x00; ] = dis_code [4 ]; 0; //当前位移为0,而(1 ){p0 = dis_buf [dis_ind ex]; //段代码发送p0端口p2 = dis_digit; //选择位(IE BITCODE)延迟(1 ); // delay dis_digit = _crol_(dis_digit,1 ); //位门向左切换,第二个Strobe dis_index ++的下一点; //下一个段代码dis_index&= 0x07 ; //请参阅注释}}无效的所有管道,返回第一个开始下一次扫描。
写回常规形式:dis_index = dis_index&0x07 此方法非常新。
例如,在第一个循环之后,dis_index 0000001 的值是0x07 的值保持不变,仍然是0x01 直到值增加。
可以用(dis_index == 8 )dis_index = 0代替此句子,效果是相同的。
★当通过上述方法实现C5 1 时,将段代码放置在数组dis_code [1 1 ]中,然后通过BufferArraray dis_buf []加载要在程序中调用的值,以便订阅(OFFSET)可以使用。
这看起来有些复杂,但是这些想法很清楚,结构很清晰,而且通用性且易于扩展。
★此外,只需扩展程序的延迟,例如延迟(1 000),然后下载到板上,您可以看到数字管实际上从低到高点出现。
----------------------------------------------------------------------------- -------------------------------------------------------------------------- --------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------- ------ ------------------------------------------------------------------------- ----------------------------------------------------------------------------- -------------------------------------------------------------------------- ------------------------------在订阅中标记为0到7 的值,而没有设置缓冲区阵列dis_buf []是实现如下:#include
0x2 2 ,0xa1 ,// 0.1 ,2 ,3 ,4 0x2 4 ,0x04 ,0xaa,0x00.0x2 0.0xff}; // 5 ,6 ,7 ,8 ,9 ,在USIGNEDCHARDATADIS_INDEX上; //显示索引,用于识别其位移目前的索引显示数字管道和缓冲区voidmain(){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 ; // BitCode发送P2 端口延迟(1 ); 0当第二个位置显示三个8 时,第三位数字显示了七个数字,而较高的四位数没有出现。
位观察后的扩展延迟部分发现没有故障,我对Keil错误搜索并不熟悉。
[2 006 .5 .2 ]找出原因,补充:我今天再次看了一下,发现上述错误在哪里。
当时,我想将dis_index的值用作位代码,也就是说,当第一个位显示0时,段代码为dis_code [0],也就是说,dis_index的值为0,并且位代码该值目前为1 当另一个位显示1 时,段代码为dis_code [1 ],dis_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 功率操作函数floatpow( floatx,floaty)包含在Math.h中,返回值为XY(float类型):for(dis_index = 0; dis_index <8 ; dis_index ++){p0 = dis_code [dis_index]; //段代码发送p0端口p2 =(char)pow(2 ,dis_index); // BitCode发送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 ,作者:usignetchardatadis_buf [8 ]; // dis_buf出现在缓冲区基础地址USIGNERTHARDATADIS_INDEX中; //显示索引,用于识别当前显示数字管道和缓冲区voidmain(){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 ); //循环等待中断} void hours0()interu pt1 //小时0中断服务程序,用于数字管的动态扫描{th0 = 0xfc; //发生中断时间/计数重新安装初始值TL0 = 0x1 7 ; //我觉得(及以上)应该是0x1 8 ,而不是1 7 个分析P2 = 0x00; //修复所有数字管p0 = dis_buf [dis_index]; //段代码发送p0端口p2 = dis_digit; // /位代码发送P2 -pport dis_digit = _Crol_(dis_digit,1 ); //位端口值向左移动,下一次中断将中断时,下一个数字管道连接到下一个数字管道dis_index ++; = 0x07 ; //通行证后扫描所有8 个数字管道,返回第一个开始进行下一次扫描}★计时器/计数器的入口脉冲周期与机器周期相同,即时钟转频的1 /1 2 。
当晶体振荡器为1 2 m时,入口脉冲周期间隔为1 U。
机器周期为1 U。
假设T0的原始值为X,是计算原始值的方法:在此示例中,计时器使用方法1 ,即1 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 ,即第一个值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 位二进制不能代表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 1 1 1 b,也可以说,6 5 5 3 6 是通过溢出来实现的6 5 5 3 6 当响应中断时,钥匙就会变成。
以上面的示例为例,如果起始值为6 4 5 3 5 (FC1 7 ),则计数为6 5 5 3 5 ,则计数为1 000,即1 ms,但目前没有溢出。
也没有触发中断。
它仅在下一个计数之后发生。
确切的值应为1 001 U。
如果起始值为6 4 5 3 6 (FC1 8 ),则正是所需的值,则上面示例中的原始值应为FC1 8 而不是FC1 7 这只是我自己的看法。
----------------------------------------------------------------------------- -------------------------------------------------------------------------- --------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------- ------ ------------------------------------------------------------------------- ----------------------------------------------------------------------------- -------------------------------------------------------------------------- ---------------------------------- ###################### ograph #### ####### ograph #######################也就是说,先前与段代码的连接。
此外,这八个数字模拟的数字管的左端是第一个位置,右端是第八位,与板上的顺序相反,因此为了统一,该数字是基于数字的。
在板上。
上图还可以模拟结果而不添加草稿电阻,但是P0门的高水平显示为灰色,即高电阻。
led数码管六位动态显示时分秒,有一位不亮,其他都正常,而且1-9数字中有一位数字动态显示不出来
在遇到一分钟和第二个动态显示Dignit Digital Tube时,如果无法显示该数字,则首先必须确认是否无法显示所有数字。如果可能是这种情况,则是因为相应的数据数字管错误或电路数字管的问题作为选定的管子的段。
如果您没有很多人可以显示,那么这是一些读取行连接或位阅读信息的问题,并且选择了一些课程。
确认所有线条和数据正确之后,如果您不能显示您,则数字管可能会损坏。
此外,如果未点亮数字管,您还需要检查驱动器信息和硬件连接。
如果您确认其中没有一个是错误的,并且数字管并没有显示任何要损坏的数字管。
通常,问题通常不是照明,因为未选择本地阅读。
当解决问题时,您可以在步骤中进行测试,从最基本的驱动器信息和线路连接开始,然后逐渐故障排除可能是故障点。
如果恐惧后可以解决问题,则可以考虑将新的数字管替换为显示功能是正常的。
患者和细致的检查对于与SO问题的相互作用非常重要。
采取所有步骤以准确解决真正的问题。
如果问题持续存在,建议检查提供连接和电源正常的机会,无论电源电压稳定,无论是内部电路数字管是否完好无损。
有时,功率问题也会导致数字管或正常解决。
简而言之,LED数字管显示的问题需要检查许多角,包括驱动器数据,硬件连接,商店等,以解决故障的原因以一种方式找到真正的问题。
什么是数码管动态显示
数字管道的动态显示是微控制器中最常用的显示方法之一。g,dp“连接在一起,并在每个数字管的通用马球com中添加一个门的控制电路。
门位由每个独立的I/O线控制。
当微控制器发出Glyph代码时,所有数字管道都会接收相同的glifo。
只要我们打开必须显示的数字管门的控制,钻头就会显示出雕文,并且没有选择数字管不会点亮。