amobbs.com 阿莫电子技术论坛
标题:
代码,还是代码 ——TM1629B驱动
[打印本页]
作者:
xcodes
时间:
2011-8-3 09:38
标题:
代码,还是代码 ——TM1629B驱动
#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);
}
}
作者:
hhucsjh
时间:
2012-2-14 16:05
回复【楼主位】xcodes
-----------------------------------------------------------------------
MARK ,学习了,希望有望 谢谢
作者:
luguobing
时间:
2012-3-1 11:32
MARK 正好用上
作者:
weiyix
时间:
2012-8-27 20:08
MARK 正好用上
作者:
plb83
时间:
2012-8-27 20:39
楼主犀利
作者:
jetli
时间:
2012-8-28 08:52
Tm1639 的改改试试能否用,
作者:
sync765
时间:
2013-3-25 14:09
收藏 正好要用1629
作者:
Danylove
时间:
2014-5-21 16:38
很好,最近正在用啊!
作者:
jsszdfdn
时间:
2024-1-16 13:26
谢谢楼主!正好用上。
作者:
qtechzdh
时间:
2024-1-16 13:45
我靠,又挖坟
欢迎光临 amobbs.com 阿莫电子技术论坛 (https://www.amobbs.com/)
Powered by Discuz! X3.4