記事ディレクトリ
成熟したプロジェクトとして、特性が 1 つの側面だけであってはなりません。一般に、システムでスケジュールを設定し、視覚的な UI を提供する必要があります。もちろん、HMI シリアル画面の使用については先ほど触れました。シリアル画面は確かに非常に優れています。優れたUIツールですが、比較的小規模なプロジェクトはあまり使用されないため、低コストのDIYプロジェクトの場合は、一般的にOLEDを使用します。十分、十分、ミニ、十分な感じです。
したがって、この記事では、OLED メニューを移植するプロセスの一部を記録することにしました。また、この記事を読んだ兄弟たちが OLED メニューをより早く使い始めるのに役立つことを願っています。
1. キードライブ
前回の記事でオープンソースのボタンツールについて触れましたが、コード量を節約するために、より便利な駆動方法を見つけたので紹介します。
1. ハードウェア接続
ここはできるだけシンプルで、直接接続できますし、フィルター回路もありません。もちろんフィルターはあったほうがいいです(笑) 回路図は次のとおりです。 hand
. テストには簡易バージョンが使用されます。
以下に示すように、概略図に従って背面が実行されていることがわかります。
2. 端子機能構成
以下はコンフィギュレーション ピン モードです。ここのピンの他端はデフォルトで接地されているため、ここに IO ポートを接続するときに事前にプルアップ モードに設定する必要があります。ボタンの読み取りにより、ピンレベルの変化を毎回効果的に検出できます。
ボタンをスキャンするには、定期的なスキャン機能を設定する必要があります。ここでは、多くのオプションから選択できます。
- freertos を使用してスキャン タスクを作成する
- ベアメタルは while ループを使用して次のことを実現します。
- タイマーを使用して定期スキャンを実装する
ここでは、テスト用のデモプロジェクトであることを考慮して、システムには関与せず、直接ベアメタルに進みます。移植の便宜のために、ここでもタイマーを使用して生成します。ここではタイマー 6 を設定します機能を実現するには以下のように設定します。
3. プログラムの設定
ここでプログラムの設定を開始しますが、ここで主な部門を次のように説明します。
1 つ目は、後続の操作を実行するのに便利なボタン読み取り用のマクロを作成することです。
主に、変更スキームを使用することでキー検出をうまく実現できるため、スキャン機能について次のように説明します。
スキャン機能を確認します。要約すると
、ボタンの検出が実現できました。検出は機能しており、実際の測定効果は依然として良好であり、自分で検証できます。ソースコードは次のとおりです。
void KeyScan(void)
{
static int keyCount = 0;
static int keyState = 0;
if (KEY_UP == 0 && keyState == 0)
{
keyCount++;
if (keyCount > 2 && KEY_UP == 0 && keyState == 0)
{
KeyUp();
keyState = 1;
}
}
else if (KEY_DOWN == 0 && keyState == 0)
{
keyCount++;
if (keyCount > 2 && KEY_DOWN == 0 && keyState == 0)
{
KeyDown();
keyState = 1;
}
}
else if (KEY_LEFT == 0 && keyState == 0)
{
keyCount++;
if (keyCount > 2 && KEY_LEFT == 0 && keyState == 0)
{
KeyLeft();
keyState = 1;
}
}
else if (KEY_RIGHT == 0 && keyState == 0)
{
keyCount++;
if (keyCount > 2 && KEY_RIGHT == 0 && keyState == 0)
{
KeyRight();
keyState = 1;
}
}
else if (KEY_ON == 0 && keyState == 0)
{
keyCount++;
if (keyCount > 2 && KEY_ON == 0 && keyState == 0)
{
KeyOk();
keyState = 1;
}
}
else if (KEY_OFF == 0 && keyState == 0)
{
keyCount++;
if (keyCount > 2 && KEY_OFF == 0 && keyState == 0)
{
keyState = 1;
}
}
else if (KEY_UP == 1 && KEY_DOWN == 1 && KEY_LEFT == 1 && KEY_RIGHT == 1 && keyState == 1)
{
keyCount = 0;
keyState = 0;
}
}
2. OLEDドライバー
oled ドライバーについては、前回のブログで確認できますが、ここでは紹介しません。以前に SPI バージョンと IIC バージョンを紹介しました。また、ソフトウェアとハードウェアを使用して駆動することも紹介しました。ソフトウェアが駆動される場合、それはMCU は移植されており、以下に関連ブログへのリンクがありますので、ご自身で確認してください。
SPIドライバー:SPI書き込みOLED(ソフトウェアとハードウェアの切り替え)
IIC ドライバー: stm32 構成の概要 - iic の使用
3. メニュー移植
1. メニューの考え方
以前インターネットで oled メニューについて多くの偉い人が話しているのを見たことがありますが、実装するのはあまり便利ではなく、自分でページを書いて更新し、ボタンなどの機能を使用してジャンプするのが最も簡単な方法です。これは便利だと思いますが、残念ながらこの方法はお勧めできません。簡単なメニューならいいですが、複雑なメニューだと難しすぎます。
そこで、別の偉い人のソリューションを移植しました。とても良い感じです。この偉い人のおかげで、ソースアドレスは次のとおりです。 https://gitee.com/snqx-lqh/screen-design-using-gui/tree /マスター/2%E3%80%81STM32C8T6+IIC+OLED0.96GUI%E8%AE%BE%E8%AE%A1
まず、メニュー構造を見てみましょう。各メニュー構造には、次のように、メニュー ページのいくつかのパラメータが含まれています。
- メニュー数
- スクロール バーの長さ (たとえば、フォント 16 を選択した場合、ページには最大 4 行を表示できるため、4 行を超える表示が必要な場合はスクロールする必要がないため、長さは 0 になります) 5 行など、次の内容を表示するにはメニューをスクロールする必要があるため、スクロール バーの長さは 1 になります。 )
- メニュー名など
- メニューの機能
- 親メニュー
- サブメニュー
実際、ここでより重要なのは親メニューとサブメニューで、これらを使用してメニュー間を移動できます。
2. メニュープログラムの設計
メニューのアイデアは上で紹介されており、メニューがどのように生成されるかを以下で確認できますが、その前に、作者がデザインしたカバーを見ることができます。これはタイマーによって実行され、パラメータを通じて更新されます
。
年月日の更新もタイマー内で実行されます 以下にメニューの定義を示します。これは主にサブメニューと親メニューの定義に依存します。
メニューに追加されたコンテンツの説明を見てみましょう。後で中国語を使用したい場合は、表示機能もそれに合わせて変更する必要があるため、ここではすべての処理が面倒ではないので、英語の文字を使用しましょう。前に説明したスライディング ウィンドウ
。以下は
矢印のリフレッシュ機能命令です。
効果は次のとおりです。
以下はいくつかの内部定義変数のリフレッシュです。
サブメニューの内部変数のリフレッシュ効果は次のとおりです。
その後, 先ほど定義した内容が追加され、
最後にキー制御機能です。はい、主に論理的な選択です。ここで、インデックス値に対する各操作の後に画面を更新する必要があることに注意してください。初期化と更新を追加します
。 main 関数に関数を追加すると、
最終的な効果は次のようになります。