找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 912|回复: 14
打印 上一主题 下一主题
收起左侧

关于使用东软软件单片机点亮使用74HC595级联数码管程序问题

[复制链接]
跳转到指定楼层
楼主
50黑币
数码管显示乱码,帮忙分析下原因:
#include "Led_Display.h"
//#include"smg.h"
#include <hic.h>
#include "delay.h"
const char smgduan[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳
//u16 smgduan[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳
//u16 smgduan[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴
u8 DisPlayData[8];
u16 count;
u16 sec,min,hour;
//sbit SCL = (PA1);//时钟脉冲信号——上升沿有效ST
//sbit RCL = (PA3);//打入信号————上升沿有效SH
//sbit DIO = (PA5);//串行数据入DS...............
/**************************************************************************************
****
****
****
****
***************************************************************************************/

void Smg_Init( )
{
    ANSL = 0xFF;        //选择对应端口为数字IO功能
        ANSH = 0xFF;        //选择对应端口为数字IO功能
    PAT = 0x00;         //所有IO设为输出低电平
    PBT = 0x00;
    PCT = 0x00;
    PA = 0x00;
    PB = 0x00;
    PC = 0x00;
        //PB6=0;
}
/*************************************************************************************************
****函数名:                SMG_Write_Bite (u8 dat,u8 dat1)
****功能                        写入数据
****
****
***************************************************************************************************/
void SMG_Write_Byte (u8 dat,u8 dat1)
{
        u8 i;
        for(i=0;i<8;i++)
        {
                //((dat<<i)&0x80)? DIO_HIGH:DIO_LOW;                                //        三目运算
                if((dat<<i)&0x80)
                {
                        DIO=1;
                }
                else
                {
                        DIO=0;
                }
                //SCL_HIGH;
                //SCL_LOW;
                SCL=1;
                //delay_us(10);
                //delay_ms(1);
                //delay(1);
                SCL=0;
        }
        for(i=0;i<8;i++)
        {
                //((dat1<<i)&0x80)? DIO_HIGH:DIO_LOW;                                //        三目运算
                //SCL_HIGH;
                //SCL_LOW;
                if((dat<<i)&0x80)
                {
                        DIO=1;
                }
                else
                {
                        DIO=0;
                }
                SCL=1;
                SCL=0;


        }
        
        //RCL_HIGH;
        //RCL_LOW;
        RCL=1;
        RCL=0;
        
}

void SMG_Number (u16 sec,u16 count)
{

//        {
//                SMG_Write_Byte (smgduan[((sec%1000)%100)%10],0x01);
                SMG_Write_Byte (smgduan[sec%10],0x01);
                //delay_ms(1);
                delay(1);
//                SMG_Write_Byte (smgduan[((sec%1000)%100)/10],0x02);
                SMG_Write_Byte (smgduan[sec/10],0x02);
                //delay_ms(1);
                delay(1);
//                SMG_Write_Byte (smgduan[(sec%1000)/100],0x04);
                SMG_Write_Byte (smgduan[min%10],0x04);
                //delay_ms(1);
                delay(1);
//                SMG_Write_Byte (smgduan[sec/1000],0x08);
                SMG_Write_Byte (smgduan[min/10],0x08);
                //delay_ms(1);
                delay(1);
//        }
//        if(sec>4500)
//        {
//                count++;
//                if(count>9999)
//                {
//                        count=0;
//                }
//        }
//                SMG_Write_Byte (smgduan[((count%1000)%100)%10],0x10);
                SMG_Write_Byte (smgduan[(hour%100)%10],0x10);
                delay(1);                                    
//                SMG_Write_Byte (smgduan[((count%1000)%100)/10],0x20);
                SMG_Write_Byte (smgduan[(hour%100)/10],0x20);
                delay(1);
//                SMG_Write_Byte (smgduan[(count%1000)/100],0x40);
                SMG_Write_Byte (smgduan[hour/100],0x40);
                delay(1);
                SMG_Write_Byte (smgduan[count],0x80);
                delay(1);
        
}
//
#ifndef _LED_DISPLAY_H
#define _LED_DISPLAY_H
#include <hic.h>
#include "typedef.h"


#define SCL  (PA0)//时钟脉冲信号——上升沿有效ST
#define RCL  (PA6)//打入信号————上升沿有效SH
#define DIO  (PA7)//串行数据入DS...............

//typedef   unsigned  char   u8;
//typedef   unsigned  int    u16;
//typedef   unsigned  long   u32;

void        Smg_Init( void);
void        SMG_Number (u16 sec,u16 count);
void        SMG_Write_Byte (u8 dat,u8 dat1);


//typedef uint8_t  u8;

#endif


/*sample.c*/
#include <hic.h>
#include "Led_Display.h"
#include "delay.h"
/******************************************************
函数名:void RAMclear(void)
描  述:RAM区数据清零,RAM区地址0x0000~0x03FF
输入值:无
输出值:无
返回值:无
*******************************************************/
void RAMclear(void)
{
    for (IAAH=0; IAAH<=0x03; IAAH++)
    {
        for (IAAL=0; IAAL<0xFF; IAAL++)
            IAD = 0x00;
        IAD = 0x00;
    }
}

void main()
{
        Smg_Init( );
        //SMG_Number(1000,1000);
        while(1)
        {SMG_Number(1000,1000);
                //SMG_Number(1000,1000);
                //delay_ms(500);
                PB6=0;
                //delay_ms(500);
                delay(100);
                PB6=1;
                delay(100);
               
        }
}

51hei截图_20231012193523.png (111.6 KB, 下载次数: 48)

74HC595级联

74HC595级联

最佳答案

查看完整内容

void SMG_Write_Byte (u8 dat,u8 dat1)有错误
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:384109 发表于 2023-10-12 19:37 | 只看该作者
void SMG_Write_Byte (u8 dat,u8 dat1)有错误
回复

使用道具 举报

板凳
ID:143767 发表于 2023-10-13 10:06 | 只看该作者
东软的软件是什么软件?
回复

使用道具 举报

地板
ID:372579 发表于 2023-10-13 12:26 | 只看该作者
这个软件还真没用过,不过数码管显示乱,可能是引脚和程序不对,数码管真值不对等等,要先查查硬件电路
回复

使用道具 举报

5#
ID:332444 发表于 2023-10-13 14:04 | 只看该作者
代码中用发送8个数据为一次,发送16个数据分为2次发送8个数据即可。
回复

使用道具 举报

6#
ID:69038 发表于 2023-10-13 14:20 | 只看该作者
595这么友善的器件,一般是不会有问题的,即使有问题,单步跟踪一下,基本上就能排除问题了。
回复

使用道具 举报

7#
ID:61632 发表于 2023-10-13 16:42 | 只看该作者
dj3365191 发表于 2023-10-13 10:06
东软的软件是什么软件?

iDesigner4.1这个软件,国产的MCU,想学习学习
回复

使用道具 举报

8#
ID:61632 发表于 2023-10-13 16:45 | 只看该作者
xianfajushi 发表于 2023-10-13 14:04
代码中用发送8个数据为一次,发送16个数据分为2次发送8个数据即可。

我也感觉是void SMG_Write_Byte (u8 dat,u8 dat1)这段代码里出现问题了,因为这个是我STM32里用过的,移植修改的,结果出现了乱码。感谢你的建议,后面会按照你的想法测试一下。
回复

使用道具 举报

9#
ID:61632 发表于 2023-10-13 16:47 | 只看该作者
aide51 发表于 2023-10-13 12:26
这个软件还真没用过,不过数码管显示乱,可能是引脚和程序不对,数码管真值不对等等,要先查查硬件电路

74HC595级联的数码管是一个成品模块;不存在问题;引脚的设置,也没有问题。
回复

使用道具 举报

10#
ID:69038 发表于 2023-10-13 17:06 | 只看该作者
595的SDA数据是在SCK的上升沿才锁存的,所以,你把SMG_Write_Byte 中的SCL=1;SCL=0调一下?
//595送出串行数据
void send_595(char dat)        //595发送1字节数据
{
    char count1;               //位计数器,单字节为8位
        for (count1=8;count1>0;count1--)
          {       
                hc595_sda=dat & 0x01;  //取最低位数据做为串行数据位,低位先发,若高位先发,则dat & 0x80
                hc595_sck=0;           //置SCK为低
                Delay10us();           //延时
                hc595_sck=1;               //置SCK为高
                Delay10us();               //延时,输出一个位的数据
                dat>>=1;               //数据右移,下一个位的数据,若高位先发则dat<<=1
          }
}
回复

使用道具 举报

11#
ID:332444 发表于 2023-10-13 17:12 | 只看该作者
我今天回复了个挺好玩的16灯逐一点亮,注意代码中的10和18的值,让大家娱乐鉴赏,电路图就不提供了吖,其实提问16等和切换的不少,这里就都有了吖。

1.png (19.63 KB, 下载次数: 44)

1.png
回复

使用道具 举报

12#
ID:1095802 发表于 2023-10-14 09:52 | 只看该作者
xianfajushi 发表于 2023-10-13 17:12
我今天回复了个挺好玩的16灯逐一点亮,注意代码中的10和18的值,让大家娱乐鉴赏,电路图就不提供了吖,其实 ...

这个SY,MY好像都没啥作用啊
回复

使用道具 举报

13#
ID:332444 发表于 2023-10-14 20:20 | 只看该作者
殿堂之上 发表于 2023-10-14 09:52
这个SY,MY好像都没啥作用啊

有用无用不是纸上谈兵,实际试看就知道了。而且,鉴赏也需要会,这个代码其实未优化,也是很有意思的,能同步却也能完成16灯。
回复

使用道具 举报

14#
ID:61632 发表于 2023-10-17 16:08 | 只看该作者
zhuls 发表于 2023-10-13 17:06
595的SDA数据是在SCK的上升沿才锁存的,所以,你把SMG_Write_Byte 中的SCL=1;SCL=0调一下?
//595送出串 ...

很感谢你的建议
回复

使用道具 举报

15#
ID:61632 发表于 2023-10-17 16:17 | 只看该作者
非常感谢大家的积极帮助和建议,我在这边把我的结果奉上:
数码管显示乱码,帮忙分析下原因:
#include "Led_Display.h"
//#include"smg.h"
#include <hic.h>
#include "delay.h"
const char smgduan[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳
//u16 smgduan[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳
//u16 smgduan[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴
u8 DisPlayData[8];
u16 count;
u16 sec,min,hour;
//sbit SCL = (PA1);//时钟脉冲信号——上升沿有效ST
//sbit RCL = (PA3);//打入信号————上升沿有效SH
//sbit DIO = (PA5);//串行数据入DS...............
/**************************************************************************************
****
****
****
****
***************************************************************************************/

void Smg_Init( )
{
    ANSL = 0xFF;        //选择对应端口为数字IO功能
        ANSH = 0xFF;        //选择对应端口为数字IO功能
    PAT = 0x00;         //所有IO设为输出低电平
    PBT = 0x00;
    PCT = 0x00;
    PA = 0x00;
    PB = 0x00;
    PC = 0x00;
        //PB6=0;
}
/*************************************************************************************************
****函数名:                SMG_Write_Bite (u8 dat,u8 dat1)
****功能                        写入数据
****
****
***************************************************************************************************/
void SMG_Write_Byte (u8 dat,u8 dat1)
{
        u8 i;
        for(i=0;i<8;i++)
        {
                //((dat<<i)&0x80)? DIO_HIGH:DIO_LOW;                                //        三目运算
                if((dat<<i)&0x80)
                {
                        DIO=1;
                }
                else
                {
                        DIO=0;
                }
                //SCL_HIGH;
                //SCL_LOW;
                SCL=1;
                //delay_us(10);
                //delay_ms(1);
                //delay(1);
                SCL=0;
        }
        for(i=0;i<8;i++)
        {
                //((dat1<<i)&0x80)? DIO_HIGH:DIO_LOW;                                //        三目运算
                //SCL_HIGH;
                //SCL_LOW;
                if((dat1<<i)&0x80)//这个原写成dat,修改成dat1;
                {
                        DIO=1;
                }
                else
                {
                        DIO=0;
                }
                SCL=1;
                SCL=0;


        }
        
        //RCL_HIGH;
        //RCL_LOW;
        RCL=1;
        RCL=0;
        
}

void SMG_Number (u16 sec,u16 count)
{

        {
                SMG_Write_Byte (smgduan[((sec%1000)%100)%10],0x01);//数码管显示公式进行了更改
                delay(1);
                SMG_Write_Byte (smgduan[((sec%1000)%100)/10],0x02);
                delay(1);
                SMG_Write_Byte (smgduan[(sec%1000)/100],0x04);
                delay(1);
                SMG_Write_Byte (smgduan[sec/1000],0x08);
                delay(1);
        }
//        if(sec>4500)
//        {
//                count++;
//                if(count>9999)
//                {
//                        count=0;
//                }
//        }
//                SMG_Write_Byte (smgduan[((count%1000)%100)%10],0x10);
//                 SMG_Write_Byte (smgduan[(hour%100)%10],0x10);
//                delay(1);                                    
//                SMG_Write_Byte (smgduan[((count%1000)%100)/10],0x20);
//                 SMG_Write_Byte (smgduan[(hour%100)/10],0x20);
//                delay(1);
//               SMG_Write_Byte (smgduan[(count%1000)/100],0x40);
//                 SMG_Write_Byte (smgduan[hour/100],0x40);
//                 delay(1);
//                 SMG_Write_Byte (smgduan[count],0x80);
//                 delay(1);
        
}

#ifndef _LED_DISPLAY_H
#define _LED_DISPLAY_H
#include <hic.h>
#include "typedef.h"


#define SCL  (PA0)//时钟脉冲信号——上升沿有效ST
#define RCL  (PA6)//打入信号————上升沿有效SH
#define DIO  (PA7)//串行数据入DS...............

//typedef   unsigned  char   u8;
//typedef   unsigned  int    u16;
//typedef   unsigned  long   u32;

void        Smg_Init( void);
void        SMG_Number (u16 sec,u16 count);
void        SMG_Write_Byte (u8 dat,u8 dat1);


//typedef uint8_t  u8;

#endif


/*sample.c*/
#include <hic.h>
#include "Led_Display.h"
#include "delay.h"
/******************************************************
函数名:void RAMclear(void)
描  述:RAM区数据清零,RAM区地址0x0000~0x03FF
输入值:无
输出值:无
返回值:无
*******************************************************/
void RAMclear(void)
{
    for (IAAH=0; IAAH<=0x03; IAAH++)
    {
        for (IAAL=0; IAAL<0xFF; IAAL++)
            IAD = 0x00;
        IAD = 0x00;
    }
}

void main()
{
        Smg_Init( );
        //SMG_Number(1000,1000);
        while(1)
        {SMG_Number(1000,1000);
                //SMG_Number(1000,1000);
                //delay_ms(500);
                PB6=0;
                //delay_ms(500);
                delay(100);
                PB6=1;
                delay(100);
               
        }
}

//结果更改成这样之后,数码管显示正常,完全OK

回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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