51单片机数码管显示实验
实验内容:
编写程序让8只数码管初始显示0,每隔大约1s加1显示(可以用延时函数实现),到数码管显示9后,再从0开始显示,如此循环反复。
C语言程序
#include
#define uint unsigned int
void display();
void num();
int i;
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e}; //共阳极数码管0-F编码表
void delayms(uint);
void main()
{
while(1)
{
num();
display();
}
}
void display()
{
P2=0xff;//消隐 P0连接段选,P1节位选
P1=0x00;//8个数码管同时显示
P2=table[i];//数码管显示数码0
delayms(1000);//延时5ms
}
void num()
{
if(i<9)
i++;
else
i=0;
}
void delayms(uint x)
{
uint i,j;
for(i=0;i
for(j=0;j<110;j++);
}
汇编语言:
ORG 0000H
LJMP MAIN
ORG 0100H
;P2连接段选,P1节位选
MAIN:MOV P1,#00H ;所有的数码管都显示
MOV R2,#00H ;从0开始显示
LOOP:MOV A,R2 ;为下面的基址加变址寄存器寻址方式做准备
MOV DPTR,#TAB1 ;把数组的首地址赋给DPTR
MOVC A,@A+DPTR ;取数组中的数字
MOV P2,A ;把取得的值送给P0口显示
ACALL DELAY ;延时一会
INC R2 ;为取下一个数加一
CJNE R2,#10,LOOP ;只要数小于10就继续循环显示
MOV R2,#00H ;如果加到10后重新从0开始
LJMP LOOP ;进入循环函数
;******************************************
TAB1:DB 0C0H,0F9H,0A4H,0B0H,99H; 数组
DB 92H,82H,0F8H,80H,90H
RET
;******************************************
DELAY:MOV R3,#3;延时函数
DE1:MOV R4,#0FFH
DE2:MOV R5,#0FFH
DJNZ R5,$
DJNZ R4,DE2
DJNZ R3,DE1
RET
;*************************************************
END
(3)编写程序学习数码管的动态显示,让8只数码管从从左往右显示1、2、3……8。
C语言程序:
#include
#define uint unsigned int
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e}; //共阳极数码管0-F编码表
void delayms(uint x);
void zuoyi();
void main()
{
int i;
while(1)
{
P1=0xfe;
for(i=0;i<8;i++)
{
P2=table[i];
delayms(3);
zuoyi();
}
}
}
void delayms(uint x)
{
uint i,j;
for(i=0;i
for(j=0;j<110;j++);
}
void zuoyi()
{
int a;
a=~P1;
a=a<<1;
P1=~a;
}
汇编语言:
;数码管动态显示
ORG 0000H
LJMP MAIN
ORG 0100H
;P0连接段选,P1节位选
MAIN