基于8位数码管的电子时钟显示,数码管的数字显示不正常,比如正常显示1,但是我的则显示E,为什么?问题图片如下,代码如下。

img


#include <REGX52.H>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
uchar shi,ge,nummiao,num1,num2,num3,num4,num5,num6;
uchar shi2,shi1,fen2,fen1,miao2,miao1,count,fen,miao,shizhong;
uchar shuzi[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay()
{
    uint i;
    for(i=50;i>0;i--);
}
void init()
{
    TMOD=0x01;
    TH0=(65536-45872)/256;
    TL0=(65536-45872)%256;
    EA=1;
    ET0=1;
    TR0=1;
}
void time0() interrupt 1
{
        TH0=(65536-45872)/256;
        TL0=(65536-45872)%256;
    count++;
    if(count>20)
    {
        count=0;
        miao++;
        if(miao>60)
        {
            miao=0;
            fen++;
            if(fen>60)
            {
                fen=0;
                shizhong++;
                if(shizhong>24)
                {
                    shizhong=0;
                }
            }
        }
    }
    miao2=miao/10;
    miao1=miao%10;
    fen2=fen/10;
    fen1=fen%10;
    shi2=shizhong/10;
    shi1=shizhong%10;
}
void display(uchar shi2,uchar shi1,uchar fen2,uchar fen1,uchar maio2,uchar maio1)
{
    dula=0;    
    P0=shuzi[shi2];
    dula=1;
    dula=0;
    P0=0xff;
    wela=0;
    P0=0xfe;
    wela=1;
    wela=0;
    delay();
    
        
    P0=shuzi[shi1];
    dula=1;
    dula=0;
    P0=0xff;
    P0=0xfd;
    wela=1;
    wela=0;
    delay();
    

    P0=shuzi[fen2];
    dula=1;
    dula=0;
    P0=0xff;
    P0=0xfb;
    wela=1;
    wela=0;
    delay();

    P0=shuzi[fen1];
    dula=1;
    dula=0;
    P0=0xff;
    P0=0xf7;
    wela=1;
    wela=0;
    delay();
    
    
    P0=shuzi[miao2];
    dula=1;
    dula=0;
    P0=0xff;
    P0=0xef;
    wela=1;
    wela=0;
    delay();
    
    
    
    P0=shuzi[maio1];
    dula=1;
    dula=0;
    P0=0xff;
    P0=0xdf;
    wela=1;
    wela=0;
    delay();
}
void main()
{
    init();
    while(1)
    {
        display(shi2,shi1,fen2,fen1,miao2,miao1);
    }
}>


单个的调试每个字符,怀疑是是段选编码有问题!

1,检查显示编码和连接线序是否匹配
2,中断里改变的全局变量,建议定义的时候加上volatile,比如程序里的shi fen miao

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/357350
  • 这篇博客也不错, 你可以看下基于单片机智能超声波避障小车显示控制设计(毕设资料)
  • 除此之外, 这篇博客: 数码管显示实验、按键控制实验中的 数码管显示实验 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    共阳极数码管,8个LED的阳极全部并联到一起引出连接+5V。点亮对应的数码管段给低电平,反之熄灭给高电平。
    在这里插入图片描述
    在这里插入图片描述

    新建数码管SMG文件,用于装相关的驱动文件(smg.c)和头文件(smg.h)。

    smg.c

    #include "smg.h"
    
    
    void SMG_Init()    //初始化数码管
    {
    	GPIO_InitTypeDef GPIO_InitStructure;  //声明结构体变量用于初始化GPIO
    	
    	RCC_APB2PeriphClockCmd(SMG_PORT_RCC,ENABLE);//开启GPIO时钟    SMG_PORT_RCC=RCC_APB2Periph_GPIOC
    
    	
    	/*配置GPIO模式和IO口 */
    	GPIO_InitStructure.GPIO_Pin=SMG_PIN; //选择IO口引脚
    	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
    	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    	GPIO_Init(SMG_PORT,&GPIO_InitStructure);//初始化GPIO  SMG_PORT =GPIOC 
    }
    
    
    

    smg.h

    #ifndef _smg_H
    #define _smg_H
    
    #include "system.h"
    
    
    
    #define SMG_PORT 			GPIOC   
    #define SMG_PIN 			(GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7)
    #define SMG_PORT_RCC		RCC_APB2Periph_GPIOC
    
    
    void SMG_Init(void);//
    
    
    #endif
    
    

    主函数:

    #include "system.h"  //位带操作宏定义
    #include "SysTick.h"   //定时器宏定义
    #include "led.h"   //LED端口、引脚宏定义
    #include "smg.h"   //数码管驱动文件内宏定义
    
    u8 smgduan[16]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,
                 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71};// 数码管显示0-F时对应的数码管数据
    
    int main()
    {
    	u8 i=0;
    	SysTick_Init(72);//精确延时定时器初始化函数
    	LED_Init();
    	SMG_Init();
    	
    	while(1)
    	{
    		for(i=0;i<16;i++)
    		{
    			GPIO_Write(SMG_PORT,(u16)(~smgduan[i]));
    			delay_ms(1000);	//延迟1000ms
    		}	  
    	}
    }
    
    
  • 您还可以看一下 杨春鹏老师的微信小程序全集课程中的 图片组件_等比例缩放小节, 巩固相关知识点

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^