数码管端选不在同一个IO口 程序改的有问题找不出来

[复制链接]
11524|4
手机看帖
扫描二维码
随时随地手机跟帖
javachen|  楼主 | 2021-9-16 09:50 | 显示全部楼层 |阅读模式

4个数码管就是想显示个0到9  然后显示一个9986  9986延时加1 一直加到9999 清0   但是显示0~9是正常的,9986只显示段选a的那一横 就不动了


#include "reg52.h"
typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;
sbit C1=P2^7;
sbit C2=P2^6;
sbit C3=P2^5;
sbit C4=P2^4;
sbit W0=P1^3;
sbit W1=P1^2;
sbit W2=P0^2;
sbit W3=P0^3;
sbit W4=P0^4;

sbit W5=P0^5;
sbit W6=P0^6;
sbit W7=P0^7;
unsigned char SMGDUAN_CA[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳极0 1 2 3~9

unsigned int count=9986;
void dis(unsigned char i);
void delaySMG(unsigned int n)
{
        while(n--);
}

void dis(unsigned char i)                                      //写入8位数据
{   
    W0=i&0x01;i>>=1;        
    W1=i&0x01;i>>=1;
    W2=i&0x01;i>>=1;
    W3=i&0x01;i>>=1;
    W4=i&0x01;i>>=1;
    W5=i&0x01;i>>=1;
    W6=i&0x01;i>>=1;
    W7=i&0x01;
}
void displaySMG_Bit(unsigned char pos,unsigned char dat)   //显示的哪一位,在什么位置
{  
         //P0=0xff;
         dis(0xff);
        switch(pos)//选择数码管位置
        {
               
                case 1:
                 C1=1; C2=0; C3=0; C4=0;
                 break;
               
                case 2:
                 C1=0; C2=1; C3=0; C4=0;
                 break;
               
                case 3:
                 C1=0; C2=0; C3=1; C4=0;
                 break;
               
                case 4:
                 C1=0; C2=0; C3=0; C4=1;
                 break;
        }
        
              dis(dat);//这边到底怎么调用哈,感觉总不对
                delaySMG(100);
            

        
}



void displaySMG_4Bit(unsigned int dat)
{
        displaySMG_Bit(1,SMGDUAN_CA[dat/1000]);
        delaySMG(100);
        displaySMG_Bit(2,SMGDUAN_CA[dat%1000/100]);
        delaySMG(100);
        displaySMG_Bit(3,SMGDUAN_CA[dat%100/10]);
        delaySMG(100);
        displaySMG_Bit(4,SMGDUAN_CA[dat%10]);
        delaySMG(100);
}
void displaySMG_zeronine()
{
        char S;
        C1=1;
        C2=1;
        C3=1;
        C4=1;
        
        
        for(S=0;S<10;S++)
        {
          dis(SMGDUAN_CA[S]);
        delaySMG(40000);         

        }

}
void delay(unsigned int t)
{
        while(t--)
        {
        displaySMG_4Bit(count);
        }
        
}        

void main()
{  displaySMG_zeronine();
        while(1)
        {
                 displaySMG_4Bit(count);
                 delay(200);
               
                count++;
                if(count==10000)
                {
                        count=0;
                        
                }
               
        }
        
}


使用特权

评论回复

相关帖子

javachen|  楼主 | 2021-9-16 10:51 | 显示全部楼层
有没有大神帮忙看下

使用特权

评论回复
#include "reg52.h"
typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;
sbit C1=P2^7;
sbit C2=P2^6;
sbit C3=P2^5;
sbit C4=P2^4;
/*
sbit W0=P1^3;  //数据最好归结倒一个口线组上去,如果依然保持这个定义,请另行添加程序处理
sbit W1=P1^2;  //   */

sbit W0=P0^0;
sbit W1=P0^1;
sbit W2=P0^2;
sbit W3=P0^3;
sbit W4=P0^4;

sbit W5=P0^5;
sbit W6=P0^6;
sbit W7=P0^7;
unsigned char SMGDUAN_CA[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0x??};//共阳极0 1 2 3~9,最后一位是E显示
unsigned char display_buffer[4];  //显示缓存

unsigned char number = 0;
unsigned char display_place;      //显示位号,可以不初始化
unsigned int len_time = 0;

unsigned int count=9986;

void displaySMG_4Bit(unsigned int dat); //显示数据缓存装载
unsigned char displaySMG_Bit(u8 pos,u8 *dat);  //显示驱动
//void dis(unsigned char i);  //显示  

void delaySMG(unsigned int n)
{
        while(n--);
}


unsigned char displaySMG_Bit(unsigned char pos,unsigned char *dat)   //显示的哪一位,在什么位置
{  
        //显示消隐
        P0 =  0xFF;    //反偏
        P2 &= 0x0F;   
       
        //位显示
        if(pos > 3)  pos = 0;
        P0 = dat[pos];        //先置位显示数据,避免出现鬼影
        P2 |= 1 << (4 + pos);
       
        return pos ++;  //返回增加值,或者这里用一个局部全局私有变量则不需要返回
}



void displaySMG_4Bit(unsigned int dat)
{   //数据线不在一组口编组里这里要分离处理
        if(da > 9999) //错误处理,显示EEEE
        {
        display_buffer[0] = SMGDUAN_CA[10];
                display_buffer[1] = SMGDUAN_CA[10];
                display_buffer[2] = SMGDUAN_CA[10];
                display_buffer[3] = SMGDUAN_CA[10];
        }
        else
        {
                display_buffer[3] = SMGDUAN_CA[dat/1000];      //装载显示千位
                display_buffer[2] = SMGDUAN_CA[dat%1000/100];  //装载显示百位
                display_buffer[1] = SMGDUAN_CA[dat%100/10];    //装载显示十位
                display_buffer[0] = SMGDUAN_CA[dat%10];        //装载显示个位
}   }

void delay_ms(u8 num_ms)
{
}
void delay_s(u8 num_s)
{
}
      

void main()
{  
        //初始化注意有没有方向设置
    while(1)
    {  
                //显示0000~9999 -> EEEE
                for(number = 0; number < 11; number ++)
                {  //非定时器定时,程序延时
                        len_time = 0;
                    displaySMG_4Bit(number*1111);  //显示0000~9999 -> EEEE
                    while(len_time < TemerS)   //自定义显示时间 = TemerS × 10ms  这里取300 = 3秒
                    {
                        display_place = displaySMG_Bit[display_place,  display_buffer];
                        delay_ms(10);   //10ms延时,保证每秒每一位数码管被扫描20次以上,否则会有闪烁,
                }   }
                displaySMG_4Bit(count);  //显示9986
                while(1)
                {
                        display_place = displaySMG_Bit[display_place,  display_buffer];
                        delay_ms(10);
                }
}   }

使用特权

评论回复
javachen|  楼主 | 2021-9-16 17:28 | 显示全部楼层
一事无成就是我 发表于 2021-9-16 16:23
#include "reg52.h"
typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char ...

就是要在不同的IO口 要在同一个口到好了

使用特权

评论回复
用两个数组对应查表,麻烦点就是

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

19

帖子

0

粉丝