欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機利用switch_case語句實現數碼管的動態顯示程序問題

[復制鏈接]
跳轉到指定樓層
樓主
剛剛才開始接觸單片機,
今天學到利用switch-case語句實現數碼管的動態顯示以及多參數的分時顯示,
不知道為啥第二個和第四個數碼管一直沒有辦法顯示,
希望各位大佬能幫忙看看



第二個數碼管和第四個數碼管一直無法顯示

主調函數:main.c

#include<reg51.h>
#include"delay.h"
#include"display.h"
unsigned char wnd   ; //窗口變量
unsigned char parm1 = 44 ; //每一個窗口變量下設一個參數
unsigned char parm2 = 55 ;
unsigned char parm3 = 66 ;
unsigned char parm4 = 77 ;
void dis_service() ;
void main()
{
   unsigned int i ;
   for(i=0 ; i<5000 ; i++)
   {
     Display() ;
   }
   while(1)
   {
      dis_service();
         }

}
//應用層的功能函數
void dis_service()
{
unsigned int i ;     
switch(wnd) //窗口變量默認(初始化)為0
         {
           case 0 :
                LEDBUF[0] = 0;
                        LEDBUF[1] = 22;
                        LEDBUF[2] = parm1/10;
                        LEDBUF[3] = parm1%10;
                     for(i=0 ; i<5000 ; i++)
            {
               Display() ;
            }           
                        wnd++ ;
                        break ;
           case 1 :
                LEDBUF[0] = 0;
                        LEDBUF[1] = 22;
                        LEDBUF[2] = parm2/10;
                        LEDBUF[3] = parm2%10;
                     for(i=0 ; i<5000 ; i++)
            {
               Display() ;
            }           
                        wnd++ ;
                        break ;               
           case 2 :
                LEDBUF[0] = 0;
                        LEDBUF[1] = 22;
                        LEDBUF[2] = parm3/10;
                        LEDBUF[3] = parm3%10;
                     for(i=0 ; i<5000 ; i++)
            {
               Display() ;
            }           
                        wnd++ ;
                        break ;               
           case 3 :
                LEDBUF[0] = 0;
                        LEDBUF[1] = 22;
                        LEDBUF[2] = parm4/10;
                        LEDBUF[3] = parm4%10;
                     for(i=0 ; i<5000 ; i++)
            {
               Display() ;
            }           
                        wnd = 0 ;
                        break ;               
           default : break ;
           }

底層數碼管的驅動函數:display.c

#include"display.h"
#include"delay.h"

unsigned char code leddata [] = {                                                                        

                    0x3F,   //"0"
                0x06,  //"1"
                0x5B,  //"2"
                0x4F,  //"3"
                0x66,  //"4"
                0x6D,  //"5"
                0x7D,  //"6"
                0x07,  //"7"
                0x7F,  //"8"
                0x6F,  //"9"
                0x77,  //"A"
                0x7C,  //"B"
                0x39,  //"C"
                0x5E,  //"D"
                0x79,  //"E"
                0x71,  //"F"
                0x76,  //"H"
                0x38,  //"L"
                0x37,  //"n"
                0x3E,  //"u"
                0x73,  //"P"
                0x5C,  //"o"
                0x40,  //"-"
                0x00,  //熄滅
                0x00  //自定義
                                                            };

unsigned char LEDBUF [] ={8,8,8,8} ;                                                   
unsigned char code PLACE_CODE[] = {0xfe,0xfd,0xfb,0xf7};               

void Display ()         
{
   unsigned char i ;
   switch(i)
   {
     case 0 :
             GPIO_DIG   = leddata[LEDBUF[0]] ;
                 GPIO_PLACE = PLACE_CODE[0]        ;
                 DelayXms(1);
                 GPIO_DIG = 0x00 ;
                 i++ ;
                 break ;
        case 1 :
             GPIO_DIG   = leddata[LEDBUF[1]] ;
                 GPIO_PLACE = PLACE_CODE[1]        ;
                 DelayXms(1);
                 GPIO_DIG = 0x00;
               i++ ;
                 break;
         case 2 :
             GPIO_DIG   = leddata[LEDBUF[2]] ;
                 GPIO_PLACE = PLACE_CODE[2]        ;
                 DelayXms(1);
                 GPIO_DIG = 0x00 ;
                 i++ ;
                 break ;
         case 3 :
             GPIO_DIG   = leddata[LEDBUF[3]] ;
                 GPIO_PLACE = PLACE_CODE[3]        ;
                 DelayXms(1);
                 GPIO_DIG = 0x00 ;
                 i = 0 ;
         default : break ;
   }
         i++;            
         if(N == i)
         i = 0 ;
}


函數的聲明:delay.h

#ifndef __DISPLAY_H__
#define __DISPLAY_H__

#include<reg51.h>

/*宏定義*/
//IO的聲明
#define GPIO_DIG      P0  
#define GPIO_PLACE    P2  //

#define N             4   

unsigned char code leddata [] ;
extern unsigned char LEDBUF [] ;

void Display() ;


#endif



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:213173 發表于 2020-10-31 06:30 | 只看該作者
樓主把P2作紅色數碼管的段驅動,P2.0~2.3作藍色數碼管的位驅動。由于紅色數碼管的公共端接地,在硬件電路不改變的情況下無法消除相互干擾。其實可以合并按5位數碼管寫程序,段碼共用P0,位碼P2.0~2.4。當然也可以只改紅色數碼管的公共端接某空閑端口實現P2共用,分時控制。樓主注意,此仿真軟件用于數碼管動態顯示時對消隱很敏感,處理不好會出現異常。
回復

使用道具 舉報

板凳
ID:712493 發表于 2020-10-31 08:50 | 只看該作者
wulin 發表于 2020-10-31 06:30
樓主把P2作紅色數碼管的段驅動,P2.0~2.3作藍色數碼管的位驅動。由于紅色數碼管的公共端接地,在硬件電路不 ...

消隱是哪個時間段
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表