找回密码
 立即注册
查看: 817|回复: 4

学习冲哥视频,数码管显示遇到问题

[复制链接]
  • TA的每日心情
    开心
    3 天前
  • 签到天数: 75 天

    [LV.6]常住居民II

    11

    主题

    148

    回帖

    434

    积分

    中级会员

    积分
    434
    发表于 2023-3-29 08:25:47 | 显示全部楼层 |阅读模式
    本帖最后由 lclbf 于 2023-3-29 08:39 编辑

    没有对应硬件的开发箱。开始是自己搭接的数码管电路。在我的冲哥视频学习笔记(https://www.stcaimcu.com/forum.php?mod=viewthread&tid=1083&extra=)贴里面有图片。

    发贴目的,希望大侠帮我指点一下!!!

    我搭接的电路和开发箱电路一样,只有四位数码管。后面改用了降龙棍加金沙滩开发板学习,数码管和LED显示遇到显示不正确的问题。
    下面是降龙棍和金沙滩(STC89C52)对应管脚的区别(来源降龙棍管方电路图和金沙滩开发板对比):

    金沙滩+降龙棍
    降龙棍和金沙滩STC89C52引脚对应

    STC89C52     降龙棍
            P00                                          P00        
            P01                                                P01
            P02                                                P02
            P03                                                P03
            P04                                                P04
            P05                                                P05
            P06                                                P06
            P07                                                P07

            P10                                                P10
            P11                                                P11
            P12                                                P52 串100R电阻
            P13                                                P13
            P14                                          P14
            P15                                                P15
            P16                                                P16
            P17                                                P17

            P20                                                P20
            P21                                                P21
            P22                                                P22
            P23                                                P23
            P24                                                P24
            P25                                                P25
            P26                                                P26
            P27                                                P27

            P30                                                P46  RXD2          P30        RXD1用于USB D-下载程序
            P31                                                P47  TXD2                P31        TXD1用于USB D+下载程序
            P32                                                P32
            P33                                                P33
            P34                                                P34
            P35                                                P35
            P36                                                P36/WR_P42 两脚都串100R电阻 使用P36口讲其设置为弱上拉,P42设置为高阻输入;使用P42口讲其设置为弱上拉,P36设置为高阻输入
            P37           P37/WR_P44 两脚都串100R电阻 使用P37口讲其设置为弱上拉,P44设置为高阻输入;使用P44口讲其设置为弱上拉,P37设置为高阻输入
            

    下面是相关部分电路图,后面附件有原图。
    数码管和LED显示部分:
    学习冲哥视频,数码管显示遇到问题-1.png
    单片机部分:
    学习冲哥视频,数码管显示遇到问题-2.png
    接口电路部分:
    学习冲哥视频,数码管显示遇到问题-3.png
    现在来说我遇到的问题:
    数码管动态扫描显示012345,中间两位显示错误(错误显示:8.),LED显示全亮。
    下面是我数码管和LED显示部分代码:

    #include "seg_led.h"

    u8 SegLED [21] = {
                    0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,
              0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10,0XFF
    };//共阳数码管0-9显示代码,0-9带点显示代码

    u8 SegTex[7] = {0X89,0XF1,0XC7,0XA3,0X8C,0XC1,0XCE};//共阳数码管H J L o P U r显示代码
    //u8 WeiLed[5] = {0XEF,0XF7,0XFB,0XFD,0XF9};//数码管位选控制最高到位到最低位
    //u8 ShowLed[4] = {1,2,3,4};

    u8 bdata LED_DAT = 0X0F;

    sbit LED0 = LED_DAT^0; //LED0定义
    sbit LED1 = LED_DAT^1; //LED1定义
    sbit LED2 = LED_DAT^2; //LED2定义
    sbit LED3 = LED_DAT^3; //LED3定义
    sbit LED4 = LED_DAT^4; //LED4定义
    sbit LED5 = LED_DAT^5; //LED5定义
    sbit LED6 = LED_DAT^6; //LED6定义
    sbit LED7 = LED_DAT^7; //LED7定义

    /*****************************************************
    函数名称:SEG_LED_Show
    函数功能:循环刷新6个数码管和8个LED
    入口参数:无
    函数返回:无
    当前版本:VER1.0
    修改日期:2023.3.28
    当前作者:
    其他备注:
    *******************************************************/
    void SEG_LED_Show( void )
    {
            static u8 i = 0;
           
            switch(i)
            {
                    case 0:ADDR2=0;ADDR1=0;ADDR0=0;i++;SEG_SEG=SegLED[0];break;
                    case 1:ADDR2=0;ADDR1=0;ADDR0=1;i++;SEG_SEG=SegLED[1];break;
                    case 2:ADDR2=0;ADDR1=1;ADDR0=0;i++;SEG_SEG=SegLED[2];break;
                    case 3:ADDR2=0;ADDR1=1;ADDR0=1;i++;SEG_SEG=SegLED[3];break;
                    case 4:ADDR2=1;ADDR1=0;ADDR0=0;i++;SEG_SEG=SegLED[4];break;
                    case 5:ADDR2=1;ADDR1=0;ADDR0=1;i++;SEG_SEG=SegLED[5];break;
                    case 6:ADDR2=1;ADDR1=1;ADDR0=0;i=0;SEG_SEG=LED_DAT;break;
                    default:break;
            }
           
    }

    主函数代码:

    void main()
    {       

            ADDR3 = 1;
            ENLED = 0;

            sys_init();
            usb_init();  //USB初始化
            Timer0_Init();
            EA = 1;
           
            while (1)
            {
                    if( DeviceState != DEVSTATE_CONFIGURED )
                            continue;
                    if( bUsbOutReady )                                                               
                    {
                            usb_OUT_done();                               
                    }
                   
                    if(TIM_10MS_Flag == 1)
                    {
                            TIM_10MS_Flag = 0;
                    }
                   
            }
    }       


    中断函数(在这里实现LED和数码管扫描):

    void Timer0_Isr(void) interrupt 1
    {
            static timcount = 0;
           
            timcount++;      //1ms+1
            if(timcount>=10) //如果这个变量大于等于10,10ms计数到达
            {
                    timcount = 0;
                    TIM_10MS_Flag = 1; //10ms时间到了
            }
                    SEG_LED_Show();       

    }

    系统初始化函数:

    void sys_init()
    {
            WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
            EAXFR = 1; //扩展寄存器(XFR)访问使能
            CKCON = 0; //提高访问XRAM速度

            P0M0 = 0XFF;
            P0M1 = 0X00;
            P1M0 = 0X00;
            P1M1 = 0X00;
            P2M0 = 0X00;
            P2M1 = 0X00;       
            P3M0 = 0X00;
            P3M1 = 0X00;
            P4M0 = 0X00;
            P4M1 = 0X00;
            P5M0 = 0XFF;
            P5M1 = 0X00;
            P6M0 = 0X00;
            P6M1 = 0X00;
            P7M0 = 0X00;
            P7M1 = 0X00;       
           
           
            P3M0 &= ~0x03;
      P3M1 |= 0x03;
           
            //设置USB使用的时钟源
            IRC48MCR = 0x80;    //使能内部48M高速IRC
            while (!(IRC48MCR & 0x01));  //等待时钟稳定

            USBCLK = 0x00;        //使用CDC功能需要使用这两行,HID功能禁用这两行。
      USBCON = 0x90;
    }


    在初始化函数中,若是将用到的P0口和P5口设置为准双向口,数码管显示最高位和次高位位98,数码管部分亮;
    若是将P0口和P5口设置为推挽输出,数码管全亮,LED全亮,LED不受初始化值控制,数码管中间两位显示0.和
    设置的初始值不一样。
    写到这里我突然想到还有P1也用到了,我设置成准双向口了,是不是用到的P0,P1,P5口都要设置为推挽输出,】
    晚上我测试一下看是不我现在想到的问题。

    KST-51开发板原理图.pdf

    111.52 KB, 下载次数: 38

    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 08:07
  • 签到天数: 97 天

    [LV.6]常住居民II

    40

    主题

    1004

    回帖

    6928

    积分

    荣誉版主

    冲哥视频教程和各种开源资料QQ交流群884047237,可群

    积分
    6928
    QQ
    发表于 2023-3-29 09:29:00 | 显示全部楼层
    大致看了一下你的图,引脚用的P0和P1.0-1.4,来说说问题,“数码管动态扫描显示012345,中间两位显示错误(错误显示:8.),LED显示全亮。”
    可以尝试先静态点亮每一个位,看看是不是电平逻辑有误区,如果静态每一个都能正确点亮,再找代码这两个对应的位选输出有问题。
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    551

    主题

    9420

    回帖

    1万

    积分

    管理员

    积分
    13985
    发表于 2023-3-29 10:23:31 | 显示全部楼层
    看冲哥视频就买个冲哥视频的实验箱,也不贵,但立即高效学习 32位8051了,多好
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 75 天

    [LV.6]常住居民II

    11

    主题

    148

    回帖

    434

    积分

    中级会员

    积分
    434
     楼主| 发表于 2023-3-29 10:58:32 | 显示全部楼层
    电子DIY小家 发表于 2023-3-29 09:29
    大致看了一下你的图,引脚用的P0和P1.0-1.4,来说说问题,“数码管动态扫描显示012345,中间两位显示错误( ...

    按照我现在的程序,在显示函数里面改成静态显示也是错误的,我不用显示函数,在主函数里面自己静态一位位的现在是正确的。
    主函数如下操作:
    ADDR0 = 1;
    ADDR1 = 1;
    ADDR2 = 0;
    ADDR3 = 1;
    ENLED = 0;

    SEG_SEG=SegLED[2];
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 75 天

    [LV.6]常住居民II

    11

    主题

    148

    回帖

    434

    积分

    中级会员

    积分
    434
     楼主| 发表于 2023-3-30 17:06:47 | 显示全部楼层
    谢谢你的解答。找到问题了,是初始化IO口的问题。要把使用的脚初始化为推挽输出。
    系统初始化函数:

    void sys_init()
    {
            WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
            EAXFR = 1; //扩展寄存器(XFR)访问使能
            CKCON = 0; //提高访问XRAM速度

            P0M0 = 0XFF;  //设置P0口为推挽输出,驱动数码管段
            P0M1 = 0X00;
            P1M0 = 0XFF;  //设置P1口为推挽输出,驱动数码管位
            P1M1 = 0X00;
            P2M0 = 0X00;
            P2M1 = 0X00;      
            P3M0 = 0X00;
            P3M1 = 0X00;
            P4M0 = 0X00;
            P4M1 = 0X00;
            P5M0 = 0X04; //设置P52口为推挽输出,驱动数码管段
            P5M1 = 0X00;
            P6M0 = 0X00;
            P6M1 = 0X00;
            P7M0 = 0X00;
            P7M1 = 0X00;      
          
          
            P3M0 &= ~0x03;
      P3M1 |= 0x03;
          
            //设置USB使用的时钟源
            IRC48MCR = 0x80;    //使能内部48M高速IRC
            while (!(IRC48MCR & 0x01));  //等待时钟稳定

            USBCLK = 0x00;        //使用CDC功能需要使用这两行,HID功能禁用这两行。
           USBCON = 0x90;
    }

    1.png
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-14 04:41 , Processed in 0.086829 second(s), 47 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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