什么是数码管动态显示
本实验中使用的实验卡的资源电路图如下:P0端口是一个段代码,在低级别上有效。P2 端口是位代码,高级别是有效的。
P2 .0端口控制第一个数字管,直到P2 .7 端口控制第八位。
该卡的段代码表如下:每个数字管的片段代码是从P0端口输出的,即从任何数字管输入的段代码都是相同的。
由于视觉停留,只要我们的延迟时间足够短,数字显示器就可以非常稳定且清晰。
该过程在下面显示。
上述方法和想法写如下:org0000h start:mova,#08 H; 0; 段代码movp0,movp2 ,#01 H; 位代码lcalleay_1 ms mova,#0ABH; 1 movp0,一个movp2 ,#02 H lcalleay_1 ms movama,#1 2 H; ,#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。
ljmpstart delay_1 ms:movr6 ,#2 临时:movr5 ,#0ffh djnzr5 ,$ djnzr6 ,temp ret下载它在板上下载,以将测试结果从0到7 (包括点)从低点到高。
★上述方法将值分配给P0或P2 一个接一个地。
如果要更改显示的数字,更改程序非常有问题。
因此,我们必须在5 1 微控制器:表 - lookup方法中使用常用方法。
例如,如果我们在P0端口上输出段代码,则可以在表中指定段代码,然后每次将其取出该表格,然后将其发送到P0端口。
如果您在P2 端口中输出比特编码,则可以将BIT代码插入其他表中,并每次将其取出该表格并将其发送到P2 端口。
如果要更改显示的数字,则只需更改表中的数字即可。
ORT0000H启动:MOVR7 ,#0FFH; R7 ,R6 查找表格时,将发送到索引寄存器。
它是否达到左侧的数字,即第八位代码ajmpstart Play1 :; 段段-Code -code -code -code -unterRoutine - +dptr; 基本地址寄存器加上索引寄存器地址movp0,ret play2 :; h,2 4 h,04 h,0aah; 段代码表2 :DB01 H,02 H,04 H,08 H,1 0H,8 H,4 0H,8 0H; ----------------------------------------------- at gated p2 .0 port digital tube unsignedchodedis_code [1 1 ] = {0x08 .0xab, 0x1 2 .0x2 .0xa1 , // 0.1 .2 .3 .4 0x2 4 .0x04 .0xaa,0x00.0x2 0x2 0 /// 5 ,6 ,6 ,7 ,7 ,7 ,7 ,7 ,7 ,8 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 _buf在缓冲区基础地址中变为unsigned cupyatadis_index; // DIS显示索引,当前显示的数字管和缓冲区VoidMain(){p0 = 0xff; //所有数字关闭p2 = 0x00; _code [6 ]; dis_buf [7 ] = dis_code [7 ]; 前任]; //段代码发送p0端口p2 = dis_digit; //选择位(即H. BITCODE)delayms(1 ); // delay dis_digit = _crol_(dis_digit,1 ); //位门在左侧移动,下一次下一个位索引++; //接下来的sects codedis_index&= 0x07 ; } voiddelayms(unsignedcharms)//延迟子序列(Crystal 1 2 m){unsignedChari; 写回一般形式:dis_index = dis_index&0x07 此方法非常新。
在第一个循环之后,dis_index 00001 的值为,并且在操作后,该值保持不变,并且操作后的值为0x01 可以用(dis_index == 8 )dis_index = 0代替此句子,效果是相同的。
★如果使用上述方法C5 1 的段代码段代码放置在数组dis_code [1 1 ]中,然后在程序中要访问的值是通过buffer Array dis_buf [],因此可以使用索引(Offset)访问它。
这看起来有些复杂,但是他的想法很清楚,结构很清楚,而且通用性且易于扩展。
★此外,它们仅扩展了程序的延迟,例如: B.延迟(1 000),然后下载到董事会。
------------------------------------------------------------ iS_digit; // BIT -GATE值转移到P2 端口以实现当前数字管的值。
0.0x2 0.0xff}; // 5 ,6 ,7 ,8 ,9 ,来自unsignedchardatadis_index; //显示的索引,用于偏移当前显示的数字管和缓冲区voidmain(){p0 = 0xff; //关闭所有数字代码管P2 = 0x00; 在左侧显示下一个dis_index ++; 程序(Crystal 1 2 m){unsignedChari; 结果始终可能会不正确地接收:从0到2 的三位数字显示三个8 ,第三位数字显示了7 个数字,未显示较高的四位数。
延迟的延伸刻有发现没有错误,我对Keil的调试并不熟悉。
[2 006 .5 .2 ]找出原因,补充:今天,我再次看一下它,找出上述错误在哪里。
在这一点上,我想将dis_index的值用作位代码,即,如果第一个位0显示,则段代码dis_code [0],即dis_index 0的值,此时的位代码值为1 如果第二个位1 显示段代码dis_code [1 ] 时间。
因此,我只使用1 个操作的添加来将端口P0的偏移值连接到端口P2 的位代码。
但是,如果您仔细考虑了位代码的原理,那么上述方法显然是进一步的一步,您将理解它。
所以出了点问题。
实际上,存在这种对应关系,但不仅会添加1 位代码应为2 的DIS_INDEX性能。
这意味着:0--1 1 --2 2 -4 3 --8 4 --1 6 …动力操作函数floatpow(floatx,floaty)包含在数学中。
并且发现仍然存在问题,即如果延迟很小,则显示为混乱。
但是,如果增加了延迟时间(例如程序中的值),则可以看出数字管已正确显示。
此外,该方法生成的代码代码也很大(从写作速度可以看出)。
这里只提出一个想法,它仅适用于本实验,这并不重要,因此仅此而已。
[补充 结尾] - - - - - - - - - - - - - - - - - - - - - - - - ------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------ s.h> //包含左-WING SWITCHING函数_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; BT0溢出中断-pre lanis dis_buf [0] = dis_code [0x0]; x5 ]; dis_buf [6 ] = dis_code [0x6 ]; pt1 //计时器0中断用于数字管的动态扫描0端口p2 = dis_digit; // /位代码发送p2 端口dis_digit = _crol_(dis_digit,1 ); //位-gate值向左移动,下一个中断时,下一个数字管被中断,dis_index ++。
时钟振动频率的2 如果晶体Zillator为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 ,它转换为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 也在考虑这个问题的原因,我应该使用2 1 6 计数的起始值=中断间隔(2 1 6 -1 )-Count输出值=中断间隔。
这意味着6 5 5 3 5 H = 1 1 1 1 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连接显示为灰色,即高电阻。
C语言单片机代码 数码管动态显示
1 6 个元素代表了微控制器编程程序中1 6 到9 个部分的组成部分。尤其是这些部分代码的这一部分用于设置数字管上每个部分的光条件。
例如,图表的适用元素为0xt06 ,它变为二进制数和十六进制数字。
00001 1 0B。
该二进制数适用于DP,G,F,E,D,D,C,C,B和数字管的包裹包裹的喷雾剂。
因此,按第2 部分和C在公共负数数字管中显示1 号。
对于其他分段证明的其他段代码,在其他零件代码中,可以在此数字管上的数字管上的数字管上的该数字管上的哪个组件确定该数字管中的哪个组件。
例如,与表相关的元素可以使用0x09 ,可用于以这种方式以不同的零件或字符显示不同的部分或字母。
该程序通常在微控制器项目中找到。
通过存储每个数组的段代码,易于理解数字管的变化显示。
例如,与表相关的元素为0x0d并将其传输到二进制数,比较DP,F,E,C,C,C,C,C,b。
其他数字和字符的组成部分可以通过将变化转换为过渡来决定。
在这里,应该注意的是,该段代码设置为通用数字管。
常见的积极数字管将有所不同。
常见的阳性数字管将与较低的水平相匹配。
因此,使用实际程序中使用的段代码的定义。
根据数字管类型。
为了合并,您可以通过在数组中设置一个记录代码来理解数字管的动态显示。
它不仅改善了程序的可读性和维护,而且还可以简化数字管的逻辑。