代码,还是代码 ——TM1629B驱动

2020-01-23 14:41发布

#define                BIT0                0x01
#define                BIT1                0x02
#define                BIT2                0x04
#define                BIT3                0x08
#define                BIT4                0x10
#define                BIT5                0x20
#define                BIT6                0x40
#define                BIT7                0x80


#define                LNumb_a                BIT7
#define                LNumb_b                BIT5
#define                LNumb_c                BIT0
#define                LNumb_d                BIT2
#define                LNumb_e                BIT3
#define                LNumb_f                BIT6
#define                LNumb_g                BIT4
#define                LNumb_x                BIT1

uint8 DisplayBuff[MaxWordBuff];    //显示缓冲区 存放原始字形
uint8 FlashBuff[MaxWordBuff];      //闪烁缓冲区 存放同DisplayBuff 哪一位闪烁 就清零该位缓冲区
uint8 xDat[16]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //最终写入1629的代码

uint8 FlashBit;                          //闪烁位
bit FlashSwitch;                         //闪烁开关
bit RefreshBit;                                //刷新标志
uint8 FlashTime;
bit ReadKey;                                //读键标志
void Flash_Fun(void);                  


extern uint8 *pDisplay;
code uint8 NumTAB[] =
{
        LNumb_a+LNumb_b+LNumb_c+LNumb_d+LNumb_e+LNumb_f,                        // 0
        LNumb_b+LNumb_c,                                                        // 1
        LNumb_a+LNumb_b+LNumb_d+LNumb_e+LNumb_g,                                // 2
        LNumb_a+LNumb_b+LNumb_c+LNumb_d+LNumb_g,                                // 3
        LNumb_b+LNumb_c+LNumb_f+LNumb_g,                                        // 4
        LNumb_a+LNumb_c+LNumb_d+LNumb_f+LNumb_g,                                // 5
        LNumb_a+LNumb_c+LNumb_d+LNumb_e+LNumb_f+LNumb_g,                        // 6
        LNumb_a+LNumb_b+LNumb_c,                                                // 7
        LNumb_a+LNumb_b+LNumb_c+LNumb_d+LNumb_e+LNumb_f+LNumb_g,                // 8
        LNumb_a+LNumb_b+LNumb_c+LNumb_d+LNumb_f+LNumb_g,                        // 9
};
code  uint8 ASCIITAB[]={
        LNumb_a+LNumb_b+LNumb_c+LNumb_e+LNumb_f+LNumb_g,                                // a
        LNumb_c+LNumb_d+LNumb_e+LNumb_f+LNumb_g,                                        // b
        LNumb_a+LNumb_d+LNumb_e+LNumb_f,                                                // c
        LNumb_b+LNumb_c+LNumb_d+LNumb_e+LNumb_g,                                        // d
        LNumb_a+LNumb_d+LNumb_e+LNumb_f+LNumb_g,                                        // e
        LNumb_a+LNumb_e+LNumb_f+LNumb_g,                                                // f
        LNumb_a+LNumb_b+LNumb_c+LNumb_d+LNumb_f+LNumb_g,                                // g
        LNumb_b+LNumb_c+LNumb_e+LNumb_f+LNumb_g,                                        // h
        LNumb_e+LNumb_f,                                                                // i
        0xFF,                                                                                // j
        LNumb_b+LNumb_d+LNumb_e+LNumb_f+LNumb_g,                                        // k
        LNumb_d+LNumb_e+LNumb_f,                                                        // L
        LNumb_a+LNumb_c+LNumb_e+LNumb_g,                                                // m
        LNumb_c+LNumb_e+LNumb_g,                                                        // n
        LNumb_c+LNumb_d+LNumb_e+LNumb_g,                                                // o
        LNumb_a+LNumb_b+LNumb_e+LNumb_f+LNumb_g,                                        // p
        LNumb_a+LNumb_b+LNumb_c+LNumb_f+LNumb_g,                                        // q
        LNumb_e+LNumb_g,                                                                / r
        LNumb_a+LNumb_c+LNumb_d+LNumb_f+LNumb_g,                                        // s
        LNumb_d+LNumb_e+LNumb_f+LNumb_g,                                                // t
        LNumb_b+LNumb_c+LNumb_d+LNumb_e+LNumb_f,                                        // U
        LNumb_c+LNumb_d+LNumb_e,                                                        // v
        LNumb_x,                                                                        // w
        LNumb_x,                                                                        // x
        LNumb_b+LNumb_c+LNumb_d+LNumb_f+LNumb_g,                                        // y
        LNumb_a+LNumb_b+LNumb_d+LNumb_e+LNumb_g,                                        // z
};

void Int1(void)        //Timer 0 interrupt                                                                                中断1
{
        TH0=(Timer0_Temp&0xff00)>>8;
        TL0=Timer0_Temp&0xff;
        FlashSwitch=~FlashSwitch;
        if(FlashSwitch==0)pDisplay=FlashBuff;
        else pDisplay=DisplayBuff;
        Flash_Fun();
        ReadKey=1;
        if(KeyPress)
        KeyTime++;
        else
        KeyTime=1;
}

//========================================================
//函数功能:全屏显示
//========================================================
void DisplayFull(void)
{
        uint8 i=0;
        for(i=0;i<MaxWordBuff;i++)
        {
                DisplayBuff=0xff;
                FlashBuff=0xff;
        }
        RefreshBit=1;
}
//========================================================
//函数功能:全屏清零
//========================================================
void Display_Clear(void)
{
        uint8 i=0;
        for(i=0;i<MaxWordBuff;i++)
        {
                DisplayBuff=0x00;
                FlashBuff=0x00;
        }
        RefreshBit=1;
}

