資源簡介
此代碼為官方TM1638的51單片機驅動代碼,共陽轉共陰,稍作修改即可移植到別的平臺
代碼片段和文件信息
#include
#include
#define?nop?_nop_();
#define?uchar?unsigned?char
#define?uint??unsigned?int
sbit?TM1638_STB?=P1^0; //定義片選通訊口
sbit?TM1638_CLK?=P1^1; //定義時鐘通訊口
sbit?TM1638_DIO?=P1^3; //定義數據輸入/輸出通訊口
bdata?uchar?y=0;//定義可以位尋址全局變量y
sbit?y7?=y^7;
uchar?Show[16]?=?{0x760x7b0x380x380x3f0x400x400x400x400x40};//初始化顯示“HELLO”字符代碼
??????????????????????????? ?// ???-----????共陰代碼寄存器組
uchar?Show_LED[16];??//轉換后的共陽顯示代碼寄存器
uchar?CODE[10]?=?{0x3f0x060x5b0x4f0x660x6d0x7d0x070x7f0x6f};?//0~9顯示代碼
uchar?TIME_secondsseconds_2sub_1sub_2shi_1shi_2;?//時間寄存器依次從秒個位至小時十位
uchar?TIME_count;?//定時中斷控制制位
uchar?T_count;???//時鐘小數點閃
uchar?count4;????//保存按鍵控制對應的數碼管閃
uchar?Key_FLAG1;//按鍵標志位
uchar?Key_COUNT1;//按鍵移動數動顯示數據
uchar?Key_LED=0;??//按鍵單獨顯示賦值寄存器
uchar?count7;
/*********************************???
功能:?TM1638寫數據
**********************************/
void?TM1638_InData(uchar?wr_data)
{
?????uchar?i;
?TM1638_STB?=0; ???//給有效的片選信號(片選信號是低電平有效)
?nop;
?nop; ?
?for(i=0;i<8;i++)//開始傳送8位數據,每循環一次傳送一位數據
?{
?????TM1638_CLK?=0;
?nop;
?nop;
?????wr_data?>>=?1;//移位數據,低位在前!
?????nop;
?????TM1638_DIO?=?CY;
?????nop;
?????nop;
?????TM1638_CLK?=1;
?????nop;
???}
}
/*********************************??
功能:讀按鍵子程序?由y?返回1BIT按鍵數據
**********************************/
unsigned?char?Read_TM1668_Data()
{
??uchar?d;
??TM1638_STB?=?0; ??//給有效的片選信號(片選信號是低電平有效)
??TM1638_DIO?=?1; ??//將TM1638_DIO置高,因為沒有按鍵按下時,鍵值默認為00H,此時為了與鍵值有區別
??for(d=0;d<8;d++)
???{
?????TM1638_CLK?=?0;
?nop;
???if(TM1638_DIO==1)
?????{
?????y7?=?1;
?}
??else
?????{
?y7?=?0;
?}
?TM1638_CLK?=?1;
?if(d!=7){y=(y>>1);}???
?nop;
?nop;
}
return(y);
}
/*********************************
????將共陰代碼轉換為驅動共陽代碼
?將Show[]數組寄存器數據轉換至Show_LED2[]
**********************************/
void?conver_CODE()
{
???uchar?count1count2xconver[16];???//轉換原理將Show[]的前8個元素(Show[0]~?Show[7])的第0位?放在Show_LED[]的第1個元素(Show_LED[0])
???for(count1=0;count1<16;count1++) ???//Show[]的前8個元素(Show[0]~?Show[7])的第1位?放在Show_LED[]的第2個元素(Show_LED[1]),依此類推
????{
??conver[count1]?=?Show[count1];
?}
???for(count1=0;count1<8;count1++)
????{
??y?=?0x00;
??for(count2=0;count2<8;count2++)
???{
??????x?=?conver[count2];
??if((x&0x01)?!=?0){?y7?=?1;}
??if(count2?!=?0x07){y?>>=?1;}
??conver[count2]=(x>>1);
}
??Show_LED[count1*2]?=?y;
??y?=?0x00;
??for(count2=0;count2<8;count2++) ??//Show[]的后8個元素(Show[8]~?Show[15])的第0位?放在Show_LED[]的第1個元素(Show_LED[1])
???{
??????x?=?conver[count2+8]; ?//Show[]的后8個元素(Show[8]~?Show[15])的第1位?放在Show_LED[]的第2個元素(Show_LED[1]),依次類推
??if((x&0x01)?!=?0){?y7?=?1;}
??if(count2?!=?0x07){y?>>=?1;}
??conver[count2+8]=(x>>1);
}
??Show_LED[count1*2+1]?=?y;
}
}
????
/*********************************
????TM1638控制指令
功能:?驅動LED屏做相應的顯示
**********************************/
void?Display_TM1638_Order(uchar?Show_led[16])
{
??uchar?h;
??TM1638_STB?=?1;
??TM1638_CLK?=
評論
共有 條評論