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(); //這里送的就是鎖存的信號
} |