void LED_Init(void)
{
        TMOD&=0xf0;
        TMOD|=0x01;                        //
        TH0=(Timer0_Temp&0xff00)>>8;
        TL0=Timer0_Temp&0xff;
        ET0=1;
        TR0=1;
        DisplayFull();
}

/*
函数功能:显示一个数字
入口参数: 1)要显示的整形数        2)小数点位数
*/                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
void Display_Num(uint16 Num,int8 dotbit)
{
        uint8 i=0;
        while(i<4)
        {       
                DisplayBuff=NumTAB[Num%10];
                if(dotbit==i)
                DisplayBuff|=LNumb_x;
                Num/=10;
                i++;
        }
        for(i=0;i<MaxWordBuff;i++)
        {
                FlashBuff=DisplayBuff;
        }

        RefreshBit=1;
}


/*
函数功能:显示一个浮点数
入口参数: 要显示的浮点数
调用函数:1)display_str         2)Display_Num
*/
void Display_Float(float Num)
{       
       
        if(Num>9999.0)
        {
                Display_Str("eeee",0);//超过9999显示eeee
                return;
        }
        if(Num>=1000.0)
        {
                Display_Num(Num,-1);
                return;
        }
        if(Num>=100.0&&Num<=1000.0)
        {
                Num*=10;
                Display_Num(Num,1);
                   return;
        }
        if(Num>=10.00&&Num<100.0)
        {
                Num*=100;
                Display_Num(Num,2);
                return;
        }
        if(Num<10.00)
        {
                Num*=1000;
                Display_Num(Num,3);
                return;
        }       
}

/*
函数功能:SPI写入
入口参数:要写入的数据
*/
void SPI_Write(uint8 SendByte)
{
       
        uint8 N;
        CLR_CS;
        for(N=0;N<8;N++)
        {
                CLR_SCLK;
                CLR_DIO;               
                if((SendByte&0x01)!=0)
                SET_DIO;
                SendByte>>=1;
                WDT_Clear();
                SET_SCLK;
                WDT_Clear();       
        }
}
/*
函数数功能:对TM1629写数据
入口参数:指向要写入内容的指针
*/
void TM1629_Write(uint8 *pSend)
{
        uint8 Len;
        SET_CS;
        SET_DIO;
        SET_SCLK;

        SPI_Write(0x40);         //地址自增加模式
        SET_CS;       
        SPI_Write(0xC0);        //数据起始地址
        for(Len=0;Len<16;Len++)       
        {
                SPI_Write(*pSend);
                pSend++;
         }
        SET_CS;
        SPI_Write(0x8A);
        SET_CS;               
}
/*
函数功能:读TM1629B
入口参数: 读出内容存放地址
*/
void SPI_Read(uint8 *KeyBuff)
{
        uint8 N;
        uint8 i;
        uint8 RetDat=0;
        SET_CS;
        SET_DIO;
        SET_SCLK;

        SPI_Write(0x42);                //发送读键盘命令

        DISEN_DIO_OUT;
        EN_DIO_IN;
        for(i=0;i<4;i++)
        {       
                for(N=0;N<8;N++)
                {
                        CLR_SCLK;
                        SET_SCLK;
                        if((P4ID&BIT3)!=0)
                        {
                                RetDat|=0x80;       
                        }
                        RetDat>>=1;                       
                }
                *(KeyBuff+i)=RetDat;
                RetDat=0;
        }
        DISEN_DIO_IN;
        EN_DIO_OUT;
        SET_CS;                               
}


/*
函数功能:字码转换
入口参数:1)源字型,2).最终转换码
*/
uint8 code Dmap[MaxWordBuff]={4,5,6,7};        //显示位
uint8 code Seg_Map[8]={LNumb_c,LNumb_x,LNumb_d,LNumb_e,LNumb_g,LNumb_b,LNumb_f,LNumb_a}; //GR1~GR8对应笔段
void Conver_Code(uint8 *SrcCode,uint8 *DstCode)                       
{
        uint8 Cnt0;
        uint8 DisplayBit;
        uint8 Src_Temp;
        uint8 Dst_Temp;
        for(Cnt0=0;Cnt0<16;Cnt0++)*(DstCode+Cnt0)=0;
        for(DisplayBit=0;DisplayBit<MaxWordBuff;DisplayBit++)
        {
                Src_Temp=*SrcCode;
                SrcCode++;               
                for(Cnt0=0;Cnt0<8;Cnt0++)
                {
                        Dst_Temp=0x00;
                        if(Src_Temp&Seg_Map[Cnt0])Dst_Temp=0x01;
                        Dst_Temp<<=Dmap[DisplayBit];
                        DstCode[Cnt0*2]|=Dst_Temp;       
                }
        }
}
/*
函数功能:闪烁

*/

void Flash_Fun(void)
{       
        uint8 N;
        if((FlashBit<0)||(FlashBit>MaxWordBuff))
        return;
        if(FlashBit==MaxWordBuff)  //全闪
        {
                for(N=0;N<MaxWordBuff;N++)
                FlashBuff[N]=0;
        }
        else       
        FlashBuff[FlashBit]=0;
        RefreshBit=1;
}
/*

*/
void main(void )
{
        LED_Init();
        EA=1;
        while(1)
        {
                WDT_Clear();        
                if(ReadKey)ReadKey=0,Get_Key();
                if(RefreshBit)
                {
                        Conver_Code(pDisplay,xDat);
                        TM1629_Write(xDat);
                        RefreshBit=0;
                }
                Display_Float(1.234);
        }

}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。