为什么数码管一般采用动态显示
动态显示技术(也称为扫描显示)是最大的旨在减少所需YO端口数量的数量。8 8 8 * 8 矩阵作为模型,以这种方式,不仅可以在7 段和小数点之间工作1 6 YO端口,以驱动8 7 段的数字瘘管。
如果使用扫描技术,则驱动相同的数字管需要6 4 1 YO端口,显然是单扇。
具体而言,动态显示的工作再次点亮了多个数字管,允许最快地显示出适当的,因此让人们的幻觉同时显示所有数字。
例如,如果我们在8 个数字管中显示数字,我们可以点燃第一个数字管以显示数字,并在第二个数字管中快速转动,并在另一个数字中进行视觉效果,并在另一个数字中重复重复,我们可以看到一个数字。
该技术不仅降低了硬件成本,而且还可以提高系统灵活性。
由于动态显示技术,微控制器端口的需求可以有效地减少,这对于资源有限的嵌入式系统尤为重要。
此外,动态显示还可以在编程到滚动显示,闪烁效果等方面实现各种通用显示效果。
但是,动态显示也有局限性。
由于需要快速切换数字管,因此这是高度需要系统的响应速度。
如果显示频率不够高,则可以完成闪烁或不连续性。
此外,动态显示的实施通常需要一些编程技能,可能需要更多时间来了解初学者的所有者。
但是,动态显示技术在许多领域仍然是实用且有效的,主要是资源造成的应用程序。
通过优化的设计和合理的编程,我们可以最大限度地提高自己的优势并实现高效且灵活的数字显示效果。
什么是数码管动态显示
本实验中使用的实验板的资源电路如下。在这里,P0端口是一个段代码,在低级别上有效。
P2 端口是位代码,高级别是有效的。
P2 .0端口控制第一个数字管,直到P2 .7 端口控制第8 端口。
该委员会的段代码表如下: 每个数字管的段代码是从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 ,一个movp2 ,#04 h lcaltdelay。
,#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,一个movp0,#0aah; s ljmpstart delay_1 ms:movr6 ,#2 临时:movr5 ,#0ffh djnzr5 ,$ djnzr6 ,temp ret板,以将测试结果(得分)达到(得分)至(得分)。
★上述方法通过将值分配给P0或P2 来提高程序的复杂性,另一方面,程序的灵活性。
要更改编号的数字,更改程序非常烦人。
因此,5 1 微控制器:您必须使用表查询方法中常用的方法。
例如,当您在P0端口中打印段代码时,您可以在表上显示段代码,然后每次从该表中获取数字并将其发送到P0端口。
当您从P2 端口打印位代码时,您可以将BIT代码放在另一个表上,并每次从该表中获取数字并将其发送到P2 端口。
要以这种方式更改显示的数字,您只需要更改表的数量即可。
org0000h启动:movr7 ,#0ffh; 如果您查看R7 和R6 表,则将发送到索引寄存器A(因为添加1 后添加1 )MOVR6 ,#0FFH循环:lcallplay1 ; CallPlay2 ; CallPlay位代码SubRoode lcalldelain_1 ms CJNeo,#8 0H,#8 0H,#8 0H, 是否达到最左边的数字,也就是说,第8 位代码ajmpstart Play1 :; 搜索表段代码子例程 - +dptr; 基本地址寄存器加索引电阻MOVP0,ret Play2 :; 表搜索表BIT代码子例程(原理与Play1 相同)Mova,R6 Inca Movr6 ,A MovdPtr,#Table2 Movca,@+DPTR MOVP2 ,RET表1 :DB08 H,0ABH,2 2 H,2 2 H,0A1 H,0A1 H,2 4 H,2 4 H,04 H,04 H,04 H,04 H,04 H,04 H,04 H,04 H,04 H,04 H,04 H,04 H,04 H,04 H,04 H,04 H,04 H,04 H,0 0aah; 段代码表2 :DB01 H,02 H,04 H,08 H,1 0H,2 0H,4 0H,8 0H,8 0H; 位代码表延迟_1 ms:movr5 ,#02 H; ding 1 ms子例程温度:movr4 ,#0ffh djnzr4 ,$ djnzr5 ,按预期下载。
--------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------- 门控P2 .0端口数字管UnignedCharcodedis_code [1 1 ] = {0x08 ,0xAb,0x1 2 ,0x2 2 2 2 2 2 ,0xa1 ,// 00x2 4 ,0x04 ,0xaa,0x00,0x2 0,0xff}; // 5 ,6 ,9 ,8 ,9 ,undeedchardis s_buf显示在缓冲区基础地址中,目前显示数字管和缓冲区voidmain(){p0 = 0xff; // unsignedchardatadis_index用于关闭所有数字; // display index; dis_buf [1 ] = dis_buf [2 ]; uf [6 ] = dis_buf [7 ] = dis_digit = 0x01 ; //当前偏移量为0 {p0 = dis_ind ex]; //发送发送段代码的p0端口p2 = dis_digit。
//功能位(即,位代码)延迟(1 ); // ding dis_digit = _crol_(dis_digit,1 ); //当位门移动连接到左侧并且连接下一个门时,dis_index ++; // 0x07 ; 0x07 ; 0x07 ; } voidDelayms(unsignedcharms)//延迟子程序(Crystal 1 2 m){unsignedCharri(ms-){此句子扫描所有八个数字管,然后启动下一次扫描。
重新写入常规形式:dis_index = dis_index&0x07 此方法非常新。
他第一次知道,十六进制07 的07 在二进制中为000001 1 1 ,因此可以通过任务控制循环。
例如,在第一个循环之后,_index的值为0000001 ,在操作之后 0x01 在第二个循环中,其值为0x02 ,在相同的循环之后 但是,在循环再次是后,值为0x8 0,在相同的循环后,它将是0x00,这再次是原始循环。
可以用(dis_index == 8 )dis_index = 0替换此句子,并且效果相同。
★使用上述方法实现C5 1 时,将段代码放置在数组dis_code [1 1 ]中,并且可以通过缓冲区阵列dis_buf []加载程序中要调用的值以作为adder(offset)访问它。
这看起来有些复杂,但是这个想法很清楚,结构很清楚,多功能且易于扩展。
★另外,如果您的程序延迟很长,例如延迟(1 000)并将其下载到板上,则可以看到数字管实际上在低位置很高。
--------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------- is_digit; //位GATE值发送到P2 端口以进行当前数字管。
GATE P2 0端口数字管是UnignedCharcodedis_code [1 1 ] = {0x08 ,0xAb,0x1 2 ,0xa1 ,// 0x4 ,0x 4 ,0x 4 ,0x 4 ,0x 4 ,0x 4 ,0x 4 ,0x 4 ,0x 4 ,0x 4 ,0x 4 ,0x 4 ,0x 4 0x2 0,0xff}; // 5 ,6 ,7 ,8 ,9 ,unsignedchardatadis_index; //显示索引,偏移和缓冲区voidmain(){p0 = 0xff; //关闭所有数字。
代码管P2 = 0x00; //当前偏移量为0 dis_digit = 0x01 // strobe p2 .0 while(1 ){p0 = dis_code [dis_index]; 下次,该程序将下次给出dis_index(Crystal 1 2 m){MS--){i = 0; 我<1 2 0; i ++)★(dis_index = 0; dis_index <8 ; dis_index ++) 从0到2 的三位数是7 、7 、7 、7 和4 位数字。
没有发现扩展延迟的位观测值,也不熟悉Keil调试。
[2 006 .5 .2 ]查找并添加原因。
今天再一次我看了看它,发现上述错误在哪里。
当时,我想将dis_index的值用作位代码。
也就是说,当显示第一个位时,段代码为dis_code [0],也就是说,dis_index的值为0,位代码值当前为1 如果第二位显示1 ,则段代码为dis_code [1 ],dis_index为1 ,当前的位代码值为2 因此,我只是添加了一个任务,将端口P0的偏移值连接到端口P2 的位代码。
但是,如果您仔细考虑位代码的原理,如果您更澄清一步,则第三位可以理解dis_code [2 ]。
所以有问题。
实际上,这种信件的关系存在,但不仅仅是添加1 位代码必须是2 的dis_index幂。
IS: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 ++){dis_index]; 而且仍然存在一个问题,也就是说,当延迟很小时,显示器会感到困惑,但是当延迟时间增加时,数字管将正确显示。
此外,此方法生成的代码量也很大(以写作速度清晰)。
这里只提出了一个想法,仅适用于该实验,这几乎没有意义。
[补充 结尾] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------ --------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------ --------------------------------------------------------------------------------------------------- s.h> //左移函数_crol_()unsignedchardatadis_digit; //位GATE值发送到P2 端口以进行当前数字管。
3 ,4 0x2 4 ,0x04 ,0xaa,0x00,0x2 0,0xff}; // 5 ,6 ,7 ,8 ,9 ,在unsignedchardatadis_buf [8 ]; // dis_buf显示在unsignedchardatadis_index中的“缓冲区基础地址”中。
){p0 = 0xff; //关闭所有数字管P2 = 0x00; // 000000001 B正时计数计数器0是模式1 ,1 6 -位计时器/计数器th0 = 0xfc; 1 0BT0溢出dis_code [0x0] = dis_buf [0x1 ]; x5 ]; disbuf [6 ] = dis_buf [7 ] = dis_code [0x7 ]; PT1 //计时器0停止用于数字管动态扫描的服务程序。
{th0 = 0xfc; //中断时间发生。
初始值TL0 = 0x1 7 ; //我认为以上(上)应为0x1 8 S P0端口p2 = dis_digit; // /位代码是p2 port dis_digit = _crol_(dis_digit,1 ); //当比特盖值向左移动并且下一个中断被中断时,当它干扰dis_index ++时会有一个gade。
如果晶体振荡器在时钟振动频率中为1 2 m,则输入脉冲周期间距为1 U。
机器周期为1 U。
假定T0的初始值是X,这是计算初始值的方法。
换句话说,最大值为2 1 6 = 6 5 5 3 6 如果要延迟1 ms或1 000US,则可以获得X = 6 4 5 3 6 ,如果您的公式2 1 6 -X = 1 000,则使用FC1 8 转换为1 6 个十六进制。
换句话说,计时器开始计算为6 4 5 3 6 ,1 ,000个计数后的值为6 5 5 3 6 多于在示例中,加载的初始值是FC1 7 (6 4 5 3 5 ),而不是FC1 8 (6 4 5 3 6 )。
也许我考虑了为什么计数范围为0〜6 5 5 6 5 的问题。
,즉,6 5 5 3 5 H = 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 B,6 5 5 3 6 은오버플로에얻어말할수수。
回应中断是关键。
上面的示例没有中断,因为当它为6 4 5 3 5 (FC1 7 )时,即1 ms,即溢出。
它仅在下一个计数之后发生。
确切的值必须为1 001 U。
如果初始值为6 4 5 3 6 (FC1 8 ),则上述示例的初始值必须是FC1 8 而不是FC1 7 这只是我的看法。
--------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------- 此外,此8 位模拟数字管的左端是第一个位置,右端是第八位,这是与董事会相反的第8 个位置。
因此,为了统一性,它是根据董事会连接的。
上面的图可以模拟结果而不会增加完全电阻,但是高水平的P0端口标有灰色,即高电阻。
单片机的哪个端口负责动态数码管段码
段代码页面上的端口负责数字管段的动态代码。带有芯片的动态数字管有两个端:com端和段的末端。
在动态数字管中指定了段代码值之后,COM列式必须共同启动数字管。
微控制器:(MicroController),也称为微控制器,由中央处理器,内存,输入和输出运动(包括并行E/A,序列E/A,序列E/A,类似于数字化的转换器),计时器和计数器以及集成的集成数字处理功能。
什么叫动态数码管?
以通用的积极数字管为示例动态显示驱动器②动态观看驱动器:数字管的动态观看接口是来自其独立I/O线的受控微控制器微控制器中最常用的显示方法之一。通过依次检查每个数字管的COM,每个数字管依次控制,这是一个动态指南。
在旋转显示过程中,每个数字管的照明时间为1 至2 ms。
功率更少。
数字管由7 个光排放二极管组成,文件形成阳光形状。