?? tec1622.txt
字號:
/**********************************************************************************************************
TEC6122數碼管動態掃描顯示模塊
seg[],為要顯示碼段數組(7位,其中一位用作指示燈了),seg[0]對應最低位,seg[6]對應最高位。
sdot為小數點的顯示位置,0不顯示;1顯示在個位;2顯示在十位;3顯示在百位;
TEC6122約定,先送低位,后送高位,最先送入顯示芯片中移位寄存器的是第一位S1(個位),最后是第八位S8(十進制千萬位)
*********************************************************************************************************/
void disp_led(unsigned char seg[],unsigned char sdot)
{
unsigned char dot[7];
switch(sdot) //判斷小數點顯示位置
{
case 0:{dot[0]=0;dot[1]=0;dot[2]=0;dot[3]=0;dot[4]=0;dot[5]=0;dot[6]=0;break; } //不顯示小數點
case 1:{dot[0]=1;dot[1]=0;dot[2]=0;dot[3]=0;dot[4]=0;dot[5]=0;dot[6]=0;break; } //小數點顯示在個位
case 2:{dot[0]=0;dot[1]=1;dot[2]=0;dot[3]=0;dot[4]=0;dot[5]=0;dot[6]=0;break; } //小數點顯示在十位
case 3:{dot[0]=0;dot[1]=0;dot[2]=1;dot[3]=0;dot[4]=0;dot[5]=0;dot[6]=0;break; } //小數點顯示在百位
case 4:{dot[0]=1;dot[1]=1;dot[2]=0;dot[3]=1;dot[4]=1;dot[5]=0;dot[6]=1;break; } //小數點顯示在百位
default:break;
}
/*
8位段碼數據必須一塊發到芯片中去,不論段碼端連接數碼管還是指示燈。
段碼數據在芯片中排列是有順序的,規則就是,先進芯片的是放最低位,后進芯片的放最高位(其實就是進芯片中8個移位寄存器的排列順序)。
seg[]數組中數據誰先誰后發送,要根據實際情況作相應的修改,總之最低位先進芯片。
*/
//溫度(4位數碼管)
load_number((seg[3]), (dot[0])); //十位S4
load_number((seg[2]), (dot[1])); //百位S3
load_number((seg[1]), (dot[2])); //千位S2
load_number((seg[0]), (dot[3])); //萬位S1
//濕度(3位數碼管)
load_number((seg[4]), (dot[4])); //十萬位S7
load_number((seg[5]), (dot[5])); //百萬位S6
load_number((seg[6]), (dot[6])); //千萬位S5
//指示燈(連接到了最高位)
load_ledone(); //千萬位S8
//-----------------------
send_latch_clock(); //發送鎖存脈沖信號
}
/******************************************************************/
/* 加載將要顯示的數據,num-顯示數據,dp:1顯示小數點,0不顯示小數點*/
void load_number(unsigned char number, bit dp) // 串行送出一位LED數碼字符(一個字節), dp,g,f,c,d.c,b,a; dp在最高位,
{
unsigned char i;
unsigned char temp;
//temp = ~number_code[number]; /* 使用共陽極數碼管,所以編碼取反 */
temp = number_code[number]; /* 使用共陰極數碼管 */
if (dp)//
{
//temp &= 0x7f; //顯示自身并加上小數點,與0x7f(二進制為01111111)相與即可以保留TEMP中數字又可以把最高位的小數點加上(使用共陽極數碼管)
temp |= 0x80; //顯示自身并加上小數點,與0x80(二進制為10000000)相或即可以保留TEMP中數字又可以把最高位的小數點加上(使用共陰極數碼管)
}
for (i=0; i<8; i++)
{
if ( (temp & 0x80) == 0x80)//看第一位(左端字節高位)是否為1,即檢驗DS是否為1,( dp在最高位,在TEC6122中約定dp是最低位最先送入,a是最高位最后送入)Serial Data Input
{DS = 1;}
else
{DS = 0;}
temp <<= 1;//左移一位,通過移位寄存器,再檢驗DS位。
send_shift_clock(); /* 發移位脈沖信號 */
}
}
/*單個LED顯示,對某個筆畫置位操作,用于指示燈顯示 */
void load_ledone(void) // 串行送出一位LED數碼字符(一個字節), dp,g,f,c,d.c,b,a; 在TEC6122中dp在最高位,dp是最低位最先送入,a是最高位最后送入
{
if (dip)
{DS = 1;}
else
{DS = 0;}
send_shift_clock(); /* 發移位脈沖信號 */
if (g)
{DS = 1;}
else
{DS = 0;}
send_shift_clock(); /* 發移位脈沖信號 */
if (f)
{DS = 1;}
else
{DS = 0;}
send_shift_clock(); /* 發移位脈沖信號 */
if (e)
{DS = 1;}
else
{DS = 0;}
send_shift_clock(); /* 發移位脈沖信號 */
if (d)
{DS = 1;}
else
{DS = 0;}
send_shift_clock(); /* 發移位脈沖信號 */
if (c)
{DS = 1;}
else
{DS = 0;}
send_shift_clock(); /* 發移位脈沖信號 */
if (b)
{DS = 1;}
else
{DS = 0;}
send_shift_clock(); /* 發移位脈沖信號 */
if (a)
{DS = 1;}
else
{DS = 0;}
send_shift_clock(); /* 發移位脈沖信號 */
}
/* 發送移位時鐘脈沖信號 */
void send_shift_clock(void)
{
SCP = 1;
_nop_();
SCP = 0;
}
/* 發送鎖存脈沖信號 */
void send_latch_clock(void)
{
LCP = 1;
_nop_();
LCP = 0;
}
/***********************************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -