89c51单片机两个数码管同时工作怎么弄

现在是p0口循环一遍,p2口在开始工作想让p0口和p2口同时工作怎么改程序?... 现在是p0口循环一遍,p2口在开始工作想让p0口和p2口同时工作怎么改程序? 展开
 我来答
GUEL86
2019-04-16 · TA获得超过5855个赞
知道大有可为答主
回答量:5538
采纳率:86%
帮助的人:2674万
展开全部

89c51单片机两个以上数码管同时工作,一般采用扫描显示方式,如果加上按键(矩阵扫描按键)就是如下面的仿真图,可以作为参考,有参考代码如下。

#include<reg51.h>

#define uchar unsigned char

uchar temp;

int key1,key,disbuf;// 此表为 LED 的字模 0 1 2 3 4 5 6 7 8 9 a b c d e f

unsigned char code LED7Code[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};

unsigned char ledx[8];

bit  s0,s1;

void delay(uchar z)

{

uchar i,j;

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

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

}

void scan()   //要是按键了,扫描键盘编码值

{

P1=0xF0;

delay(1);

temp=P1;

switch(temp)

{

case 0xe0: key1=0;

break;

case 0xd0: key1=1;

break;

case 0xb0: key1=2;

break;

case 0x70: key1=3;

break;

}

P1=0x0f;

delay(1);

temp=P1;

switch(temp)

{

case 0x0E: key=key1+0;

break;

case 0x0D: key=key1+4;

break;

case 0x0B: key=key1+8;

break;

case 0x07: key=key1+12;

break;

default : key=-1; 

}

if((key1+1)&&(key+1)) disbuf=key;

}

void ejjc()  //判断是否按键

{

P1=0xF0;

if(P1!=0xF0) { scan();s0=1;}

else { s0=0; s1=1;}

}

void main()

{

uchar i;

while(1)

{

ejjc();

if(s0==1  && s1==1)

{

s0=0;s1=0;

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

{ ledx[i]=ledx[i+1]; ledx[8]=disbuf; }

}

P0=0xff;

P2=LED7Code[ledx[0]];

P0=0xfe;

delay(5);

P0=0xff;

P2=LED7Code[ledx[1]];

P0=0xfd;

delay(5);

P0=0xff;

P2=LED7Code[ledx[2]];

P0=0xfb;

delay(5);

P0=0xff;

P2=LED7Code[ledx[3]];

P0=0xf7;

delay(5);

P0=0xff;

P2=LED7Code[ledx[4]];

P0=0xef;

delay(5);

P0=0xff;

P2=LED7Code[ledx[5]];

P0=0xdf;

delay(5);

P0=0xff;

P2=LED7Code[ledx[6]];

P0=0xbf;

delay(5);

P0=0xff;

P2=LED7Code[ledx[7]];

P0=0x7f;

delay(5);

}

0开拓者0
2019-04-16 · TA获得超过1404个赞
知道小有建树答主
回答量:1333
采纳率:72%
帮助的人:360万
展开全部
那就最小的改动用你现在的程序,把两段穿插就好了,也就是在每个延时前同时给两个数码管输出端口赋值。比如
P0=p0[1];
P2=p2[1];
delay1s;
P0=p0[2];
P2=p2[2];
delay1s;
……
但其实这样是不规范的,用到了太多输出接口,电路复杂,单片机整机电流大,并且如果数码管很多关键不够用。超过一位数码管时一般用动态扫描法,也就是每个数码管的8个数据口并联,公共端位选口再用另外的单片机管脚控制,同一时刻只让一个亮,快速切换 比如1秒切换50次。视觉上就都能看到了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
九顶冒阳山
2019-04-16 · TA获得超过240个赞
知道小有建树答主
回答量:418
采纳率:100%
帮助的人:67.3万
展开全部
循环中,P0口和P1口同时控制数码管即可。
提供参考

void load_smg() //将数码管显示缓冲区的数据,显示到数码管上
{
char i;
for(i=0;i<4;i++)
{
P0=0xFF; //消除上一个循环的影子,因为i每一次叠代时,数码管都会有上一次叠代的痕迹,0xFF则是使所有数码管灭掉。
P1=0xFF;
P0 = seg[smgbuf[i]];
P1 = seg[smgbuf[i]];
P2 = ~(1<<i);
delay(200);
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
syq5038
2019-04-16 · TA获得超过192个赞
知道小有建树答主
回答量:324
采纳率:78%
帮助的人:55.1万
展开全部
只要在延时之前,P0口和P2口同时赋值就可以了。例如,程序前3行:
P0=P0【1】;
P2=P2【1】;
delays( );延时程序
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
孤傲何妨CG
2019-04-16 · TA获得超过106个赞
知道小有建树答主
回答量:343
采纳率:79%
帮助的人:36.4万
展开全部
两个数码管统一接段选和位选就OK了。
追答
数码管位选程序改下
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(14)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式