/*************************************************************************************************
程序说明:天微6位8段 TM1620 IC 驱动程序----固定地址显示
注:本程序仅供学习参考之,如引用,烦请自行验证程序可靠性及正确性
**************************************************************************************************/
#include<avr/io.h>
#include<delay.h>
#include<user.h>
/*******************************IO口设置************************************************************/
#define SMG_DDR_OUT DDRC |= ((1<<PC0)|(1<<PC1)|(1<<PC2)|(1<<PC3)|(1<<PC4)|(1<<PC5))
#define SET_STB1 PORTC |= (1<<PC0)
#define CLR_STB1 PORTC &= ~(1<<PC0)
#define SET_CLK1 PORTC |= (1<<PC1)
#define CLR_CLK1 PORTC &= ~(1<<PC1)
#define SET_DIN1 PORTC |= (1<<PC2)
#define CLR_DIN1 PORTC &= ~(1<<PC2)
#define SET_STB2 PORTC |= (1<<PC3)
#define CLR_STB2 PORTC &= ~(1<<PC3)
#define SET_CLK2 PORTC |= (1<<PC4)
#define CLR_CLK2 PORTC &= ~(1<<PC4)
#define SET_DIN2 PORTC |= (1<<PC5)
#define CLR_DIN2 PORTC &= ~(1<<PC5)
/***************************共阴数码管数字显示表************************************************/
unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
// 对应显示 0 1 2 b 3 4 5 6 7 8 9 A b C d E F
/**********************写数据************************************************************************/
void writedat1(uchar add,uchar dat)
{
uchar i;
CLR_STB1;
for(i=0;i<8;i++)
{
CLR_CLK1;
if(add & 0X01) SET_DIN1; //判断时候产生进位
else CLR_DIN1;
SET_CLK1;
add>>=1;
CLR_CLK1;
}
for(i=0;i<8;i++)
{
CLR_CLK1;
if(dat & 0X01) SET_DIN1; //判断时候产生进位
else CLR_DIN1;
SET_CLK1;
dat>>=1;
CLR_CLK1;
}
SET_STB1;
}
/**********************写数据************************************************************************/
void writedat2(uchar add,uchar dat)
{
uchar i;
CLR_STB2;
for(i=0;i<8;i++)
{
CLR_CLK2;
if(add & 0X01) SET_DIN2; //判断时候产生进位
else CLR_DIN2;
SET_CLK2;
add>>=1;
CLR_CLK2;
}
for(i=0;i<8;i++)
{
CLR_CLK2;
if(dat & 0X01) SET_DIN2; //判断时候产生进位
else CLR_DIN2;
SET_CLK2;
dat>>=1;
CLR_CLK2;
}
SET_STB2;
}
/********************写命令**************************************************************************/
void writecom1(uchar com)
{
uchar i;
CLR_STB1;
for(i=0;i<8;i++)
{
CLR_CLK1;
if(com & 0X01) SET_DIN1; //判断时候产生进位
else CLR_DIN1;
SET_CLK1;
com>>=1;;
CLR_CLK1;
}
SET_STB1;
}
/********************写命令**************************************************************************/
void writecom2(uchar com)
{
uchar i;
CLR_STB2;
for(i=0;i<8;i++)
{
CLR_CLK2;
if(com & 0X01) SET_DIN2; //判断时候产生进位
else CLR_DIN2;
SET_CLK2;
com>>=1;;
CLR_CLK2;
}
SET_STB2;
}
/*-------------------------------------------------------------
函数功能:LED初始化
-------------------------------------------------------------*/
void Init_LED(void)
{
writecom1(0x02); //设置显示模式 0x00 为4位、0x01为5位,0x02为6位
writecom2(0x02); //设置显示模式 0x00 为4位、0x01为5位,0x02为6位
writecom1(0x44); //设置写显存的数据命令采用固定地址
writecom2(0x44); //设置写显存的数据命令采用固定地址
}
/*-------------------------------------------------------------
函数功能:显示总产量
入口参数:总产量值
返回值:无
-------------------------------------------------------------*/
void Display_ZZL(unsigned long int zzl_tmp)
{
writedat1(0xC0,tab[zzl_tmp/100000]);
writedat1(0xC2,tab[zzl_tmp%100000/10000]);
writedat1(0xC4,tab[zzl_tmp%10000/1000]);
writedat1(0xC6,tab[zzl_tmp%1000/100]);
writedat1(0xC8,tab[zzl_tmp%100/10]|0x80);
writedat1(0xCa,tab[0]);
writecom1(0x8d); //传显示控制命令设置亮度0x88---0x8f 共8级
}
/*-------------------------------------------------------------
函数功能:显示总产量
入口参数:总产量值
返回值:无
-------------------------------------------------------------*/
void Display_MU(unsigned int mu_tmp)
{
writedat2(0xC0,tab[mu_tmp/10000]);
writedat2(0xC2,tab[mu_tmp%10000/1000]);
writedat2(0xC4,tab[mu_tmp%1000/100]);
writedat2(0xC6,tab[mu_tmp%100/10]);
writedat1(0xC8,tab[mu_tmp%10]|0x80);
writedat2(0xCa,tab[0]);
writecom2(0x8d); //传显示控制命令设置亮度0x88---0x8f 共8级
}