搜索
bottom↓
回复: 9
打印 上一主题 下一主题

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

[复制链接]

出0入0汤圆

跳转到指定楼层
1
发表于 2011-8-3 09:38:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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);
        }

}

出0入0汤圆

2
发表于 2012-2-14 16:05:27 | 只看该作者
回复【楼主位】xcodes
-----------------------------------------------------------------------

MARK ,学习了,希望有望  谢谢

出0入0汤圆

3
发表于 2012-3-1 11:32:15 | 只看该作者
MARK   正好用上

出0入0汤圆

4
发表于 2012-8-27 20:08:06 | 只看该作者
MARK 正好用上

出0入0汤圆

5
发表于 2012-8-27 20:39:49 | 只看该作者
楼主犀利

出0入0汤圆

6
发表于 2012-8-28 08:52:45 | 只看该作者
Tm1639 的改改试试能否用,

出0入0汤圆

7
发表于 2013-3-25 14:09:55 | 只看该作者
收藏 正好要用1629

出0入0汤圆

8
发表于 2014-5-21 16:38:51 | 只看该作者
很好,最近正在用啊!

出0入0汤圆

9
发表于 2024-1-16 13:26:09 | 只看该作者
谢谢楼主!正好用上。

出10入18汤圆

10
发表于 2024-1-16 13:45:13 | 只看该作者
我靠,又挖坟
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 02:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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