proteus中仿真51单片系列之--2位数码管程序

相比前面我们使用过的单位数码管难点就是要通过片选来输出每一位数码管显示所需要的16进制代码信号。
我们知道,多位数码管(包括两位数码管)显示的原理就是,每位数码管在不同的时间获得端口输出的信号显示出来,利用人的视觉暂留特点,使观看这感觉是同时显示的。
当然,片选后的闪烁问题也是我们需要解决的难点。
效果如下
在这里插入图片描述
上图,我们使用了一个共阴的两位数码管,用P2口做片选,P1口输出显示信号。
代码:

#include <reg51.h>
#include <stdio.h>
 unsigned char led_mod[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
 void delay(unsigned int time);
  void display(unsigned s0,unsigned s1);

 sbit LS0=P2^0;
 sbit LS1=P2^1;

void main(void)
 {   
   // Write your code here
   while (1)
       display(6,10);

 }
 void delay(unsigned int time)
 {
    unsigned int j=0;
    for(;time>0;time--)
       for(j=0;j<125;j++);   
 }


 
 
 void display(unsigned s0,unsigned s1)
{
    unsigned  int m,n,dly,i;
   
   for(m=0;m<s0;m++)
      for(n=0;n<s1;n++)
	 for(dly=0;dly<20;dly++) //让基本显示重复执行,以达到延时的效果
	    for(i=0;i<2;i++)  //基本显示,也成为扫描显示(每次每一位都要显示)
	    {
			 switch(i)	 //位选,选择点亮的数码管,
			 {
				 case(0):
					 LS0=0;LS1=1;
					 P1=led_mod[m];//发送段码
					 break;//显示第0位
				 case(1):
					 LS0=1;LS1=0; 
					 P1=led_mod[n];//发送段码
					break;//显示第1位
			 }
			 
			 delay(30); //间隔一段时间扫描	
			 P1=0x00;//消隐
		 }

   
 }

这个程序所采用的参数是经过测试完全无闪烁的参数组合,需要提醒注意的是,如果delay所设的参数过大(一般不大于40)就会出现闪烁。要想最终显示中的数字视觉上刷新间隔拉长,那就只能通过dly参数增加。否则闪烁就会明显。

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

河西石头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值