单片机 汇编 LED数码管动态显示
SO称为的动态屏幕是:LED按顺序显示一一显示(有些使用八个分段的试管)。在第二距离上进行更改。
然后,在每个人的眼中,LED管像静态屏幕一样连续眨眼。
在图片中,选择了段控件和时间划分门户时间P0和两个5 7 3 引脚以分开控制数据并控制分离位。
细分控制:数字管屏幕的字形位置控制:显示哪个数字管(或发送字形的数字管)注意:片段的控制与所有数字管连接。
(如果完全打开了位控件,则将静态显示数字管,并且显示的数字相同)。
位控制是独立连接的。
面向单片机编程(三)- 数码管显示
本文讨论了微控制器的数字管显示技术,以实现直观的数字显示。数字管显示技术通过控制微控制器IO来快速刷新显示,从而达到稳定且不变的数字显示效果。
数字管显示功能包括动态显示和静态显示。
动态显示器控制微控制器IO以快速刷新,以便多位数字的数字管可以同时显示数字。
静态显示通过物理并行或系列连接可以独立显示每个数字管。
数字管由8 个LED组成,分别由A,B,C,E,F,G,DP组成,并通过控制IO电位来亮起不同的LED。
单个数字管由8 个LED组成,公共阴极数字管连接到公共端的电源地面,该末端以高水平驱动,共同的阳极相反。
通过高速扫描钻头选择,多位数的数字管实现了同时显示效果。
当电路连接时,A,B,C,D,E,F,G,DP端口分别连接到微控制器P00〜P07 ,并且共同端子连接到电源地面。
就编程而言,基于电路连接,计算了与每个数字相对应的十六进制位代码,并实现了0-9 个数字的顺序显示。
本文详细介绍了数字管显示的基本知识,包括显示原理,电路连接和编程。
示例代码显示了如何实现数字管的数字显示。
基于理解比特码计算,可以进一步探索更多的数字管应用程序。
接下来,我们将探索更复杂的数字管显示效果并挑战更高的编程技能。
求:8字数码管动态显示0到99的汇编程序
在数字电路中,8 05 1 微控制器可用于以8 位数字管显示0至9 9 动态。其中,P1 端口连接到数字管扫描,而P0端口则连接到8 分段的字符屏幕。
该程序从0x0000h地址开始,并确定Staer地址启动。
首先,将DPTR指针指向存储数字管道显示代码的K1 数组,4 1 H和4 2 H寄存器初始化为00H,R2 寄存器设置为0FFH。
接下来,输入主循环A2 ,首先调用基板显示A1 ,然后减少寄存器R2 当R2 降至0时,将R2 重新安排到0FFH并增加寄存器4 1 H。
开始地址继续重复。
在A1 节目中,第一个P0端口已完全照亮,P1 端口设置为0FEH,以显示代码7 个段。
然后,通过寄存器值4 1 H调用MOVC命令,以从K1 数组中显示代码的7 个片段,并将其发送到P0端口。
然后调用延迟的子程序循环,将R3 寄存器设置为1 00,并达到1 毫秒延迟。
然后减少R4 寄存器1 0次,然后减少R3 寄存器1 00次。
在循环程序中,R3 和R4 寄存器用于控制1 00次和1 0次,以实现准确的延迟效应。
最后,该程序标识了一个K1 数组,其中包含下一个呼叫从0到9 的第7 个段的7 段。
该程序控制数字管道横穿P1 端口,并在P0端口上显示8 个字符,从而实现了从0到9 9 的动态屏幕,可以将其应用于数字显示方案。
什么是数码管动态显示
本实验中使用的实验板的资源电路图如下:其中P0端口是截面代码,在低级别上是有效的。P2 端口略有代码,高级别是有效的。
P2 .0端口首先控制数字管,除非P2 .7 端口控制第八个。
该板的片段代码表如下:每个数字管的段代码是从P0端口输出的,即每个数字管的段代码输入是相同的。
动态显示可以使用。
通过视觉逗留,只要我们的延迟时间很短,数字显示可能看起来很稳定且清晰。
该过程如下所示。
上述方法和想法写如下:org0000h start:mova,#08 H; 0; 段代码movp0,movp2 ,#01 H; 位代码lcalldlay_1 ms mova,#0ABH; 1 movp0,一个movp2 ,#02 H lcalllllyy_1 ms mova,## 1 2 h; 2 movp0,一个movp2 ,#04 H lcalllllllyy_1 ms mova,#2 2 H; 3 movp0,一个movp2 ,#08 H lcalllllyy_1 ms mova,#0a1 h; 4 movp0,一个movp2 ,#1 0H lcalllllllllyy_1 ms mova,#2 4 H; 5 movp0,一个movp2 ,#2 0H lcallllllyy_1 ms mova,#04 H; 6 movp0,一个movp2 ,#4 0H lcalllllllyy_1 ms; Mova,#0aah; 7 MOVP0,A MOVP0,#0AAH; 这些句子以这种方式实现,这是将来movp2 的习惯,#8 0H lcallllly_1 ms ljmpstart dalay_1 ms:movr6 ,#2 临时:movr5 ,#0ffh djnzr5 ,$ djnzr5 ,$ djnzr6 ,temp ret temp ret temp temp tem tem tem tem tem tem tem tem八到八个可能有可能。
分别从高到7 点(包括点)。
★上述方法为一个接一个地提供了P0或P2 的值。
如果要更改显示的数字,则更改程序非常令人不安。
因此,我们需要使用通常在5 1 MicroController中使用的方法:表查找方法。
例如,当P0端口的段代码输出时,我们可以将段代码显示在表中,然后每次从该表中获取数字并将其发送到P0端口。
端口上的P2 端口输出代码时,您可以将位代码放在另一个表中使用它,并且每次您都可以从该表中获取数字并将其发送到P2 端口。
这样,如果要更改显示的数字,则只需要更改表中的数字即可。
org0000h启动:movr7 ,#0ffh; R7 ,R6 ,查看表时,它会发送到索引寄存器A(因为添加1 后为0,因此是预设FFH)MOVR6 ,#0FH循环:lcalllplay1 ; CallPlay1 ; colplay显示段代码sabarutin lcallplay2 ; 呼叫显示sabarutin lcalldlay_1 ms cjnea,#8 0H,loop; 它是否达到左侧的数字,即,第8 位代码ajmpstart play1 :r7 ; 这里是序列化寄存器movdptr,#table1 ; +dptr; 基本寄存器加索引寄存器地址movp0,rit Play 2 :; 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; 位代码表延迟_1 ms:movr5 ,#02 H; 延迟1 MS Sabarutin温度:MOVR4 ,#0FH DJNZR4 ,$ DJNZR5 ,TEMP零售下载董事会以验证并获得预期的结果。
, ----------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------ ---------------------------------------------------------------------------------- ---------------------------------------------------------包括
, 当P2 .0端口数字管astarcarcodedis_code [1 1 ] = {0x08 ,0xAb,0x1 2 ,0x2 2 ,0xa1 , / 0,1 ,3 ,4 ,3 ,4 ,4 ,4 0x2 4 ,0x04 ,0x04 ,0xaaa,0x00,0x2 0,0xf}。
, (){p0 = 0xf; //关闭所有数字。
] = dis_code [5 ] = dis_code [5 ] 0; //当前偏移量为0,而(1 ){p0 = dis_buff [dis_ind ex]; //段代码P0端口p2 = dis_digit; //位(即位代码)选择延迟(1 ); 第二个Strobe dis_index ++的下一点; //下一节代码dis_index&=0x07 ; //请参阅评论}…所有试管一次,首先回到一个开始进行下一次扫描。
一般写回来:dis_index = dis_index&0x07 此方法非常新。
例如,在第一个循环之后,dis_index的值为0000001 ,0x07 的值保持不变并且仍然具有0x01 ,其值为0和0x02 ,在第一个循环之后,它仍然是0x02 ,直到价格上涨。
如果(dis_index = 8 )dis_index = 0,则可以替换此句子,并且效果相同。
★当使用上述方法使用C5 1 应用时,其段代码将放置在数组dis_code [1 1 ]中,然后可以使用缓冲区阵列dis_buff []加载程序中调用的值,可以使用下标(OFFSET)。
它看起来有些复杂,但是它的视图清晰,结构清晰,而且通用性且易于扩展。
★此外,只需延长程序的延迟,例如延迟(1 000),然后在板上下载它,您可以看到数字管实际上是从咬合中显示的。
, ----------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------ ---------------------------------------------------------------------------------- ------------------------------------------------------------- 0到7 在下标中的价值 它被标记为未设置缓冲区阵列dis_buf [],实现如下:#include
0x2 2 ,0xa1 ,// 0,2 ,3 ,4 0x2 4 ,0x04 ,0xaa,0x00,0x2 0,0xf}; 当前显示数字管和缓冲区voidmain(){p0 = 0xf; //关闭所有数字代码管P2 = 0x00; dish_index = 0; //当前偏移0 dis_digit = 0x01 ; //选择p2 .0 {p0 = dis_code [dis_index]; 代码P2 端口延迟(1 );程序(Crystal Osilator 1 2 m){Austy-Signed(ms-){for(i = 0; i <1 2 0; i <1 2 0; i ++)★我最初想通过以下方式实现一个循环:( dis_index = 0; dis_index <8 ; dis_index <8 ; [dis_index]; //段代码p0 prp2 = dis_index+1 发送; 0到达第二位置的三位数字,显示三个8 s,第三位数字显示七个数字,没有显示高四位数。
位观察很长一段时间没有引起任何错误,我对Keil调试并不熟悉。
]当时,我想将dis_index的值用作位代码,也就代码此时值为1 当显示第二个位1 时,截面代码dis_code [1 ],是dis_index的值,此时,位代码值为2 因此,我曾经仅使用1 个操作将P0 P0的偏移值与端口P2 的位代码联系起来。
但是,如果您仔细考虑BIT代码的原理,那么上述方法显然是错误的。
dis_index值为2 ,添加1 后为3 在遵循上述方法时,将此3 用作位代码,正确的位代码应为4 (000001 00B)。
所以出了点问题。
实际上,这种对应关系存在,但不仅是添加1 位代码2 应该具有dis_index功率。
也就是说:0--1 1 -2 2 -4 3 -8 4 --1 6 …功率操作函数包含在flootpo(flox,脚托)中,而返回值为xy(floatType):for(dis_index = 0; dis_index <8 ; [dis_index]; 再次在板上下载它,发现仍然存在问题,也就是说,当延迟非常低时,性能是混乱的,但是如果延迟时间增加(例如程序中的价格),那么您可以看到数字管正确显示。
此外,此方法生成的代码量也很大(从速度来看,此写作清楚)。
在这里,只提出了一个想法,它仅适用于本实验,并且非常低,因此就是全部。
[互补端] ------------------------------------------------------------------------------------------------------------------------------------ --------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------- , , ----------------------------------------------------------------------------- ---------------- ----- Reference Amendment for My Board, Program is as follows: #INCLUDE
当晶体振荡器为1 2 米时,输入脉冲周期间隔为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 ,它转换为Hexadesimal,即,初始值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 ,即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 表示,也可以说6 5 5 3 6 是由HighFrame获得的。
当对障碍做出反应很重要时。
也没有触发阻塞。
它仅在下一个计数之后发生。
确切的值应为1 001 U。
如果初始值为6 4 5 3 6 (FC1 8 ),则实际上是所需的值,因此在上面的示例中,初始值应为FC1 8 而不是FC1 7 这只是我的看法。
,----------------------------------------------------------------------------- -------------------------------------------------------- ####再次答案###仿真结果如下(某个位置的屏幕截图):★电路段代码与车载连接方法相匹配,即,以前的段代码表订单连接。
此外,这个八个导电的模拟数字管的最左端是第一个位置,最右端是第八位,这与董事会上的顺序相反,因此,为了统一,该数字是在此基础上连接的。
木板。
上图还可以在不连接桥电阻的情况下模拟结果,但是高水平的P0端口显示为灰色,即高电阻。