デジタルチューブの駆動
17440 ワード
文書ディレクトリデジタルチューブの駆動 1.1動的走査の周期 1.2ゴーストの発生と解決策 1.3デジタルチューブ駆動例プログラム 1デジタルチューブの駆動
1.1動的スキャンの周期
1つのデジタルチューブはどのくらい点灯する必要がありますか?つまり、全てのデジタルチューブのスキャンを完了するにはどのくらいの時間がかかりますか(全体スキャン時間=単一デジタルチューブ点灯時間*デジタルチューブ個数)?答えは:10 ms以内です.
1.2ゴーストの発生と解決策
「ゴースト」の出現は,主にデジタルチューブのビット選択とセグメント選択によって生じる過渡的な結果である.
ソリューションには、セグメントを閉じるか、ビットを閉じるかの2つがあります.
1.3デジタルチューブドライバの例
サンプルコードは次のとおりです.
参考資料:手を取って51単片機を教えてあげます:C言語版
1.1動的スキャンの周期
1つのデジタルチューブはどのくらい点灯する必要がありますか?つまり、全てのデジタルチューブのスキャンを完了するにはどのくらいの時間がかかりますか(全体スキャン時間=単一デジタルチューブ点灯時間*デジタルチューブ個数)?答えは:10 ms以内です.
1.2ゴーストの発生と解決策
「ゴースト」の出現は,主にデジタルチューブのビット選択とセグメント選択によって生じる過渡的な結果である.
ソリューションには、セグメントを閉じるか、ビットを閉じるかの2つがあります.
1.3デジタルチューブドライバの例
サンプルコードは次のとおりです.
#include
sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;
unsigned char code LedChar[] = { //
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
unsigned char LedBuff[6] = { // , 0xFF
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
unsigned char i = 0; //
unsigned int cnt = 0; // T0
unsigned char flag1s = 0; //1
void main()
{
unsigned long sec = 0; //
EA = 1; //
ENLED = 0; // U3,
ADDR3 = 1; // ADDR0-2 ,
TMOD = 0x01; // T0 1
TH0 = 0xFC; // T0 0xFC67, 1ms
TL0 = 0x67;
ET0 = 1; // T0
TR0 = 1; // T0
while (1)
{
if (flag1s == 1) // 1
{
flag1s = 0; //1
sec++; // 1
// sec
LedBuff[0] = LedChar[sec % 10];
LedBuff[1] = LedChar[sec / 10 % 10];
LedBuff[2] = LedChar[sec / 100 % 10];
LedBuff[3] = LedChar[sec / 1000 % 10];
LedBuff[4] = LedChar[sec / 10000 % 10];
LedBuff[5] = LedChar[sec / 100000 % 10];
}
}
}
/* 0 */
void InterruptTimer0() interrupt 1
{
TH0 = 0xFC; //
TL0 = 0x67;
cnt++; // 1
if (cnt >= 1000) // 1000 1
{
cnt = 0; // 1
flag1s = 1; // 1 1
}
//
P0 = 0xFF; //
switch (i)
{
case 0: ADDR2 = 0; ADDR1 = 0; ADDR0 = 0; i++; P0 = LedBuff[0]; break;
case 1: ADDR2 = 0; ADDR1 = 0; ADDR0 = 1; i++; P0 = LedBuff[1]; break;
case 2: ADDR2 = 0; ADDR1 = 1; ADDR0 = 0; i++; P0 = LedBuff[2]; break;
case 3: ADDR2 = 0; ADDR1 = 1; ADDR0 = 1; i++; P0 = LedBuff[3]; break;
case 4: ADDR2 = 1; ADDR1 = 0; ADDR0 = 0; i++; P0 = LedBuff[4]; break;
case 5: ADDR2 = 1; ADDR1 = 0; ADDR0 = 1; i = 0; P0 = LedBuff[5]; break;
default: break;
}
}
参考資料: