久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5324|回復: 6
打印 上一主題 下一主題
收起左側

初學者8只7段數碼管當秒表用的實例問題

[復制鏈接]
跳轉到指定樓層
樓主

//***8只7段數碼管,想實現在末位數碼管每秒跳變一次,滿10進一位,倒數第二位滿10也進1,依次類推(不要取商取余,那樣運算慢有卡頓)*****///
***k的值一直沒變,總是0,返回的tmp只到1就沒了。這是為什么??
硬件有,74HC138譯碼器,74HC573移位器  ******/
#include<reg51.h>#include<intrins.h>        
#define uint unsigned int
#define uchar unsigned char
#define GPIO P0sbit LE=P1^0;  //74HC573移位器 段選使能
sbit LSA=P2^2;   //此三腳接138譯碼器,用來選擇哪個管顯示
sbit LSB=P2^3;
sbit LSC=P2^4;
uchar code table[]={
                      0x3f,0x06,0x5b,0x4f,
       0x66,0x6d,0x7d,0x07,
       0x7f,0x6f
                     };//,0x77,0x7c,//0x39,0x5e,0x79,0x71//顯示0~F的值 取0-9
uint time=0,n[8]; //0-7代表8位數碼管,數組里裝數碼管的值
void Delay10ms(uint c);
void Display_Arr(uint x);//選擇顯示第幾位
void InitTimer0(void); //定時器初始化void Display(uint *x);
uint ScanNumber(uint);//掃描8管是否有等于10,返回i,否則返回0//
void FillOneTube(uint x,uint y);
void main()
{
uint i, k=0,tmp=0;         //n用來表示要顯示的數字,i表示要顯示第幾位,前面有幾個顯0的  
InitTimer0();
for(i=0;i<8;i++)
n[i]=0;
while(1)               
{                  
                    
     if(time==100)        //1秒才跳數            
       {                                 
     time=0;
     n[0]++;                  //末位管進1                          
     if(n[0]==10)                        
           n[0]=0;                     
        if(ScanNumber(k)==8)//沒有進位到10的管子                                
      {                                 
   Display(n);                                 
   }                                 
   else                                
   {                                 
    tmp=ScanNumber(k); //有管子=10,賦給臨時變量T                                 
    n[tmp]=0;                                 ;                                 
    n[++tmp]+=1;//前位進1                                 
    Display(n);                             
    }                       
                        
    }//end while            
}   
                                               
void testTen()
{  
int i;  
  for(i=0;i<8;i++)  
   if(n[i]==10)
     {   
  n[i]=0;
  n[i++]+=1;  
  }  
}
                        
void Display(uint * x)
{   
  uint i;uint y[8];  
  for(i=0;i<8;i++)
  {
   y[i]=*x;
  x++;
  }  
for(i=0;i<8;i++)  
  {   
    Display_Arr(i);
    LE=1;        
     GPIO=table[y[i]];      
       LE=0;        
    Delay10ms(1);  
  }
}
uint ScanNumber(uint k)
{        
  uint i=0;      
  for(;i<8;i++)  
{                     
   if(n[i]==10)            
    {         
   k=i;      
      return k;   
     }              
  }               
  return 8;        //沒有等于10的數組
}
void Display_Arr(uint x) //選擇8個數碼管的哪個亮
{   
  switch(x)              //位選,選擇點亮的數碼管,              
    {                       
   case(0):                              
   LSA=0;LSB=0;LSC=0; break;                        
   case(1):                              
   LSA=1;LSB=0;LSC=0; break;                        
   case(2):                                
   LSA=0;LSB=1;LSC=0; break;                        
   case(3):                                
   LSA=1;LSB=1;LSC=0; break;                        
   case(4):                                
   LSA=0;LSB=0;LSC=1; break;                        
   case(5):                                
   LSA=1;LSB=0;LSC=1; break;                       
   case(6):                                
   LSA=0;LSB=1;LSC=1; break;                        
   case(7):                                
   LSA=1;LSB=1;LSC=1; break;                       
}
}        
void Tiner_Int() interrupt 1
{
   TH0 = 0xD8;        //定時10MS
   TL0 = 0xF0;
   time++;
  }
void InitTimer0(void)// 定時器0初始化
{   
  TMOD = 0x01; //方式1   
  TH0 = 0xD8;        //定時10MS   
  TL0 = 0xF0;   
  EA = 1;   
  ET0 = 1;   
  TR0 = 1;
}                  
           
void Delay10ms(uint c)   //誤差 0us
{   
   unsigned char a,b;   
   for(;c>0;c--)        
   for(b=10;b>0;b--)                  //原為38            
   for(a=130;a>0;a--);
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:97249 發表于 2015-12-1 09:38 | 只看該作者
在線跪求大神啊
回復

使用道具 舉報

板凳
ID:97249 發表于 2015-12-1 11:55 | 只看該作者
附上138譯碼器真值表

138譯碼器真表.png (25.08 KB, 下載次數: 112)

138譯碼器真表.png
回復

使用道具 舉報

地板
ID:97249 發表于 2015-12-1 19:34 來自手機 | 只看該作者
終于搞定了,哈哈:-)
回復

使用道具 舉報

5#
ID:1 發表于 2015-12-2 00:37 | 只看該作者
樓主能分享一下 怎么搞定的嗎
回復

使用道具 舉報

6#
ID:97249 發表于 2015-12-2 12:36 | 只看該作者

//***8只7段數碼管,想實現在末位數碼管每秒跳變一次,滿10進一位,倒數第二位滿10也進1,依次類推*****///
硬件有,74HC138譯碼器,74HC573移位器                ******/
#include<reg51.h>#include<intrins.h>        
#define uint unsigned int
#define uchar unsigned char
#define GPIO P0sbit LE=P1^0;  //74HC573移位器使能
sbit LSA=P2^2;                 //此三腳接138譯碼器,用來選擇哪個管顯示
sbit LSB=P2^3;
sbit LSC=P2^4;
uchar code table[]={
                      0x3f,0x06,0x5b,0x4f,
                                          0x66,0x6d,0x7d,0x07,
                                          0x7f,0x6f
                     };//,0x77,0x7c,//0x39,0x5e,0x79,0x71//顯示0~F的值 取0-9
uint time=0,n[8]; //0-7代表8位數碼管,數組里裝數碼管的值
void Delay10ms(uint c);
void Display_Arr(uint x);//選擇顯示第幾位
void InitTimer0(void); //定時器初始化void Display(uint *x);
uint ScanNumber(uint);//掃描8管是否有等于10,返回i,否則返回0//
void FillOneTube(uint x,uint y);
void main()
{
uint i, k=0,tmp=0;         //n用來表示要顯示的數字,i表示要顯示第幾位,前面有幾個顯0的  
InitTimer0();
for(i=0;i<8;i++)
n[i]=0;
while(1)               
        {                  
                           
            if(time==100)        //1秒才跳數            
              {                                 
                   time=0;
                   n[0]++;                  //末位管進1                          
                   ScanNumber(k);                                
                   Display(n);                             
                  }                       
                                       
    }//end while            
}   
                                               

void Display(uint * x)
{   
  uint i;uint y[8];  
  for(i=0;i<8;i++)
         {
          y[i]=*x;
         x++;
         }  
for(i=0;i<8;i++)  
  {   
           Display_Arr(i);
           LE=1;        
           GPIO=table[y[i]];      
       LE=0;        
           Delay10ms(1);  
  }
}

uint ScanNumber(uint k)
{        
  uint i=0,j;      
  for(;i<8;i++)  
{                     
   if(n[i]==10)            
    {         
          j=k;
          n[j]=0;                                 ;                                 
          n[++j]+=1;//前位進1                                 
          ScanNumber(j);      
     }              
  }               
  return 8;        //沒有等于10的數組
}

void Display_Arr(uint x) //選擇8個數碼管的哪個亮
{   
  switch(x)              //位選,選擇點亮的數碼管,              
    {                       
          case(0):                              
          LSA=0;LSB=0;LSC=0; break;                        
          case(1):                              
          LSA=1;LSB=0;LSC=0; break;                        
          case(2):                                
          LSA=0;LSB=1;LSC=0; break;                        
          case(3):                                
          LSA=1;LSB=1;LSC=0; break;                        
          case(4):                                
          LSA=0;LSB=0;LSC=1; break;                        
          case(5):                                
          LSA=1;LSB=0;LSC=1; break;                       
          case(6):                                
          LSA=0;LSB=1;LSC=1; break;                        
          case(7):                                
          LSA=1;LSB=1;LSC=1; break;                       
        }
}        
void Tiner_Int() interrupt 1
{
          TH0 = 0xD8;        //定時10MS
          TL0 = 0xF0;
          time++;
  }
void InitTimer0(void)// 定時器0初始化
{   
         TMOD = 0x01; //方式1   
         TH0 = 0xD8;        //定時10MS   
         TL0 = 0xF0;   
         EA = 1;   
         ET0 = 1;   
         TR0 = 1;
}                  
           
void Delay10ms(uint c)   //誤差 0us
        {   
                 unsigned char a,b;   
                 for(;c>0;c--)        
                 for(b=10;b>0;b--)                  //38            
                 for(a=130;a>0;a--);
        }

顯示效果不是很理想,功能已經達到
回復

使用道具 舉報

7#
ID:97249 發表于 2015-12-2 12:41 | 只看該作者
弄了半天啊,原來是問題在于到9時沒有進1,兩個9或更多9時沒有往后SCAN
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 性高湖久久久久久久久aaaaa | 欧美一区在线视频 | h片在线观看免费 | 欧美一区在线视频 | 日本电影一区二区 | av在线免费观看不卡 | 在线免费观看日本视频 | 亚洲欧美激情四射 | 成人性视频在线播放 | 久久久九九 | 久久久www成人免费精品张筱雨 | 狠狠色综合欧美激情 | 欧美亚洲国产一区二区三区 | 欧美精品综合在线 | 精品国产亚洲一区二区三区大结局 | 亚洲成人免费视频 | 91色在线| 精品一区在线看 | 国产95在线| 国产高潮好爽受不了了夜色 | 精品久久久久久亚洲精品 | 激情毛片 | 欧美一区二区三区久久精品 | 九九精品在线 | 一区二区三区av | 亚洲理论在线观看电影 | 国产精品久久久久久亚洲调教 | 久久久免费电影 | 岛国在线免费观看 | a黄视频 | 日韩在线欧美 | 国产精品99一区二区 | 草久在线| 国产精品国产三级国产aⅴ中文 | 久久国产精品视频 | 亚洲欧美在线免费观看 | 91 视频网站 | 国产精品自在线 | 日韩精品一区二区三区中文在线 | 视频在线h| 九色视频网站 |