找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1502|回复: 0
打印 上一主题 下一主题
收起左侧

数码管显示问题

[复制链接]
跳转到指定楼层
楼主
ID:116352 发表于 2016-5-4 15:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
数码管跳一位数 比如100到101 之间会有一段什么都不显示  下面是我的程序(编码器的)  希望会的大神不啬赐教~~~

#include <REG51.H>
#include <INTRINS.H>  //  空操作函数,移位函数头文件包含

#define uchar unsigned char
#define  uint unsigned int

unsigned char  counter;
unsigned char b;

sbit PINA = P1^0;//csn信号white
sbit PINB = P1^1;//这个是时钟blue
sbit PIND = P1^2;//这个是数据green



sbit LED2 = P2^2;//LED显示位选控制 百位
sbit LED3 = P2^1;//LED显示位选控制 十位
sbit LED4 = P2^0;//LED显示位选控制 个位

uchar led_buf[4];      /*定义LED显示缓冲区,将带显示数值放入该区域*/


/*------------------------------------------------
                     数码管段码表  
------------------------------------------------*/
uchar code disp_buff[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,};                                         

/*------------------------------------------------
                    延时子程序
------------------------------------------------*/
void delay(unsigned int cnt)
{
while(--cnt);
}
/*void delay(uint t)
{
uint i;
while(t--)
{
  for(i=0;i<125;i++){}
}
}*/

  /*------------------------------------------------
                   取编码器位置值子程序
------------------------------------------------*/  

long GetSSI(void)
{
         static  bit  Curr_encoder_b;  //定义一个变量来储存当前B信号
   static  bit  Last_encoder_b;  //定义一个变量来储存上次B脚信号
   static  bit  updata= 0;
   if( PINA && PINB)           //编码器无转动退出
   {
     updata = 0;
     return;
   }
   Last_encoder_b = PINB;       //记录B信号
   while(!PINA)                //等待A由低变高
   {
     Curr_encoder_b = PINB;     //记录等待期间的B信号(指当前B信号)
     updata = 1; }
   if(updata)
   {
   updata = 0 ;
     if( (Last_encoder_b == 0)&&(Curr_encoder_b== 1) ) //B从0到1为正转
     {
   if(counter == 255)
      { return;        }

       counter++;          //正转计数加
     }
     else if( (Last_encoder_b == 1)&&(Curr_encoder_b == 0) ) //B从1到0为反转
     {
       if(counter == 0)
       {return;         }
       counter--;         //反转计数减
}
  }       
  }
          
//LED 共阴

void main()
{
           counter = 0;
       
   P0 = 0xff;
   P1 = 0xff;
   P2 = 0xff;

           TMOD &= 0xf1;        //设置定时器模式
        TMOD |= 0x01;        //设置定时器模式

        TL0 = (65636-50000)/256;                //设置定时初值
        TH0 = (65636-50000)%256;                //设置定时初值
        TF0 = 0;                //清除TF0标志
        ET0 = 1;
        TR0 = 1;                        //定时器0开始计时;       
        IT0 = 1 ;
        EX0 = 1;                       
        EA = 1;

  while(1)
  {          
       GetSSI();//取绝对值编码器位置数据
                                   led_buf[2]=(counter%1000)/100;//百位
                        led_buf[1]=(counter%100)/10;//十位
                        led_buf[0]=counter%10;        //个位
   //将数据的各位数字放入指定缓冲区
          
           P0 = disp_buff[led_buf[2]];   //取显示数据,段码
           LED2 = 0;         //点亮LED2(第二位百位)
           delay(200);       //延时一小段时间
           LED2 = 1;         //熄灭LED2

           P0 = disp_buff[led_buf[1]];   //取显示数据,段码
           LED3 = 0;         //点亮LED3(第三位十位)
           delay(200);       //延时一小段时间
           LED3 = 1;         //熄灭LED3

           P0 = disp_buff[led_buf[0]];   //取显示数据,段码
           LED4 = 0;         //点亮LED4(第四位)
           delay(200);       //延时一小段时间
           LED4 = 1;         //熄灭LED4
//  delay(300);

  }

}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表