
ORG 0000H
SJMP MAIN
ORG 030H
MAIN: MOV R1,#00H
MOV A,R1
D1: ANL A,#0FH
MOV DPTR,#TAB
MOVC A,@A+DPTR ;查表
MOV P0,A ;P0口输出,显示数字
ACALL DELAY
INC R1
MOV A,R1 ;A加1
CJNE A,#10,D1 ;判断A是否到达10
LJMP MAIN ;当A达到10跳回主函数,重新赋值为0
DELAY: MOV R2,#05H ;延时
D2: MOV R3,#0FFH
D3: MOV R4,#0FFH
DJNZ R4,$
DJNZ R3,D3
DJNZ R2,D2
RET
TAB: DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;数值1到9的共阳极编码
END
补充说明两点:
1、程序下载到目标板之后,注意一下晶振频率,如果显示效果不佳,可以通过修改延时参数,调节刷新频率。
2、这里采用的是共阳极编码二极管(公共端已经接VCC了),下载程序前,请注意自己到网上找编码,代替倒数第二行代码。
/该程序是一个0-9单个数码管循环显示程序/
#include<reg52h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar a,t;
sbit dula=P2^6;
sbit wela=P2^7;
void display(uchar a);
void delay(uint z);
void main()
{
dula=0;
wela=0;
t=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
if(t==20)
{
t=0;
a++;
if(a==10)
a=0;
}
display(a);
}
}
void display(uchar a)
{
dula=1;
P0=table[a];
dula=0;
wela=1;
P0=0xfe;
wela=0;
P0=0xff;
delay(1);
}
void timer0()interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t++;
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
MOV R0,#0
MOV R1,#3
LOOP:
MOV DPTR,#TABLE
MOV A,R0
MOVC A,@A+DPTR
MOV P1,A
LCALL DELAY
MOV P1,#00H
LCALL DELAY
DJNZ R1,LOOP
INC R0
MOV R1,#3
CJNE R0,#10,LOOP
MOV R0,#0
SJMP LOOP
DELAY:
MOV R2,#200
DELAY1:
MOV R3,#250
DJNZ R3,$
DJNZ R2,DELAY1
RET
TABLE: ; 共阴极数码管显示代码表
DB 3FH,06H,5BH,4FH,66H ;01234
DB 6DH,7DH,07H,7FH,6fh ;56789
END
七段共阳数码管接在P0口,显示从0到9, 按键接P32按一下加一, 按键P33 按一下减一。程序如下:
K1 BIT P32
K2 BIT P33
START:MOV DPTR,#TABLE
MOV R1,#0
MLOOP:MOV A,R1
MOVC A,@A+DPTR
MOV P0,A
JB K1 ,TK2
CJNE R1,#9,CPM
CPM:JNC MLOOP
INC R1
JNB K1,$
SJMP MLOOP
TK2:JB K2,MLOOP
CJNE R1,#0,CPN
SJMP MLOOP
CPN:DEC R1
JNB K2,$
SJMP MLOOP
TABLE:DB 0C0H,0F9H,0A4H,0B0H,99H
DB 92H,82H,0F8H,80H,90H
END
仿真图及效果
把 数码管的 1-9 的 对应的码算出来就好了
例如:#include <AT89X51H>
//数字0-9的字形码
unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
unsigned char dispcount;
void delay02s(void);
void main(void)
{
P1_0=0;//选通第一位数码管
while(1)
{
for(dispcount=0;dispcount<10;dispcount++)
{
P0=table[dispcount];
delay02s();
}
}
}
void delay02s(void)
{
unsigned char i,j,k;
for(i=20;i>0;i--)
for(j=30;j>0;j--)
for(k=248;k>0;k--);
}
补充:单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。从上世纪80年代,由当时的4位、8位单片机,发展到现在的300M的高速单片机
你要c语言的还是汇编的?
#include<reg52h>
#define uint unsigned int
#define uchar unsigned char
void delay(uchar x); //延时程序
void ds_50ms(void); //50ms定时,中断程序
void Ptime(uchar); //时间处理函数
void Js_Scan(void); //数码管扫描函数
sbit S1=P2^4; //置位P24为数码管1控制位
int num=0,m=0; //定义数据类型
//int code LED_Num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管扫描数组,共阴极
int code LED_Num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳极
void main(void) //主函数
{
TMOD=0x01; //定义计时器工作类型
TH0=(65535-50000)/256; //定时器高4位初值
TL0=(65535-50000)%256; //定时器低4位初值
EA=1; //开中断
ET0=1; //开中断
while(1) //建立死循环
{
Js_Scan(); //调用数码管扫描函数
TRO=1;
}
}
void ds_50ms(void) interrupt 1 using 1 //50ms定时中断程序
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
num++; //执行累加,直到50ms
Ptime(num); //调用时间处理函数
}
void Ptime(uchar time) //时间处理函数
{
if(time==20) //判断是否到1000ms,即1秒
{
num=0; //num清零
m++; //m累加
}
if(m==9) //数码管显示9时,m清零,重新计数
{
m=0;
}
}
void Js_Scan() //数码管扫描函数
{
uchar j; //定义j数据类型
for(j=0;j<5;j++) //建立循环
{
S1=1;P0=LED_Num[m];delay(1);S1=0; //扫描显示位,稍作延时(对于单位数码管可直接置高置低,此为扫描的写法,单位不需要延时,不需要写for循环)
}
}
void delay(uchar x) //延时函数,防止数码管显示不稳定
{
uchar k;
while(x--)
for(k=0;k<125;k++);
}
这个是共阳极的,共阴极改变数组就行了。。。。 将前面的//删掉 将后面数组加上// S1=0;S1=1;就行了。
以上就是关于求单只数码管循环显示0-9的汇编代码全部的内容,包括:求单只数码管循环显示0-9的汇编代码、数码管显示数字0~9的C程序、汇编语言 数码管显示0-9.每个数字闪烁三次,再显示下一个数字,如此循环。求程序,,等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)