找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2797|回復(fù): 14
收起左側(cè)

關(guān)于使用東軟軟件單片機(jī)點(diǎn)亮使用74HC595級聯(lián)數(shù)碼管程序問題

[復(fù)制鏈接]
ID:61632 發(fā)表于 2023-10-12 19:37 | 顯示全部樓層 |閱讀模式
50黑幣
數(shù)碼管顯示亂碼,幫忙分析下原因:
#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);//串行數(shù)據(jù)入DS...............
/**************************************************************************************
****
****
****
****
***************************************************************************************/

void Smg_Init( )
{
    ANSL = 0xFF;        //選擇對應(yīng)端口為數(shù)字IO功能
        ANSH = 0xFF;        //選擇對應(yīng)端口為數(shù)字IO功能
    PAT = 0x00;         //所有IO設(shè)為輸出低電平
    PBT = 0x00;
    PCT = 0x00;
    PA = 0x00;
    PB = 0x00;
    PC = 0x00;
        //PB6=0;
}
/*************************************************************************************************
****函數(shù)名:                SMG_Write_Bite (u8 dat,u8 dat1)
****功能                        寫入數(shù)據(jù)
****
****
***************************************************************************************************/
void SMG_Write_Byte (u8 dat,u8 dat1)
{
        u8 i;
        for(i=0;i<8;i++)
        {
                //((dat<<i)&0x80)? DIO_HIGH:DIO_LOW;                                //        三目運(yùn)算
                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;                                //        三目運(yùn)算
                //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)//串行數(shù)據(jù)入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"
/******************************************************
函數(shù)名:void RAMclear(void)
描  述:RAM區(qū)數(shù)據(jù)清零,RAM區(qū)地址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);
               
        }
}

74HC595級聯(lián)

74HC595級聯(lián)

最佳答案

查看完整內(nèi)容

void SMG_Write_Byte (u8 dat,u8 dat1)有錯誤
回復(fù)

使用道具 舉報(bào)

ID:384109 發(fā)表于 2023-10-12 19:37 | 顯示全部樓層
void SMG_Write_Byte (u8 dat,u8 dat1)有錯誤
回復(fù)

使用道具 舉報(bào)

ID:143767 發(fā)表于 2023-10-13 10:06 | 顯示全部樓層
東軟的軟件是什么軟件?
回復(fù)

使用道具 舉報(bào)

ID:372579 發(fā)表于 2023-10-13 12:26 | 顯示全部樓層
這個軟件還真沒用過,不過數(shù)碼管顯示亂,可能是引腳和程序不對,數(shù)碼管真值不對等等,要先查查硬件電路
回復(fù)

使用道具 舉報(bào)

ID:332444 發(fā)表于 2023-10-13 14:04 | 顯示全部樓層
代碼中用發(fā)送8個數(shù)據(jù)為一次,發(fā)送16個數(shù)據(jù)分為2次發(fā)送8個數(shù)據(jù)即可。
回復(fù)

使用道具 舉報(bào)

ID:69038 發(fā)表于 2023-10-13 14:20 | 顯示全部樓層
595這么友善的器件,一般是不會有問題的,即使有問題,單步跟蹤一下,基本上就能排除問題了。
回復(fù)

使用道具 舉報(bào)

ID:61632 發(fā)表于 2023-10-13 16:42 | 顯示全部樓層
dj3365191 發(fā)表于 2023-10-13 10:06
東軟的軟件是什么軟件?

iDesigner4.1這個軟件,國產(chǎn)的MCU,想學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

ID:61632 發(fā)表于 2023-10-13 16:45 | 顯示全部樓層
xianfajushi 發(fā)表于 2023-10-13 14:04
代碼中用發(fā)送8個數(shù)據(jù)為一次,發(fā)送16個數(shù)據(jù)分為2次發(fā)送8個數(shù)據(jù)即可。

我也感覺是void SMG_Write_Byte (u8 dat,u8 dat1)這段代碼里出現(xiàn)問題了,因?yàn)檫@個是我STM32里用過的,移植修改的,結(jié)果出現(xiàn)了亂碼。感謝你的建議,后面會按照你的想法測試一下。
回復(fù)

使用道具 舉報(bào)

ID:61632 發(fā)表于 2023-10-13 16:47 | 顯示全部樓層
aide51 發(fā)表于 2023-10-13 12:26
這個軟件還真沒用過,不過數(shù)碼管顯示亂,可能是引腳和程序不對,數(shù)碼管真值不對等等,要先查查硬件電路

74HC595級聯(lián)的數(shù)碼管是一個成品模塊;不存在問題;引腳的設(shè)置,也沒有問題。
回復(fù)

使用道具 舉報(bào)

ID:69038 發(fā)表于 2023-10-13 17:06 | 顯示全部樓層
595的SDA數(shù)據(jù)是在SCK的上升沿才鎖存的,所以,你把SMG_Write_Byte 中的SCL=1;SCL=0調(diào)一下?
//595送出串行數(shù)據(jù)
void send_595(char dat)        //595發(fā)送1字節(jié)數(shù)據(jù)
{
    char count1;               //位計(jì)數(shù)器,單字節(jié)為8位
        for (count1=8;count1>0;count1--)
          {       
                hc595_sda=dat & 0x01;  //取最低位數(shù)據(jù)做為串行數(shù)據(jù)位,低位先發(fā),若高位先發(fā),則dat & 0x80
                hc595_sck=0;           //置SCK為低
                Delay10us();           //延時
                hc595_sck=1;               //置SCK為高
                Delay10us();               //延時,輸出一個位的數(shù)據(jù)
                dat>>=1;               //數(shù)據(jù)右移,下一個位的數(shù)據(jù),若高位先發(fā)則dat<<=1
          }
}
回復(fù)

使用道具 舉報(bào)

ID:332444 發(fā)表于 2023-10-13 17:12 | 顯示全部樓層
我今天回復(fù)了個挺好玩的16燈逐一點(diǎn)亮,注意代碼中的10和18的值,讓大家娛樂鑒賞,電路圖就不提供了吖,其實(shí)提問16等和切換的不少,這里就都有了吖。
1.png
回復(fù)

使用道具 舉報(bào)

ID:1095802 發(fā)表于 2023-10-14 09:52 | 顯示全部樓層
xianfajushi 發(fā)表于 2023-10-13 17:12
我今天回復(fù)了個挺好玩的16燈逐一點(diǎn)亮,注意代碼中的10和18的值,讓大家娛樂鑒賞,電路圖就不提供了吖,其實(shí) ...

這個SY,MY好像都沒啥作用啊
回復(fù)

使用道具 舉報(bào)

ID:332444 發(fā)表于 2023-10-14 20:20 | 顯示全部樓層
殿堂之上 發(fā)表于 2023-10-14 09:52
這個SY,MY好像都沒啥作用啊

有用無用不是紙上談兵,實(shí)際試看就知道了。而且,鑒賞也需要會,這個代碼其實(shí)未優(yōu)化,也是很有意思的,能同步卻也能完成16燈。
回復(fù)

使用道具 舉報(bào)

ID:61632 發(fā)表于 2023-10-17 16:08 | 顯示全部樓層
zhuls 發(fā)表于 2023-10-13 17:06
595的SDA數(shù)據(jù)是在SCK的上升沿才鎖存的,所以,你把SMG_Write_Byte 中的SCL=1;SCL=0調(diào)一下?
//595送出串 ...

很感謝你的建議
回復(fù)

使用道具 舉報(bào)

ID:61632 發(fā)表于 2023-10-17 16:17 | 顯示全部樓層
非常感謝大家的積極幫助和建議,我在這邊把我的結(jié)果奉上:
數(shù)碼管顯示亂碼,幫忙分析下原因:
#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);//串行數(shù)據(jù)入DS...............
/**************************************************************************************
****
****
****
****
***************************************************************************************/

void Smg_Init( )
{
    ANSL = 0xFF;        //選擇對應(yīng)端口為數(shù)字IO功能
        ANSH = 0xFF;        //選擇對應(yīng)端口為數(shù)字IO功能
    PAT = 0x00;         //所有IO設(shè)為輸出低電平
    PBT = 0x00;
    PCT = 0x00;
    PA = 0x00;
    PB = 0x00;
    PC = 0x00;
        //PB6=0;
}
/*************************************************************************************************
****函數(shù)名:                SMG_Write_Bite (u8 dat,u8 dat1)
****功能                        寫入數(shù)據(jù)
****
****
***************************************************************************************************/
void SMG_Write_Byte (u8 dat,u8 dat1)
{
        u8 i;
        for(i=0;i<8;i++)
        {
                //((dat<<i)&0x80)? DIO_HIGH:DIO_LOW;                                //        三目運(yùn)算
                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;                                //        三目運(yùn)算
                //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);//數(shù)碼管顯示公式進(jìn)行了更改
                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)//串行數(shù)據(jù)入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"
/******************************************************
函數(shù)名:void RAMclear(void)
描  述:RAM區(qū)數(shù)據(jù)清零,RAM區(qū)地址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);
               
        }
}

//結(jié)果更改成這樣之后,數(shù)碼管顯示正常,完全OK

回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表