1. 单片机汇编语言8只数码管显示1-8
1、数码管显示演示程序:在8个LED数码管上依次显示1,2,3,4,5,6,7,8。引用端口:数码管数据p0,数码管控制p2;
DIS_DIGITEQU40H
;位选通值,传送到P2口用于选通当前数码管的数值,
;如等于0xfe时,选通P2.0口数码管
DIS_INDEXDATA41H
;显示索引,用于标识当前显示的数码管和缓冲区的偏移量
DIS_BUFDATA50H
;显于缓冲区起始地址
ORG0000H
AJMPMAIN
ORG000BH
AJMPINTT0
ORG0100H
MAIN:MOVP0,#0FFH;初始化I/O口
MOVP2,#0FFH
MOVTMOD,#02H;定时器0在模式2下工作
MOVTL0,#38H;每200μs产生一次溢出
MOVTH0,#38H;自动重装初值
SETBET0;使能定时器0中断
SETBTR0;启动定时
SETBEA;使能总中断
MOVDPTR,#DIS_CODE;设定显示初值为1-8
MOVA,#1;初值为1,以后顺序加1
MOVCA,@A+DPTR
MOVDIS_BUF,A
MOVA,#2
MOVCA,@A+DPTR
MOVDIS_BUF+01H,A
MOVA,#3
MOVCA,@A+DPTR
MOVDIS_BUF+02H,A
MOVA,#4
MOVCA,@A+DPTR
MOVDIS_BUF+03H,A
MOVA,#5
MOVCA,@A+DPTR
MOVDIS_BUF+04H,A
MOVA,#6
MOVCA,@A+DPTR
MOVDIS_BUF+05H,A
MOVA,#7
MOVCA,@A+DPTR
MOVDIS_BUF+06H,A
MOVA,#8
MOVCA,@A+DPTR
MOVDIS_BUF+07H,A
DISPLAY:MOVDIS_DIGIT,#0FEH;初始从第一个数码管开始扫描
MOVDIS_INDEX,#0
SETBTR0;启动定时器0,开始动态扫描显示
MAIN_LP:NOP
;主程序循环,可增加其它代码以改变50H-57H中的值以改变显示内容
SJMPMAIN_LP
;=====================================================
INTT0:
;定时器0中断服程序,用于数码管的动态扫描
PUSHACC
PUSHPSW
MOVP2,#0FFH;先关闭所有数码管
MOVA,#DIS_BUF;获得显示缓冲区基地址
ADDA,DIS_INDEX;获得偏移量
MOVR0,A;R0=基地址+偏移量
MOVA,@R0;获得显示代码
MOVP0,A;显示代码传送到P0口
MOVP2,DIS_DIGIT;
MOVA,DIS_DIGIT
;位选通值左移,下次中断时选通下一位数码管
RLA
MOVDIS_DIGIT,A
INCDIS_INDEX
;DIS_INDEX加1,下次中断时显示下一位
ANLDIS_INDEX,#0x07
;当DIS_INDEX等于8(00001000B)时,清0
POPPSW
POPACC
RETI
DIS_CODE:DB28h,7eh,0a2h,62h,74h,61h,21h,7ah
DB20h,60h,30h,25h,0a9h,26h,0a1h,0b1h
;0-9和ABCDEF的数码管显示代码
END
2. 单片机求助,用汇编语言写一个双位数码管0到99循环
在设计一个单片机程序时,我们面临一个挑战:用汇编语言实现一个双位数码管循环显示0到99的过程。这个程序需要让两个数码管交替显示00至01秒的数字,确保人眼几乎察觉不到切换的过程。为了实现这一目标,我们需要深入理解数码管的工作原理和单片机的定时功能。
首先,我们需要了解数码管的基本工作原理。数码管通常由多个LED段组成,通过控制这些段的点亮与熄灭,可以显示不同的数字。在本例中,我们将使用双位数码管,这意味着每个数码管可以显示0到9。为了实现0到99的循环显示,我们需要对这两个数码管进行编程。
接下来,我们需要考虑如何实现交替显示。为了使交替显示的过程不被人眼察觉,我们需要精确控制两个数码管的显示时间。通常,我们可以使用单片机的定时器功能来实现这一点。设定定时器以固定的时间间隔更新数码管的内容,从而实现平滑的交替显示效果。
在编写汇编语言程序时,我们还需要考虑如何控制数码管的段。每个数码管由多个段组成,每个段对应一个二进制位。通过控制这些段的高低电平,可以实现数字的显示。例如,要显示数字0,我们需要点亮所有的段;而要显示数字1,则只需要点亮特定的几个段。
在编写程序时,我们还需要注意以下几个关键点:
- 确保定时器的精度足够高,以实现平滑的交替显示。
- 为每个数字设置相应的段控制代码,确保数码管能够正确显示。
- 在交替显示过程中,确保两个数码管的显示时间尽量一致,以达到最佳的视觉效果。
通过这些步骤,我们可以实现一个高效的双位数码管循环显示程序。这不仅能够满足显示0到99的需求,还能确保交替显示的过程不被人眼察觉。
3. 51单片机如何用汇编语言让4个共阴数码管同时显示1234 P3口是片选 P0是段选
在进行51单片机的编程时,利用汇编语言实现四个共阴数码管同时显示数字1234是一个有趣的实验。实验中,P3口被用作片选信号,而P0口则负责段选,即控制数码管的点亮状态。
要实现这一功能,可以使用proteus软件进行仿真。在proteus中,创建一个四位一体的共阴数码管模型,并将其连接到51单片机的P0和P3口。具体配置中,P3口的每个引脚分别连接到四个数码管的片选引脚,而P0口的引脚则对应控制数码管的段选信号。
接下来,编写汇编程序来实现显示功能。程序首先将数据1234分别送入四个数码管的显示缓冲区。然后通过循环切换数码管的片选信号,使每个数码管依次显示相应的数字。同时,P0口的输出数据也相应地更新,以确保显示正确的段选状态。
在proteus仿真过程中,可以通过观察数码管的显示效果来验证程序的正确性。当数码管依次显示1234时,说明程序已经成功实现了四个共阴数码管的同步显示功能。
整个实验不仅能够加深对51单片机和汇编语言的理解,还能锻炼编程和调试能力。通过实际操作,可以更好地掌握数码管显示技术在嵌入式系统中的应用。
在编写程序时,需要注意数码管的驱动方式和显示代码的编写。对于共阴数码管,通常需要将段选信号置高电平来点亮相应的段,而片选信号则用于选择需要显示的数码管。在程序中,可以通过合理的逻辑判断和循环结构来实现数码管的同步显示。
总之,利用51单片机和汇编语言实现四个共阴数码管同步显示1234,是一个既实用又有趣的实验项目。通过这样的实践,可以提高对硬件和软件的综合应用能力,为今后的嵌入式系统开发打下坚实的基础。
4. 51单片机怎么让数码管显示学号用汇编语言
数码管连接电路如图1所示,P0口输出码型,P2口输出位选。锁存器74HC573起驱动作用,提供驱动电流供数码管发光。译码器74HC138将位选地址转换成位选信号,例如当前是第5个数码管显示,那么P2口输出位选地址05H,译码器输入CBA=110,输出位选信号Y7-Y0=11101111,其中Y5=0,第5个数码管选通并显示,其它数码管不显示。实验时将J6的左边两个引脚针(1和2)用跳冒连接,锁存器11脚接VCC,关闭锁存功能。
数码管显示方式为动态扫描方式,当P0口送绝搏第一个数0的码型到锁存器时,P2送位选地址01H,即Y0=0,只有第一个数码管亮,宏宏枯显示0,其他数码管不显示。当P0口送第二个数1的码型到锁存器时,P2送位选地址02H,即Y1=0,只有第二个数码管亮,显示1,其他数码管不显示。即每次只有一个数码管点亮,8个数码管是轮流被点亮的,轮流点亮的间隔时间很短(一般用延时程序延时几个毫秒),由于视觉蔽洞的暂留现象,看到的却好象全都点亮着,这就是动态扫描。
数码管显示数字的码型由数码管的数据脚a~dp决定,图2为数码管的笔段分布图,由于是共阴极的,所以当a~dp为高电平时相应的笔段会亮,电路中P1.0~P1.7分别接数码管的a.b.c.d.e.f.g.dp,得到0~9这10个数字的码型如表1所示。
图2数码管的笔段分布图
引脚 P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1P0.0数字码型
笔段 dp g f e d c ba
0 0 1 1 1 1 11 03FH
0 0 0 0 0 1 10 106H
0 1 0 1 1 0 11 25BH
0 1 0 0 1 1 11 34FH
0 1 1 0 0 1 10 466H
0 1 1 0 1 1 01 56DH
0 1 1 1 1 1 01 67DH
0 0 0 0 0 1 11 707H
0 1 1 1 1 1 11 87FH
0 1 1 0 1 1 11 96FH
1 0 0 0 0 0 00 小数点80H
只要把上面的相关数,改成学好就可以了。
5. 单片机控制74LS164控制数码管显示怎么编程(汇编语言)
74LS164是串入并出转换芯片,可以借助串口来实现,也可以用普通IO口模拟实现。举例如下:
#include<reg51.h>
#define uchar unsigned char
uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};
sbit keyup=P3^6;
sbit keydn=P3^7;
void delay()
{
int i=1000;
while(i--);
}
main()
{
uchar i;
i=0;
SCON=0x00;
TI=1;
while(1)
{
SBUF=table[i];
while(TI==0);
TI=0;
delay();
if(keyup==0)
{
i++;
while(keyup==0);
}
if(keydn==0)
{
if(i>0)i--;
while(keydn==0);
}
i%=10;
}
}