利用8255设计一位7段LED数码显示电路,数码管为共阴极,循环显示0-9,时间间隔1S,自编延时子程序。

利用8255设计一位7段LED数码显示电路,数码管为共阴极,循环显示0-9,时间间隔1S,自编延时子程序。,第1张

为方便起见,令数据,PORT1 POR2分别为,I/O口PA,PB的地址

PA连八盏灯,PB只连两盏

AGAIN:

MOV AL,01H

AGAIN1:

MOV DX,PORT1

OUT DX,AL

INC AL

JO AGAIN2

JMP AGAIN1

AGAIN2:

MOV AL,01H

AGAIN3:

MOV DX,PORT2

OUT DX,AL

INC AL

TEST AL,04H

JZ AGAIN

JMP AGAIN3

我只写了程序段,因为其他电路之类,我都不知道,所以只能帮这么多了

#include<reg51h>

#define uchar unsigned char

uchar code ledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//0-9

unsigned char sec=0,min=0,hour=12,scanled;

unsigned char key,flashbit,mode,time; 

unsigned char disdat[8];

sbit led=P1^0;

void delay(unsigned int x)

{

unsigned int i,j;

for(i=0;i<x;i++)

for(j=0;j<120;j++);

}

void dischg()

{

disdat[0]=sec%10;

disdat[1]=sec/10;

disdat[2]=10;

disdat[3]=min%10;

disdat[4]=min/10;

disdat[5]=10;

disdat[6]=hour%10;

disdat[7]=hour/10;

}

void flash()

{

switch(flashbit)

{

case 0:break;

case 1:

disdat[6]=0x10;

disdat[7]=0x10;

delay(50);

dischg();

delay(80);

break;

case 2:

disdat[3]=0x10;

disdat[4]=0x10;

delay(50);

dischg();

delay(80);

break;

case 3:

disdat[0]=0x10;

disdat[1]=0x10;

delay(50);

dischg();

delay(80);

break;

default:break;

}

}

void t0isr() interrupt 1 //秒计时

{

TH0=0x3c;

TL0=0xb0;

time++;

switch(mode)

{

case 0:

if(time==20)

{

time=0;

sec++;

if(sec>59)

{

sec=0;

min++;

if(min>59)

{

min=0;

hour++;

if(hour>23)hour=0;

}

}

}

break;

case 1:

if(time==20)

{

time=0;

if(sec>0)sec--;

else if(min>0){sec=59;min--;}

else if(hour>0){sec=59;min=59;hour--;}

else {hour=0;min=0;sec=0;}

}

break;

}

dischg();

}

void t1isr() interrupt 3 //显示

{

TH1=0xec;

TL1=0x78;

switch(scanled)

{

case 0:

P2=0x01;

P0=~ledtab[disdat[7]];

break;

case 1:

P2=0x02;

P0=~ledtab[disdat[6]];

break;

case 2:

P2=0x04;

P0=~ledtab[disdat[5]];

break;

case 3:

P2=0x08;

P0=~ledtab[disdat[4]];

break;

case 4:

P2=0x10;

P0=~ledtab[disdat[3]];

break;

case 5:

P2=0x20;

P0=~ledtab[disdat[2]];

break;

case 6:

P2=0x40;

P0=~ledtab[disdat[1]];

break;

case 7:

P2=0x80;

P0=~ledtab[disdat[0]];

break;

default:break;

}

scanled++;

scanled%=8;

}

main()

{

TMOD=0x11;

TH0=0x3c;

TL0=0xb0;

TH1=0xec;

TL1=0x78;

TR1=1;

TR0=1;

ET0=1;

ET1=1;

EA=1;

sec=55;

min=59;

hour=23;

flashbit=0;

scanled=0;

time=0;

mode=0;

dischg();

while(1)

{

flash();//闪烁

if((P3&0x0f)!=0x0f){

key=P3&0x0f;

while((P3&0x0f)!=0x0f);

led=0;

delay(10);

key|=0xf0;

switch(~key)

{

case 0x01: //p31选择调时、分、秒

TR0=0;

flashbit+=1;

if(flashbit>3){flashbit=0;TR0=1;}

break;

case 0x02: //p32调数

if(flashbit==0)break;

if(flashbit==1)

{

hour++;

if(hour>99)hour=0;

}

if(flashbit==2)

{

min++;

if(min>59)min=0;

}

if(flashbit==3)

{

sec++;

if(sec>59)sec=0;

}

break;

case 0x04:  //选择正/倒

TR0=0;

mode++;

mode&=0x01;

if(mode==0){sec=0;min=0;hour=0;}

dischg();

break;

case 0x08: //启动/暂停

TR0=~TR0;

break;

default:break;

}

}

}

}

1、首先设计数码管各段连接数字端口。

2、然后设置 4~11 引脚为输出模式。

3、接着创建显示数字5函数。

4、然后主体显示数字5。

5、然后延迟一秒。

6、最后创建显示函数4。

7、主体显示数字4,这样就完成了数码管显示数字。

以上就是关于利用8255设计一位7段LED数码显示电路,数码管为共阴极,循环显示0-9,时间间隔1S,自编延时子程序。全部的内容,包括:利用8255设计一位7段LED数码显示电路,数码管为共阴极,循环显示0-9,时间间隔1S,自编延时子程序。、51单片机设计数码管显示时钟的程序怎么写、请问一下verilog怎样写数码管显示等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9275849.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存