u8 const tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x00,0x00,0x00,0x00,0x00,0x40}; //码表,每个板的码表不一样,大家可以根据需要修改
/************************595信号************************/
#define SHIFT_RCK PA4 //锁存 有时如果用STC的可能不能用define来定义,需要sbit来定义
#define SHIFT_DATA PA0 //数据
#define SHIFT_LCHCLK PA1 //时钟
#define SHIFT_OE PB0 //输出使能
/*********************************************************************
* 函数名称: Out595
* 功能描述: 其实这个是输出锁存信号,这样可以实现多个595串起来,具体最多多少我没试过,最多我试过7个的
* 输入参数:
* 输出参数: 无
* 返 回 值: 无
**********************************************************************/
void Out595(void)
{
SHIFT_RCK = 0;
//asm("nop");
//asm("nop");
SHIFT_RCK = 1;
}
/*********************************************************************
* 函数名称: SendByte
* 功能描述: 串行输入,发送一个字节数据
* 输入参数:
* 输出参数: 无
* 返 回 值: 无
**********************************************************************/
void SendByte(u16 byte)
{
u16 num,c;
if(TriFlag == 0)
num = tabTri[byte]; //因为我要送2种不同的状态,所以这里做一个识别
else
num = tab[byte];
//SHIFT_LCHCLK = 0;
for(c=0;c<8;c++)
{
SHIFT_LCHCLK = 0;
SHIFT_DATA=((num&0x80)>>7); //分离最高位,移动到最低位
num = num<<1;
SHIFT_LCHCLK = 1;
}
//SHIFT_LCHCLK = 1;
}
/*****************下面这段就是具体送数据的了,因为我只有2个8,所以只送了2次***************/
void DisplayRGY(u16 word,u8 Type)
{
u16 m,l; //百位,十位,个位
Type = 0;
if (word>9) //两位数
{
m = (word%100)/10;
l = word%10;
}
else //一位数
{
m = 0x0a;
l = word%10;
}
if(TriFlag == 0)
{
if(Type == 0)
{
SendByte(h); //红十位
SendByte(l); //黄个位
}
}
else
{
if(Type == 0)
{
SendByte(m); //红十位
SendByte(l); //黄个位
}
}
Out595(); //这里送的就是锁存的信号
} |