找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3515|回复: 2
收起左侧

51单片机利用switch_case语句实现数码管的动态显示程序问题

[复制链接]
ID:836746 发表于 2020-10-30 18:11 | 显示全部楼层 |阅读模式
刚刚才开始接触单片机,
今天学到利用switch-case语句实现数码管的动态显示以及多参数的分时显示,
不知道为啥第二个和第四个数码管一直没有办法显示,
希望各位大佬能帮忙看看

B7048E01-73A4-4806-A06F-09F7A81DF653.png

第二个数码管和第四个数码管一直无法显示

主调函数: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



回复

使用道具 举报

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 单片机教程网

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