TM1640ドライバーとコード
驱动TM 1640 其实并不困难,我们只需注意1640通讯时的电平变化,及数据传输规律首先我们可以看到1640的数据手册,(完整代码点击文章末分享链接,自行查找)
注意数据的输入条件和结束条件,输入条件是CLK 为高电平时,DIN由低变高,我们以传统51单片机为例,写出TM1640的输入开始函数;
void TM1640_start()
{
CLK = 0; //CLK=0,DIN= 0增加代码可靠性
DIN = 1;
CLK = 1;
delay_ms(5); //5毫秒延时
DIN = 0;
delay_ms (5);
CLK = 0;
delay_ms (5);
}
同じ終了条件は、CLKがハイのときにDINレベルがローからハイに変化することです。その終了関数を記述します;
void TM1640_stop()
{
CLK = 0; //CLK=0,DIN=0防止传输的最后以为数据于结束指令冲突
DIN = 0;
CLK = 1;
delay_ms (5);
DIN = 1;
delay_ms (5);
}
我々は、TM1640が実際に本当の意味でのバス通信ではないことを見ることができるこれは、2つだけのIOポートのレベルの変化によって制御される;。TM1640は8つの伝送のための単一の伝送のための単一のデータに8ビットのデータを分割します。データ送信を完了し、送信中のレベル変更に注意してください;そのデータ送信関数を記述してください;
void send_byte(uint num)
{ uint q;
for (q= 8;q>0;q--)
{
CLK = 0;
if (num&0x01)
{
DIN = 1;
delay_ms (5);
}
else
{
DIN = 0;
delay_ms(5);
}
CLK = 1;
num = num>>1;
}
delay_um (5);
}
私はここでそれらを繰り返すことはしませんので、伝達関数を記述する多くの方法があります。
次のコードはすべて、自動アドレス追加を例として取り上げています。TM1640のデフォルトアドレス自己追加モードです。
デフォルトでは自己追加モードであるため、モード選択機能を記述する必要はありませんが、理解を深めるために、以下に記述してください。
最初の図から、TM1640がデジタルチューブを正常に表示するには、データ送信のシーケンス要件があることがわかります。
1.設定データ(通常、自己追加モード0x40、固定アドレスモード0x44のみを使用)と
その機能は次のとおりです。
ボイドモデル(uint k)
{
if (k)
{
TM1640_start ();
send_byte (0x40);//自动加一
TM640_stop ();
}
else
{
TM1640_start ();
send_byte (0x44);//固定地址
TM1640_stop ();
}
2.アドレスを設定します。アドレスは16ビットで、16ビットのデジタルチューブに対応します。上の図から、アドレスがわかります。0xc0〜0xcf;アドレス送信では、特定の機能を実行する必要はありません
。たとえば、send_byte()を使用して実行できます。
TM1640_start();
send_byte(0xc0);
3.送信データを設定します。16ビットあり、各データは互いに連続しています。中断するためにstop()関数を使用する必要はありません。知っておく必要があるのは、16ビットのデジタルチューブがシングルチップマイクロコンピュータのデータと同じように周期的に表示されることです。左に移動、右に移動同じ
void wite_date()//自動アドレスと1つのモード
{
TM1640_start ();
send_byte (0xc0); //输入首地址
send_byte (num_display[0]); //输入个数码管的显示数据1~16;
send_byte (num_display[1]);
send_byte (num_display[2]);
send_byte (num_display[3]);
send_byte (num_display[4]);
send_byte (num_display[5]);
send_byte (num_display[6]);
send_byte (num_display[7]);
send_byte (num_display[8]);
send_byte (num_display[9]);
send_byte (num_display[10]);
send_byte (num_display[11]);
send_byte (num_display[12]);
send_byte (num_display[13]);
send_byte (num_display[14]);
send_byte (num_display[15]);
TM1640_stop ();
}
この長さを書く目的は、後で各デジタルチューブの値を変更することであり、読者は簡潔にすることができます。
4.ディスプレイ制御は、実際にはデジタルチューブの輝度調整です。パルス幅が小さいほど、輝度は高くなり
ます。voidled_display(uint f)
{
start ();
send_byte (f);
stop ();
}
固定アドレスモードの場合、自動アドレスインクリメントモードとほぼ同じ違いがありますが、固定アドレスモードでは、stop()機能を使用してアドレスとデータを同時に停止する必要があり、次のアドレスはstar()機能の開始後に実行されることに注意してください。そしてデータ送信。
ここではTM1640について説明します。ご不明な点がございましたら、後ろにメッセージを残してください。
リンク:https://pan.baidu.com/s/1qGtdUHqLakgTtnLlr6uKiw
抽出コード:1234