又是tm1629B的LED显示问题

2019-07-15 08:41发布

使用SH79F166A做上位机控制TM1629B显示LED,数码管计数显示。但是该板写入0X00,或者使用关显示0x80都无法使之熄灭。同时,LED是乱显示的。一个个地址地试也无法得到想要的结果,做不到单个LED单独亮灭,代码如下(请自动忽略其中的触摸按键函数):
#define.h
#ifndef        _DEFINE_H
#define        _DEFINE_H

#include<SH79F166A.h>
#include<intrins.h>

typedef        unsigned char uint8;
typedef        signed char  int8;
typedef        unsigned int uint16;
typedef        signed int        int16;

#define        NOP        _nop_()       
#define        Mode_Auto        0x40
#define        Mode_Manual        0x44
#define        Mode_Disp        0x8F
#define        Read_Key        0x42
#define        Disp_Off        0x80
#define        Start_Addr        0xC0
#define        Power_heart        0xC1
#define        Set_fan                0xC3
#define        UP_SW_time        0xC5
#define        WARM_DOWN        0xC7
#define        HUICHA_Time        0xC8
#define        Temp_AddrH        0xCF
#define        Temp_AddrL        0xCD
#define        Time_HourH        0xC5
#define        Time_HourL        0xC6
#define        Time_MinuH        0xCA
#define        Time_MinuL        0xCB
#define        zero                0x3F
#define        S_F_LED_OFF        0x08
#define        P_H_LED_OFF        0x40
#define        Key_ON                0x10
#define        Heart_ON        0x02               
#define        All                        0x02
#define        ttt                        0x10


sbit        DIO=P3^2;
sbit        CLK=P4^2;
sbit        STB=P1^6;
//sbit        TDI=P1^5;
//sbit        TCK=P1^4;
       

void        LedInit();
uint8         KeyScan();
//void        I2CInit();
void        I2CStop();
void        I2CStart();
void        Timer2Init();
uint8        I2CReadData();
void         DisplayTemp();
void        DisplayTime();
uint8        LedReadData();
uint8        I2CReadData();
void        ReadUartInit();
void        Delay(uint8 t);
void        WriteUartInit();
void        delayus(uint8 t);
void         Display(uint8 Data);
void        DisplayKey(uint8 Key);
void        I2CWriteData(uint8 Data);
void        LedWriteData(uint8 Data);
void        DisplayFunction(uint8 Function);
#endif

#main.c
#include"define.h"


       
extern uint8 FlagTime;


void        main()
{
//        uint8 i;


        P3CR=0xff;
    P3PCR=0x0;
    P3=0x00;


        P4CR=0xff;
    P4PCR=0x0;
    P4=0x00;       


        P1CR=0xff;
        P1PCR=0x0;
        P1=0x00;
        Timer2Init();
        LedInit();
        Display(Disp_Off);
        while(1)
        {
               
                        Display(All);
                //        DisplayTemp();
                //        DisplayTime();
                //        Delay(1);


        }
}




void        Timer2Init()
{
         T2CON=0x00;
         T2MOD=0x00;
         RCAP2H=(65536-50000)/256;
         RCAP2L=(65536-50000)%256;
         TH2=(65536-50000)/256;
         TL2=(65536-50000)%256;
         IEN0|=0xa0;
         EA=1;
         ET2=1;
         TR2=1;
         TF2=0;
}


void timer2()        interrupt        5        //5ms自动重载定时器
{
          static uint8 t;
          t++;
          TF2=0;
          if(t>=10)
          {
                  FlagTime=1;
                t=0;
          }
//          KeyScan();
}       




void        Delay(uint8 t)
{
        uint8 i,j;
        for(;t>0;t--)
        {
                for(i=0;i<255;i++)
                {
                        for(j=0;j<255;j++);
                }
        }
}

#led.c
#include"define.h"


uint8 code digit[]={
0x3F,0x30,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F
};


uint8 FlagTime=0;
uint8 time=0;


void        LedInit()
{
        CLK=1;
        DIO=1;
        STB=1;
}


void        LedWriteData(uint8 Data)
{
        uint8        i;
        STB=0;
        for(i=0;i<8;i++)
        {
          CLK=0;
          if((Data&0x01)==0x01)
          {
                  DIO=1;
          }else
          {
                  DIO=0;
          }
        CLK=1;
        NOP;NOP;NOP;NOP;NOP;
        Data=Data>>1;
        NOP;NOP;NOP;
        }


}


uint8        LedReadData()
{
         uint8 i;
         uint8 ReadData;
         CLK=0;
         DIO=1;
         for(i=0;i<8;i++)
         {
                 CLK=1;                         //上升沿读数据
                ReadData=ReadData>>1;
                 if(DIO==0x01)
                {
                        ReadData|=0x80;
                }
                else{
                        ReadData&=0x7F;
                }
                CLK=0;
                NOP;NOP;NOP;
         }
         DIO=1;
         return ReadData;


}   




void Display(uint8        Data)
{
        uint8        i;
        LedWriteData(Mode_Manual);
        STB=1;
        LedWriteData(Start_Addr);
//        for(i=0;i<1;i++)
//        {
                LedWriteData(Data);
//        }
        STB=1;
        LedWriteData(Mode_Disp);
        STB=1;
}


void        DisplayTime()
{
               
                LedWriteData(Mode_Manual);
                   if(FlagTime==1)
                {
                        time++;
                        FlagTime=0;
                }
                if(time>=0)
                {
                        STB=1;
                        LedWriteData(Time_HourH);
                        LedWriteData(digit[time/60/10]);
                        STB=1;
                        LedWriteData(Time_HourL);
        &n
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。