跪求单片机实验四位七段数码管显示程序!!!
在研究微控制器编程时,数字管显示是一个常见的实验项目。以下是使用Vina Electronics ME3 00B微控制器的演示程序,在四位数的数字管上显示数字从1 到8 的数字。
该程序采用动态扫描技术来实现通过计时器骚扰服务程序0的数字管旋转显示。
该程序开始启动P0和P2 端口,并设置工作模式和计时器的初始值0。
代码对应于要显示的数字(0x1 至0x8 )存储在数组dis_baf中。
DIS_DIGIT用于控制数字管的选择,DIS_INDEX用于检测正在显示的数字索引。
在主要程序中,通过调用0个循环计时器来实现数字管动态扫描的显示,从而中断了服务程序。
每次中断中断时,P0和P2 端口值都会更新,并点亮数字管并显示相应的数字。
该程序通过位移操作更新DIS_DIGIT,以确保可以为每个中断选择下一个数字管。
在中断服务程序中,关闭第一个所有数字管,然后根据dis_index读取从dis_baf数组显示的数字代码,然后将其移至端口P0。
然后更新dis_digit,选择下一个数字管,然后dis_index增加。
当dis_index达到8 时,将其重置为0并开始新的扫描。
通过这种方式,该程序可以实现四位数的数字管圆形显示屏,每个数字管旋转以显示数字1 至8 该程序不仅适用于微控制器实验教学,而且还适用于数字管显示技术的典型应用。
51单片机数码管静态显示和动态显示原理及实验
非移动显示和动态管是两种常见的显示方法。本文讨论了这两种方法的基本原理和实验方法。
在统计模式下,每个数字管的帐户选择和一个小选择将通过一个小选择来监视。
通常,每个数字试管将携带UPE选择线和分离线,以控制大型端口端口的端口。
它的更新频率是稳定的,但是需要更多的I / OS且价格昂贵。
数据筛选方法可能会在每个数字管显示的数字管显示的最短时期迅速变化,因此人会持续演示眼睛。
在变量显示器中,每个数字管显示器都会通过一小条线选择来监视,类选举由7 4 EC2 5 (例如7 4 EC2 5 )驱动。
这种方法的好处是I / O成本很低,但是显示的效果会影响危险的频率。
在可变的显示模式下,通过连接J1 6 子等级连接DeadE选择。
7 4 天 /芯片类负责监视内部内部内部内部数字管的选举和选举,并控制数字管的一部分。
可以在此变量屏幕中定期查看数字管。
珠宝工作场所实际上可以在桌子上看到。
如果较低,则启用各种AAA1 A2 的控制输出。
例如,如果A0A1 A2 与Y0输出相关,001 (二进制1 (二进制1 (二进制1 (二进制1 )(二进制1 (二进制1 ),等于小数和小数点出口。
什么是数码管动态显示
在此体验中使用的实验卡的资源电路图如下:其中P0端口是段代码,在低级别上有效。端口P2 是位代码,高级别是有效的。
端口P2 .0控制第一个数字管,直到P2 .7 端口控制第八个。
该卡的片段代码表如下:每个数字管的片段代码来自P0端口,也就是说,每个数字管的段代码是相同的。
动态显示可以使用。
通过视觉逗留,只要我们的迟到很短,数字显示就可以非常稳定和清晰。
该过程如下所示。
上述方法和想法写如下:org0000h start:mova,#08 H; 0; movp0代码段,一个movp2 ,#01 H; 位代码LCALLDELAY_1 MS MOVA,#0ABH; 1 MOVP0,A MOVP2 ,#02 H LCALLDELAY_1 MS MOVA,##MOVP2 ,#02 H LCALLDELAY_1 MS MOVA,##MOVP2 ,#02 H LCALLDELAY_1 MS MOVA,####MOVP2 ,#02 H LCALLDELY_1 MS MOVA,#MOVP2 ,#MOVP2 02 H lcalldelay_1 m 1 2 中午; 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 ,#8 lcalldelay_1 ms mova,#04 H; 6 movp0,一个movp2 ,#4 0h lcallley_1 m句子以相同的方式实现,这种习惯在将来的movp2 ,#8 0H lcalldelay_1 m lcalldelay_1 m低屏幕数字分别为高显示0到7 (包括点)。
★上面的方法将值归因于P0或P2 一个接一个。
如果要更改显示的数字,则很难修改程序。
因此,我们必须使用MicroController搜索方法中常用的方法5 1 例如,在将段代码放在端口P0上时,我们可以在表中显示段代码端口P0。
将位代码放在P2 端口上时,您可以将二进制代码放在另一个表中使用,并每次将其列为该表的数量并将其发送到P2 端口。
这样,如果要修改显示的数字,只需更改表中的数字。
org0000h启动:movr7 ,#0ffh; r7 ,r6 搜索表时,将他发送到索引寄存器(因为添加1 后为0,因此是预设FFH)movr6 ,#0ffh loop:lcallplay1 ; CallPlay1 ; 呼叫式子例程显示段代码lcallplay2 ; 呼叫播放bitcode bitscode display lcalldelay_1 ms cjnea,#8 0h,loop; 它在左数中达到最多,也就是说,代码是第8 位ajmptart play1 :; 搜索细分法规研究和研究; Mova,R7 ; 印加; Movr7 ,A。
R7 ; 这里是索引的movdptr寄存器,#table1 ; + dptr; 基本寄存器加索引寄存器movp0地址,一个ret Play:; 表搜索表BitCode BitCode subroutine(原理与Play1 相同)MOVA,R6 INCA MOVR6 ,A MOVDPTR,#TABLE2 MOVCA, @ A + DPTR MOVP2 ,A al ret表1 :DB08 H,0ABH,0ABH,1 2 H,2 2 H,2 2 H,0A1 H,0A1 H,0A1 H ,2 4 H,04 H,0aah; 代码表段$ djnzr5 ,tem ret将其下载到卡上以检查并获得预期结果。
----------------------------------------------------------------------------- ----------------------------------------------------------------------------- ------------------------------------------------------------------------------- ----------------------------------------------------------------------------- - - ----------------------------------------------------------------------------- ----------------------------------------------------------------------------- ------------------------------------------------------------------------------- ----------------------------------------------------------------------------- - - ----------------------------------------------------------------------------- ----------------------------------------------------------------------------- ------------------------------------------------------------------------------- ----------------------------------------------------------------------------- - -----添加
,//如果等于0x01 ,当P2 .0端口的数字管连接到UnignedCharcodedis_code [1 1 ] = {0x08 .0xab,0x1 2 .0x2 2 .0xa1 ,// 0.1 ,2 ,2 ,2 ,3 ,4 0x2 4 04 0x2 4 .0x04 ,0x04 ,0xaa ,0x00.0x2 0.0xff}; (){p0 = 0xff; //关闭所有数字``p2 = 0x00; ] = dis_code [4 ]; dis_buf [5 ] = dis_code [5 ]; 0; //当前差异为0,而(1 ){p0 = dis_buf [dis_ind ex]; //段代码发送p0 p2 port = dis_digit; //选择位(即第二个strobe dis_index ++; //下一个bit; //以下段代码dis_index&= 0x07 ; //请参阅comment}} voidDelayms(unsignigedCharms)// delay(crystal oscillator 1 2 m)一次试管,回到第一个开始以下扫描。
通用表格:dis_index = dis_index&0x07 ★使用上述方法实现C5 1 时,其段代码放在表dis_code [1 1 ]中,然后通过tampon dis_buf表[]加载要在程序中调用的值)可以使用。
★此外,只需扩展程序中的延迟,例如延迟(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 ,offnedchardatadis_index; //显示索引,用于识别数字管的滞后和当前显示的voidmain(){p0 = 0xff; //关闭所有代码管p2 = 0x00的数字; 代码发送端口端口延迟(1 ); dis_digit = _crol_(dis_digit,1 )程序(晶体振荡器1 2 m){unsignedChari; while(ms--){for(i = 0; i <1 2 0; i ++);}}★我最初想通过以下方法进行循环:for(dis_index = 0; dis_index <8 ; dis_index ++ ){p0 = dis_code [dis_index]; //段代码发送p0 p2 端口= dis_index + 1 ; //位代码发送端口端口延迟(1 ); 0到达第二个位置的三个数字显示三个8 ,第三个数字显示7 和四个较高的数字。
咬合的延长发现没有错误,我不知道Keil的调试。
[2 006 .5 .2 ]找出原因,补充:我今天看了一下,发现上述错误在哪里。
当时,我想将dis_index的值用作二进制代码,也就是说,当第一个位显示0时,该段的代码是say_code [0],也就是说,dis_index的值是0,二进制代码目前为1 当第二位显示1 时,save code [1 ],tis_index valueIS 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(floatType):for(dis_index = 0; dis_index <8 ; dis_index ++){p0 = dis_code [dis_index]; //段代码发送p0 p2 端口=(char)pow(2 ,dis_index); //二进制代码发送端口端口延迟(2 5 5 ); 再次将其下载到桌子上,发现仍然存在问题,也就是说,当延迟很小时,显示器是混乱的,但是如果延迟时间增加(如程序值),您可以看到数字管在位方向上正确显示。
此外,此方法生成的代码量也很大(从写作速度来看很明显)。
这里只有一个想法,它仅适用于这种体验,而且不重要,仅此而已。
[END补充] -------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------- ----------------------------------------------------------------------------- ------ --------------------------------------------------------------------- ----------------------------------------------------------------------------- -------- ----------------------------------------------------------------------------- ----------------------------------------------------------------------------- ------------------------------------------------------------------------------- ----------------------------------------------------------------------------- - - ----------------------------------------------------------------------------- ----------------------------------------------------------------------------- ------------------------------------------------------------------------------- ----------------------------------------------------------------------------- - - ----------------------------------------------------------------------------- ----------------------------------------------------------------------------- ------------------------------------------------------------------------------- ----------------------------------------------------------------------------- - - ----------------------------------------------------------------------------- ----------------------------------------------------------------------------- ------------------------------------------------------------------------------- ----------------------------------------------------------------------------- ------ ----------------------------------------------------------------------------- ------------------------------------------------------------------------------ --------------------------------------------------------------- ----------------------------------------------------------------------------- ----------------------------------------------------------------------------- ------------------------------------------------------------------------------- ----------------------------------------------------------------------------- - - ----------------------------------------------------------------------------- ----------------------------------------------------------------------------- ------------------------------------------------------------------------------- ----------------------------------------------------------------------------- - - ----------------------------------------------------------------------------- ----------------------------------------------------------------------------- ------------------------------------------------------------------------------- ----------------------------------------------------------------------------- - - ----------------------------------------------------------------------------- ----------------------------------------------------------------------------- ------------------------------------------------------------------------------- ----------------------------------------------------------------------------- - - - - - - - - - 修改 参考我的董事会,该程序如下:#include
当晶体振荡器为1 2 m时,输入脉冲周期间隔为1 机器周期是1 假设T0的初始值为X,是计算初始值的方法:在此示例中,延迟器使用方法1 ,即1 6 位计时器,也就是说,最大值为2 1 6 = 6 5 5 3 6 价值将发生溢出,导致中断并进入中断治疗计划。
在这里,如果要延迟1 ms,也就是说1 000U,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 换句话说,6 5 5 3 5 h = 1 1 1 1 1 1 1 1 1 1 1 1 b,我们还可以说6 5 5 3 6 是通过溢出获得的。
当响应中断时,将成为关键。
也没有触发中断。
这仅在以下帐户之后发生。
确切的值必须是美国1 001 如果初始值为6 4 5 3 6 (FC1 8 ),则正是所需的值,因此上面示例中的初始值必须是FC1 8 而不是FC1 7 这只是我自己的看法。
----------------------------------------------------------------------------- ----------------------------------------------------------------------------- ------------------------------------------------------------------------------- ----------------------------------------------------------------------------- - - ----------------------------------------------------------------------------- ----------------------------------------------------------------------------- ------------------------------------------------------------------------------- ----------------------------------------------------------------------------- - - ----------------------------------------------------------------------------- ----------------------------------------------------------------------------- ------------------------------------------------------------------------------- ----------------------------------------------------------------------------- - ------------ ###################### #####因此,仿真结果如下(特定条件屏幕截图):★代码电路段对应于 车载连接方法,即以前的段代码控制控制的连接。
此外,这八位数字模拟的数字管的左端最多的是第一个位置,最右端是第八位,它与董事会的命令相反,因此为了关心的统一性,该数字根据董事会连接。
上图还可以在不增加拉伸电阻的情况下模拟结果,但是高水平的P0端口显示为灰色,即高电阻。
数码管是如何显示的?
实验简介:数字管的动态显示是与一个蓝桥杯芯片单元竞争的常见模块之一。根据各种复合方法,数字管被分为一般的阳极和一般类型的阴极。
知识的重点是数字管道的一般阳极图:在一般阳极结构中,所有光发射二极管的阳极形成一个公共端子,该端子连接到正电源。
当场二极管的另一端较低时,二极管亮起; 数字管图:插图图DS1 和DS2 显示了如何控制数字管以显示数字。
Y7 C和Y6 C控制字段和COM结束。
从0到9 个现场表:通过研究数字管道的原理和操作实践,您可以了解如何控制数字管以显示数字。
该操作的实践显示了数字管道上的“ F”:对于大多数学生来说,对Y6 C和Y7 C的值的解释可能会混淆。
实现Y6 = 0的方法 - 使用C = H,B = H,A = L,Y6 = 0时连接微控制器原理的图,然后获得Y6 C = 1 选择数字管的位置:A DS1 的第一个位置和第四位置和第四位置DS2 的示例显示了如何通过代码实现特定位置的数字显示。
分析问题和解决方案以解决示例的示例,显示了DS1 的第一个位置和DS2 第四位置的第9 个位置的数字2 提供了实施。
在序列中从0到9 显示:通过更改字节P0的值,他在序列中意识到显示从0到9 ,并注意数字管的位置的选择。
在研究了数字管显示的原理后,在掌握了示意图,接口功能和实现数字显示的示例之后,您可以轻松地掌握数字管的显示和闪烁。
这部分是杯蓝桥比赛中的一个常见测试点,需要技能。