覚え書き
http://obo.ko-me.com/
パソコン・マイコン関連の、あとで必要になりそうな情報を残しておくための、健忘録てきななにかです。
ja
2023-02-03T19:28:37+09:00
-
http://obo.ko-me.com/%E6%9C%AA%E9%81%B8%E6%8A%9E/devkitpro%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B
DevkitProをインストールする
任天堂Switchや3SD、DS、GBA、wii、wiiu、gamecubeの実行ファイルをC言語で生成できる
「DevkitPro」のインストール方法
※以下の作業は、AlterLinux-32Bit-Xfce環境を前提としている
01.    ファイルマネージ...
「DevkitPro」のインストール方法
※以下の作業は、AlterLinux-32Bit-Xfce環境を前提としている
01. ファイルマネージャを「隠しファイルを表示」にする
02. ターミナルに"sudo xed /etc/pacman.conf"と入力(パスワードを要求され、エディターが立ち上がる)
03. "SigLevel = Required DatabaseOptional"という部分を
"#SigLevel = Required DatabaseOptional"という部分を
"SigLevel = TrustAll"に書き換える
また、同ファイルの末尾に
"[dkp-libs]"
"Server = htpps://pkg.devkitpro.org/packages"
"[dkp-linux]"
"Server = htpps://pkg.devkitpro.org/packages/linux/$arch/"
を追加。上書き保存して、一旦エディターを閉じる。
04. ターミナルに"sudo xed /home/user/.profile"と入力(パスワードを要求され、エディターが立ち上がる)
※"user"以外のユーザー名を使用しているなら、"user"の部分はそのユーザー名を使用する。
ファイルの末尾に
"export DEVKITPRO=/opt/devkitpro"
"export DEVKITARM=${DEVKITPRO}/devkitARM"
"export DEVKITPPC=${DEVKITPRO}/devkitPPC"
"export PATH=${DEVKITPRO}/tools/bin:$PATH"
を追加。上書き保存して、エディターを閉じる。
05. ターミナルに"sudo pacman-key --recv BC26F752D25B92CE272E0F44F7FD5492264BB9D0 --keyserver keyserver.ubuntu.com"と入力
06. ターミナルに"sudo pacman-key --lsign BC26F752D25B92CE272E0F44F7FD5492264BB9D0"と入力
07. ターミナルに"wget https://pkg.devkitpro.org/devkitpro-keyring.pkg.tar.xz"と入力
08. ターミナルに"sudo pacman -U devkitpro-keyring.pkg.tar.xz"と入力
09. ここで一度logoutして、再びloginする
10. ターミナルに"sudo pacman -Sy"と入力
11. ターミナルに"sudo pacman -S gba-dev"と入力
※これで、GBAの開発環境が構築された。
※NDS、ターミナルに"sudo pacman -S nds-dev"と入力
※3DS、ターミナルに"sudo pacman -S 3ds-dev"と入力
※Switch、ターミナルに"sudo pacman -S switch-dev"と入力
※GAMECUBE、ターミナルに"sudo pacman -S gamecube-dev"と入力
※wii、ターミナルに"sudo pacman -S wii-dev"と入力
※wiiu、ターミナルに"sudo pacman -S wiiu-dev"と入力
※上記を個別に行うことで、任意のゲームマシンの開発環境を追加できる
12. ターミナルに"sudo pacman -S mgba-qt"と入力
※GBA用エミュレーターを導入している
※NDS用エディターはターミナルに"sudo pacman -S desmume"と入力
13. ターミナルに"sudo xed /etc/pacman.conf"と入力
14. "#SigLevel = Required DatabaseOptional"
"SigLevel = TurustAll"という部分を
14. "SigLevel = Required DatabaseOptional"
"#SigLevel = TurustAll"に書き換えて上書き保存する。
15. logoutして、再びloginする
16. ファイルマネージャを使用して、"/HOME/user/"の下に、任意の作業用フォルダーを作成する
※(例:game_)
17. ファイルマネージャを使用して、"/opt/devkitpro/examples/gba/"の下に存在するすべてのファイルをコピー、これを16.で作成したフォルダーにペーストする。
18. ファイルマネージャの機能を使用して、”ここでターミナルを開く”を実行する。
19. ターミナルに"make"と入力して実行する。
※これで、サンプルプログラムが一度にコンパイルされた。
20. ファイルマネージャでさらにフォルダーを下っていくと、それぞれ.gbaが生成されているので、これを"mGBA"で実行する。
※正常に実行されたら、一連の作業が成功したということになる。おめでとう。]]>
未選択
2023-02-03T19:28:37+09:00
No Name Ninja
NINJA BLOG
No Name Ninja
-
http://obo.ko-me.com/stm32/stm32f030f4p6%E3%81%A77735lcd%E8%A1%A8%E7%A4%BA%EF%BC%88%E4%B8%BB%E6%96%87%EF%BC%89
STM32F030F4P6で7735LCD表示(主文)
またしても、STM32F030F4P6でLCD表示を行う記事です。
今回は7735というチップで制御されたカラー液晶ディスプレーです。
表示能力は、128x128で、色数は18ビットモードと16ビットモードの2種類から選択出来るようです。
5110より明らかに高性能なのですが、1画面分のデー...
今回は7735というチップで制御されたカラー液晶ディスプレーです。
表示能力は、128x128で、色数は18ビットモードと16ビットモードの2種類から選択出来るようです。
5110より明らかに高性能なのですが、1画面分のデータ量が増える分、速度的には不利になるので、全ての面でNokiaに勝るというわけではありません。
とはいえ、84x48ドットモノクロのNokiaと128x128ドットフルカラーの7735では、画面の情報量が圧倒的に違いますし、機能も多いので、使い勝手は7735の方が上だと思います。
ですが、この程度のシステムでも一瞬で画面が書き換わるNokia5110も十分に魅力的です。
さて。
この「忍者ブログ」には、1つの記事あたりの文字数に制限があるようで、それに引っかかってしまいました。
プログラムコードの部分だけなら通ったので、今回は、主文とソースが別れました。
今回のプログラムを作成するに当たっては、
ブログサイト「何かの足跡」様のST7735B 1.8" TFT SPI
という記事や、
ブログサイト「ネコ技研」様のTFT液晶LCD+AVRマイコンで自作フォントを表示
という記事が大変参考になりました。
また、STM32F030F4P6そのものに関しては、
ブログサイト「おじさん工房」様の実験用マイコン基板 STM-1 という記事の意見が参考になりました。
この場を借りて、お礼を述べさせて頂きます。
ありがとうございました。
さて。
「おじさん工房」の主様は、「20pin-16KBじゃ足りなすぎる」ということで、1ランク上の「STM32F030K6T6(32pin-32KB)」に移行して開発を進めましたが、私はそれを知りつつ、20pin-16KBのSTM32F030F4P6を使い続けております。
だって。
安かったから、まとめ買いで100個も買っちゃったんだもの。
(STM32F030K6T6も幾つか持ってますけどね)
プログラム的には、Nokia5110のものをベースに、コマンド周りを中心に変更しています。
SPI通信に関しては、いわゆる「ソフトウェア式」のため、7735に対しては速度がかなり遅いようです。
これを、「ハードウェア式」に改めた場合、高速化されるのか、それとも、ほとんど変わらないのか。
その辺のことは、これから見定めて対応したいと思います。
(7735のフルカラー画像が一瞬で表示されるような速度が確保できたなら、夢が一気にひろがりまくります)]]>
STM32
2019-09-16T08:24:10+09:00
No Name Ninja
NINJA BLOG
No Name Ninja
-
http://obo.ko-me.com/stm32/stm32f030f4p6%E3%81%A77735lcd%E8%A1%A8%E7%A4%BA%EF%BC%88em
STM32F030F4P6で7735LCD表示(EmBitz-サンプルプログラム)
/*
**********************************************************************
**
**           ...
VIDEO
/*
**********************************************************************
**
** Main.c
** SPI-7735(128x128 LCD)
** EmBitz
**
** 旧-現在
** A5-A2-Output RESRT/RS (Reset)
** A6-A6-Output CS/CE (Master In Slave Out:Low=GND)
** A7-A5-Output A0/DC
** 5110=PCD8544 (Data/Command:Data=High_Command=Low)
** ST7735 (Data/Command:Data=High_Command=Low)
** A2-A7-Output SDA/DIN (Serial Input/SDA:送信Data)
** A3-A4-Output SCK/CLK (Serial Clock)
** A4-A3-Output LED (Back Light)
**
**********************************************************************/
/*
Last committed: $Revision: 31$
Last changed by: $Author: Masaomi.Takahashi.$
Last changed date: $Date: 2019-09-15
ID: $Id: 02
**********************************************************************/
#include "stm32f0xx.h"
unsigned char w_00[][14]={
{ 23, 21, 22, 30,108, 21, 30,109, 22, 26,110, 0, 0,0xFF}, // [00] 2019年09月15日
{124, 2,128, 0, 24, 21, 2,127, 0, 21, 23, 0, 0,0xFF}, // [01] VER 30EZ02
{115, 4, 3, 4, 0, 3, 12,127, 7, 2,107, 0, 0,0xFF}, // [02] MOLO LIZWE!
{134,117,135, 8, 2,122, 0,136,135,117, 0, 0, 0,0xFF}, // [03]
{118,119, 0, 19, 20, 0, 0, 0, 0, 0, 0, 0, 0,0xFF}, // [04]
{ 9, 12, 5, 4, 0,115, 4,116, 11, 4,107, 0, 0,0xFF}, // [05] CIAO MONDO!
{ 13, 14, 15, 16, 53, 0, 19, 20, 0, 0, 0, 0, 0,0xFF}, // [06] こんにちは 世界
{ 1, 2, 3, 3, 4, 0, 7, 4,128, 3, 11,107, 0,0xFF}, // [07] HELLO WORLD!
{121,122,115, 24, 23, 6, 21, 24, 21, 6, 25,117, 27,0xFF} // [08] STM32F030F4P6
};
unsigned char font[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Space 0
0x00, 0xFE, 0x10, 0x10, 0x10, 0x10, 0xFE, // H 1
0x00, 0xFE, 0x92, 0x92, 0x92, 0x92, 0x82, // E 2
0x00, 0xFE, 0x80, 0x80, 0x80, 0x80, 0x80, // L 3
0x00, 0x38, 0x44, 0x82, 0x82, 0x44, 0x38, // O 4
0xC0, 0x30, 0x2C, 0x22, 0x2C, 0x30, 0xC0, // A 5
0x00, 0xFE, 0x12, 0x12, 0x12, 0x12, 0x02, // F 6
0x3E, 0xC0, 0x30, 0x0C, 0x30, 0xC0, 0x3E, // W 7
0x00, 0xFE, 0x92, 0x92, 0x92, 0x92, 0x66, // B 8
0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x44, // C 9
0x00, 0x38, 0x44, 0x82, 0x92, 0x92, 0x74, // G 10
0x00, 0xFE, 0x82, 0x82, 0x82, 0x44, 0x38, // D 11
0x00, 0x00, 0x82, 0xFE, 0x82, 0x00, 0x00, // I 12
0x00, 0x40, 0xA4, 0x84, 0x84, 0x84, 0x80, // こ 13
0x80, 0x60, 0x18, 0x66, 0x80, 0x80, 0x40, // ん 14
0xFE, 0x00, 0x40, 0xA4, 0x84, 0x84, 0x80, // に 15
0x00, 0x04, 0x24, 0x9C, 0x96, 0x94, 0x64, // ち 16
0x48, 0x28, 0xFE, 0x08, 0x84, 0x84, 0x78, // わ 17
0x00, 0x40, 0x80, 0x80, 0x80, 0x80, 0x7E, // J 18
0x04, 0xFF, 0x84, 0xBF, 0xA4, 0xBF, 0x84, // 世 19
0x00, 0x5F, 0xF5, 0x3F, 0x1F, 0xF5, 0x5F, // 界 20
0x00, 0x7C, 0x82, 0x82, 0x82, 0x82, 0x7C, // 0 21
0x00, 0x00, 0x84, 0xFE, 0x80, 0x00, 0x00, // 1 22
0x00, 0xC4, 0xA2, 0xA2, 0x92, 0x92, 0x8C, // 2 23
0x00, 0x44, 0x82, 0x92, 0x92, 0x92, 0x6C, // 3 24
0x00, 0x60, 0x50, 0x48, 0x44, 0xFE, 0x40, // 4 25
0x00, 0x5E, 0x8A, 0x8A, 0x8A, 0x8A, 0x72, // 5 26
0x00, 0x7C, 0x92, 0x92, 0x92, 0x92, 0x74, // 6 27
0x00, 0x02, 0x02, 0xC2, 0x32, 0x0A, 0x06, // 7 28
0x00, 0x6C, 0x92, 0x92, 0x92, 0x92, 0x6C, // 8 29
0x00, 0x4C, 0x92, 0x92, 0x92, 0x92, 0x7C, // 9 30
0x40, 0xA4, 0xFE, 0x54, 0x34, 0x94, 0x60, // あ 31
0x3C, 0x40, 0x80, 0x40, 0x04, 0x08, 0x30, // い 32
0x00, 0x10, 0x8A, 0x8A, 0x8A, 0x4A, 0x30, // う 33
0x00, 0x80, 0x4A, 0x2A, 0x7A, 0x80, 0x80, // え 34
0x44, 0xA4, 0xFE, 0x14, 0x90, 0x94, 0x68, // お 35
0x88, 0x68, 0x9E, 0x88, 0x70, 0x08, 0x30, // か 36
0x00, 0x54, 0xB4, 0x94, 0x9C, 0xB4, 0x10, // き 37
0x00, 0x10, 0x28, 0x28, 0x44, 0x82, 0x00, // く 38
0x7E, 0x00, 0x08, 0x88, 0x7E, 0x08, 0x08, // け 39
0x00, 0x48, 0xA8, 0x88, 0x8E, 0xB8, 0x08, // さ 40
0x00, 0x00, 0x7E, 0x80, 0x80, 0x80, 0x40, // し 41
0x04, 0x04, 0x14, 0xAC, 0x7E, 0x04, 0x04, // す 42
0x08, 0x08, 0x7E, 0x88, 0xA8, 0xBE, 0x88, // せ 43
0x00, 0x10, 0x12, 0x7A, 0x96, 0x92, 0x10, // そ 44
0x84, 0x74, 0x0E, 0x44, 0xA8, 0x88, 0x88, // た 45
0x08, 0x08, 0x04, 0x44, 0x44, 0x44, 0x38, // つ 46
0x00, 0x04, 0x04, 0x34, 0x4A, 0x86, 0x82, // て 47
0x00, 0x40, 0xAE, 0x90, 0x90, 0x88, 0x88, // と 48
0x24, 0x14, 0x4E, 0xA4, 0xA0, 0x74, 0x48, // な 49
0x60, 0x9C, 0x70, 0xA0, 0x1E, 0xC8, 0xF0, // ぬ. 50
0x48, 0x28, 0xFE, 0x08, 0x44, 0xA4, 0x78, // ね 51
0x30, 0x48, 0x24, 0x9C, 0x84, 0x48, 0x03, // の 52
0xFE, 0x00, 0x48, 0xA8, 0xA8, 0x7E, 0x88, // は 53
0x04, 0x74, 0x8E, 0x80, 0x82, 0x7C, 0x08, // ひ 54
0x80, 0x60, 0x80, 0x9A, 0x64, 0x20, 0xC0, // ふ 55
0x10, 0x08, 0x04, 0x08, 0x10, 0x20, 0x20, // へ 56
0xFE, 0x00, 0xD4, 0xD4, 0xFC, 0x54, 0x94, // ほ 57
0x00, 0xD4, 0xD4, 0xD4, 0xFE, 0x54, 0x94, // ま 58
0x60, 0x52, 0x32, 0x96, 0x90, 0x78, 0x20, // み 59
0x24, 0x54, 0xFE, 0x84, 0x80, 0x84, 0x48, // む 60
0x60, 0x9C, 0x70, 0xA8, 0x1E, 0x88, 0x70, // め 61
0x00, 0x14, 0x7C, 0x96, 0x94, 0x94, 0x60, // も 62
0x08, 0x0E, 0x38, 0xC4, 0x06, 0x14, 0x08, // や 63
0x3C, 0x08, 0xA4, 0x7E, 0x24, 0x24, 0x18, // ゆ 64
0x00, 0x40, 0xA0, 0xA0, 0x7E, 0x48, 0x88, // よ 65
0x20, 0x14, 0x5C, 0xB6, 0xE4, 0x94, 0x90, // を 66
0x00, 0x10, 0x1C, 0x70, 0x8C, 0x28, 0x10, // ゃ 67
0x00, 0x38, 0x90, 0x7C, 0x48, 0x30, 0x00, // ゅ 68
0x00, 0x40, 0xA0, 0xA0, 0x7C, 0x90, 0x00, // ょ 69
0x00, 0x20, 0x20, 0x90, 0x90, 0x60, 0x00, // っ 70
0x00, 0x40, 0xA8, 0xFC, 0x68, 0x28, 0xC0, // ぁ 71
0x00, 0x78, 0x80, 0x40, 0x08, 0x30, 0x00, // ぃ 72
0x00, 0x20, 0x94, 0x94, 0x54, 0x20, 0x00, // ぅ 73
0x00, 0x90, 0x54, 0x74, 0x94, 0x80, 0x00, // ぇ 74
0x00, 0x48, 0xFC, 0x28, 0xA0, 0x48, 0x00, // ぉ 75
0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, // ー 76
0x88, 0x68, 0x9E, 0x88, 0x72, 0x08, 0x32, // が 77
0x00, 0x54, 0xB4, 0x96, 0x9C, 0xB6, 0x10, // ぎ 78
0x00, 0x10, 0x28, 0x28, 0x44, 0x8A, 0x08, // ぐ 79
0x7E, 0x00, 0x08, 0x88, 0x7E, 0x08, 0x0A, // げ 80
0x00, 0x40, 0xA4, 0x84, 0x86, 0x84, 0x82, // ご 81
0x00, 0x58, 0xA8, 0x88, 0x8E, 0xB8, 0x0A, // ざ 82
0x00, 0x00, 0x7E, 0x80, 0x82, 0x80, 0x42, // じ 83
0x04, 0x04, 0x14, 0xAC, 0x7E, 0x04, 0x06, // ず 84
0x08, 0x08, 0x7E, 0x88, 0xA8, 0xBE, 0x8A, // ぜ 85
0x00, 0x10, 0x12, 0x7A, 0x96, 0x92, 0x14, // ぞ 86
0x84, 0x74, 0x0E, 0x44, 0xAA, 0x88, 0x8A, // だ 87
0x00, 0x04, 0x24, 0x9C, 0x96, 0x94, 0x66, // ぢ 88
0x08, 0x08, 0x04, 0x44, 0x46, 0x44, 0x3A, // づ 89
0x00, 0x04, 0x04, 0x34, 0x4A, 0x86, 0x8A, // で 90
0x00, 0x40, 0xAE, 0x90, 0x92, 0x88, 0x8A, // ど 91
0xFE, 0x00, 0x48, 0xA8, 0xA8, 0x7E, 0x8A, // ば 92
0x04, 0x74, 0x8E, 0x80, 0x82, 0x7C, 0x0C, // び 93
0x80, 0x60, 0x80, 0x9A, 0x64, 0x22, 0xC2, // ぶ 94
0x10, 0x08, 0x04, 0x08, 0x12, 0x20, 0x22, // べ 95
0xFE, 0x00, 0xD4, 0xD4, 0xFE, 0x54, 0x96, // ぼ 96
0xFE, 0x00, 0x48, 0xA8, 0xAC, 0x7A, 0x8C, // ぱ 97
0x04, 0x74, 0x8E, 0x80, 0x86, 0x7A, 0x0C, // ぴ 98
0x80, 0x60, 0x80, 0x9A, 0x64, 0x2A, 0xC4, // ぷ 99
0x10, 0x08, 0x04, 0x08, 0x14, 0x2A, 0x24, // ぺ 100
0xFE, 0x00, 0xD4, 0xD4, 0xFE, 0x54, 0x96, // ぽ 101
0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, // 、 102
0x40, 0xA0, 0x40, 0x00, 0x00, 0x00, 0x00, // 。 103
0x00, 0x00, 0x00, 0x7E, 0x02, 0x02, 0x02, // 「 104
0x80, 0x80, 0x80, 0xFC, 0x00, 0x00, 0x00, // 」 105
0x00, 0x04, 0x02, 0xA2, 0x12, 0x12, 0x0C, // ? 106
0x00, 0x00, 0x00, 0xBE, 0x00, 0x00, 0x00, // ! 107
0x48, 0x76, 0x54, 0xFC, 0x54, 0x54, 0x44, // 年 108
0x80, 0x40, 0x3E, 0x2A, 0x2A, 0xAA, 0xFE, // 月 109
0x00, 0xFE, 0x92, 0x92, 0x92, 0x92, 0xFE, // 日 110
0x7C, 0x54, 0x7C, 0xC4, 0x5E, 0xF4, 0x50, // 時 111
0x90, 0x88, 0x56, 0x30, 0x96, 0xF8, 0x10, // 分 112
0x6A, 0xFE, 0x10, 0x8C, 0xBE, 0x44, 0x28, // 秒 113
0x00, 0xFE, 0x20, 0x10, 0x28, 0x44, 0x82, // K 114
0xFE, 0x04, 0x18, 0x60, 0x18, 0x04, 0xFE, // M 115
0x00, 0xFE, 0x04, 0x08, 0x10, 0x20, 0xFE, // N 116
0x00, 0xFE, 0x12, 0x12, 0x12, 0x12, 0x06, // P 117
0x08, 0xFC, 0x4A, 0x2C, 0xFE, 0x04, 0x6C, // ニィ(ハオ) 118
0x88, 0xB8, 0x6E, 0x58, 0x92, 0xFA, 0x16, // 好 119
0x00, 0x38, 0x44, 0x82, 0xA2, 0x44, 0xB8, // Q 120
0x00, 0x4C, 0x92, 0x92, 0x92, 0x92, 0x64, // S 121
0x02, 0x02, 0x02, 0xFE, 0x02, 0x02, 0x02, // T 122
0x00, 0x7E, 0x80, 0x80, 0x80, 0x80, 0x7E, // U 123
0x06, 0x18, 0x60, 0x80, 0x60, 0x18, 0x06, // V 124
0x82, 0x44, 0x28, 0x10, 0x28, 0x44, 0x82, // X 125
0x02, 0x04, 0x08, 0xF0, 0x08, 0x04, 0x02, // Y 126
0x00, 0x82, 0xC2, 0xA2, 0x92, 0x8A, 0x86, // Z 127
0x00, 0xFE, 0x12, 0x12, 0x32, 0x52, 0x8C, // R 128
0x30, 0x2A, 0x92, 0x92, 0x94, 0x50, 0x20, // ら 129
0x00, 0x1E, 0x84, 0x82, 0x42, 0x3C, 0x00, // り 130
0x20, 0x52, 0xAA, 0xAE, 0xCA, 0x8A, 0x70, // る 131
0x44, 0x34, 0xFE, 0x08, 0x04, 0xFC, 0x80, // れ 132
0x20, 0x12, 0x9A, 0x96, 0x96, 0x92, 0x60, // ろ 133
0x00, 0xFE, 0x02, 0x02, 0x02, 0x02, 0xFE, // П РИВЕТ МИР 134
0x00, 0xFE, 0x40, 0x20, 0x20, 0x08, 0xFE, // И 135
0xF0, 0x0E, 0x30, 0xC0, 0x30, 0x0E, 0xF0, // М 136
};
int main(void)
{
RCC ->AHBENR |= (1<<17); // GPIO-Aの初期化(最初は0クロックで無可動状態)
GPIOA -> MODER |= (1<<4); // ピン A - 2 を出力モードに
GPIOA -> PUPDR |= (1<<4); // ピン A - 2 を プルアップ指定
GPIOA -> MODER |= (1<<6); // ピン A - 3 を出力モードに
GPIOA -> PUPDR |= (1<<6); // ピン A - 3 を プルアップ指定
GPIOA -> MODER |= (1<<8); // ピン A - 4 を出力モードに
GPIOA -> PUPDR |= (1<<8); // ピン A - 4 を プルアップ指定
GPIOA -> MODER |= (1<<10); // ピン A - 5 を出力モードに
GPIOA -> PUPDR |= (1<<10); // ピン A - 5 を プルアップ指定
GPIOA -> MODER |= (1<<12); // ピン A - 6 を出力モードに
GPIOA -> PUPDR |= (1<<12); // ピン A - 6 を プルアップ指定
GPIOA -> MODER |= (1<<14); // ピン A - 7 を出力モードに
GPIOA -> PUPDR |= (1<<14); // ピン A - 7 を プルアップ指定
GPIOA ->ODR &= ~(1<<2); //GPIOA-Pin2をOffにする
// GPIOA ->ODR &= ~(1<<3); //GPIOA-Pin3をOffにする バックライト無し
GPIOA ->ODR |= (1<<3); //GPIOA-Pin3をOnにする バックライト有り
GPIOA ->ODR &= ~(1<<4); //GPIOA-Pin4をOffにする
GPIOA ->ODR &= ~(1<<5); //GPIOA-Pin5をOffにする
GPIOA ->ODR &= ~(1<<6); //GPIOA-Pin6をOffにする
GPIOA ->ODR &= ~(1<<7); //GPIOA-Pin7をOffにする
delay_ms(100);
lcd_init();
while(1){
lcd_position(110,118,119,127);
delay_ms(1500);
lcd_clear_2();
lcd_clear_0();
lcd_clear_2();
lcd_clear_1();
lcd_clear_0();
lcd_put_w2(w_00[6],4);
lcd_put_w2(w_00[7],5);
lcd_put_w2(w_00[5],6);
lcd_put_w2(w_00[4],7);
lcd_put_w2(w_00[3],8);
lcd_put_w2(w_00[2],9);
lcd_put_w2(w_00[1],11);
lcd_put_w2(w_00[0],12);
lcd_put_w2(w_00[8],13);
delay_ms(5000);
lcd_position(100,108,119,127);
}
}
//---------- 文字出力2 ----------
// *sc:文字列の先頭ポインタ
void lcd_put_w2(char w[],int y) {
int j=0;
char *sc;
while(w[j]<254){
sc=font+(w[j])*7;
lcd_position(128-(y*8),128-(y*8-7),(10+j*8),(3+j*8));// Nokia5110のデータを流用するため、こんな奇っ怪な式になった
lcd_put_cmd(0x36); // メモリ制御方法指定(描写方法) Nokia5110との互換性をある程度維持するため、このような命令が必要になった
lcd_put_ch(0x70); // Nokia5110との互換性をある程度維持するため、このような命令が必要になった
lcd_put_cmd(0x2C);
int i=7; //データー読み出し量
while(i>0){
lcd_ch(*(sc++));
i--;
}
j++;
}
lcd_put_cmd(0x36); // メモリ制御方法指定(描写方法)
lcd_put_ch(0xC8); //
}
//---------- データ出力 ----------
// ch:出力するデータ
void lcd_ch(char ch)
{
lcd_4bit(ch); //上位4bit出力
lcd_4bit(ch<<4); //下位4bit出力
}
//---------- データ4bit処理 ----------
void lcd_4bit(char code)
{
if(code & 0x80){
lcd_put_ch(0xFF); //
lcd_put_ch(0xFF); //
}else{
lcd_put_ch(0x00); //
lcd_put_ch(0x00); //
}
if(code & 0x40){
lcd_put_ch(0xFF); //
lcd_put_ch(0xFF); //
}else{
lcd_put_ch(0x00); //
lcd_put_ch(0x00); //
}
if(code & 0x20){
lcd_put_ch(0xFF); //
lcd_put_ch(0xFF); //
}else{
lcd_put_ch(0x00); //
lcd_put_ch(0x00); //
}
if(code & 0x10){
lcd_put_ch(0xFF); //
lcd_put_ch(0xFF); //
}else{
lcd_put_ch(0x00); //
lcd_put_ch(0x00); //
}
}
//---------- 表示位置設定 ----------
// xx:x座標 yy:y座標
void lcd_position(short x1,short x2,short y1,short y2)
{
lcd_put_cmd(0x2A);
lcd_put_ch(x1 >>8); //
lcd_put_ch(x1); //
lcd_put_ch(x2 >>8); //
lcd_put_ch(x2); //
lcd_put_cmd(0x2B);
lcd_put_ch(y1 >>8); //
lcd_put_ch(y1); //
lcd_put_ch(y2 >>8); //
lcd_put_ch(y2); //
}
//---------- データ4bit出力 ----------
void lcd_put_4bit(char code)
{
GPIOA ->ODR &= ~(1<<4); //GPIOA-Pin4をOffにする
if(code & 0x80)
GPIOA ->ODR |= (1<<7); //GPIOA-Pin7をOnにする
else
GPIOA ->ODR &= ~(1<<7); //GPIOA-Pin7をOffにする
GPIOA ->ODR |= (1<<4); //GPIOA-Pin4をOnにする
GPIOA ->ODR &= ~(1<<4); //GPIOA-Pin4をOffにする
if(code & 0x40)
GPIOA ->ODR |= (1<<7); //GPIOA-Pin7をOnにする
else
GPIOA ->ODR &= ~(1<<7); //GPIOA-Pin7をOffにする
GPIOA ->ODR |= (1<<4); //GPIOA-Pin4をOnにする
GPIOA ->ODR &= ~(1<<4); //GPIOA-Pin4をOffにする
if(code & 0x20)
GPIOA ->ODR |= (1<<7); //GPIOA-Pin7をOnにする
else
GPIOA ->ODR &= ~(1<<7); //GPIOA-Pin7をOffにする
GPIOA ->ODR |= (1<<4); //GPIOA-Pin4をOnにする
GPIOA ->ODR &= ~(1<<4); //GPIOA-Pin4をOffにする
if(code & 0x10)
GPIOA ->ODR |= (1<<7); //GPIOA-Pin7をOnにする
else
GPIOA ->ODR &= ~(1<<7); //GPIOA-Pin7をOffにする
GPIOA ->ODR |= (1<<4); //GPIOA-Pin4をOnにする
}
//---------- データ出力 ----------
// ch:出力するデータ
void lcd_put_ch(char ch)
{
GPIOA ->ODR &= ~(1<<6); //GPIOA-Pin6(CE)をOffにする
GPIOA ->ODR |= (1<<5); //GPIOA-Pin5(DC)をOnにする
lcd_put_4bit(ch); //上位4bit出力
lcd_put_4bit(ch<<4); //下位4bit出力
GPIOA ->ODR |= (1<<6); //GPIOA-Pin6(CE)をOnにする
}
//---------- コマンド送信 ----------
void lcd_put_cmd(char cmd)
{
GPIOA ->ODR &= ~(1<<6); //GPIOA-Pin6(CE)をOffにする
GPIOA ->ODR &= ~(1<<5); //GPIOA-Pin5(DC)をOffにする
lcd_put_4bit(cmd); //上位4bit出力
lcd_put_4bit(cmd<<4);//下位4bit出力
GPIOA ->ODR |= (1<<6); //GPIOA-Pin6(CE)をOnにする
}
//---------- 塗りつぶし(消去) ----------
void lcd_clear_0()
{
lcd_position(0x02,0x81,0x03,0x82);
lcd_put_cmd(0x2C);
int i=128*128*2;
while(i>0){
lcd_put_ch(0x00);
i--;
} }
void lcd_clear_1()
{
lcd_position(0x02,0x81,0x03,0x82);
lcd_put_cmd(0x2C);
int i=128*128*2;
while(i>0){
lcd_put_ch(i*2);
i--;
} }
void lcd_clear_2()
{
lcd_put_cmd(0x2C);
int i=32*128;
while(i>0){
lcd_put_ch(0x88);
lcd_put_ch(0xE2);
lcd_put_ch(0x2F);
lcd_put_ch(0xCC);
lcd_put_ch(0x70);
lcd_put_ch(0x15);
lcd_put_ch(0x55);
lcd_put_ch(0x55);
i--;
} }
//---------- LCD初期化 ----------
void lcd_init()
{
GPIOA ->ODR &= ~(1<<2); //GPIOA-Pin2(RS)をOffにする
delay_ms(20);
GPIOA ->ODR |= (1<<2); //GPIOA-Pin2(RS)をOnにする
delay_ms(20);
lcd_put_cmd(0x11); // スリープ解除
delay_ms(30);
lcd_put_cmd(0xB2); // パワーセット
lcd_put_ch(0x01); //
lcd_put_ch(0x2C); //
lcd_put_ch(0x2D); //
lcd_put_cmd(0xB4); //液晶反転設定
lcd_put_ch(0x07); //
lcd_put_cmd(0xC3); //電源設定-(8色)
lcd_put_ch(0x8A); //
lcd_put_ch(0x2A); //
lcd_put_cmd(0xC5); //VMCTR1 VCOM control 1
lcd_put_ch(0x0E); //
lcd_put_cmd(0x36); // メモリ制御方法指定(描写方法)
lcd_put_ch(0xC8); //
lcd_put_cmd(0xE0); // ガンマシーケンス
lcd_put_ch(0x02); //
lcd_put_ch(0x1C); //
lcd_put_ch(0x07); //
lcd_put_ch(0x12); //
lcd_put_ch(0x37); //
lcd_put_ch(0x32); //
lcd_put_ch(0x29); //
lcd_put_ch(0x2D); //
lcd_put_ch(0x29); //
lcd_put_ch(0x25); //
lcd_put_ch(0x2B); //
lcd_put_ch(0x39); //
lcd_put_ch(0x00); //
lcd_put_ch(0x01); //
lcd_put_ch(0x03); //
lcd_put_ch(0x10); //
lcd_put_cmd(0xE1);
lcd_put_ch(0x03); //
lcd_put_ch(0x1D); //
lcd_put_ch(0x07); //
lcd_put_ch(0x06); //
lcd_put_ch(0x2E); //
lcd_put_ch(0x2C); //
lcd_put_ch(0x29); //
lcd_put_ch(0x2D); //
lcd_put_ch(0x2E); //
lcd_put_ch(0x2E); //
lcd_put_ch(0x37); //
lcd_put_ch(0x3F); //
lcd_put_ch(0x00); //
lcd_put_ch(0x00); //
lcd_put_ch(0x02); //
lcd_put_ch(0x10); //
lcd_put_cmd(0x2A); //列アドレス設定
lcd_put_ch(0x00); //上
lcd_put_ch(0x02); //下 開始アドレス0002h
lcd_put_ch(0x00); //上
lcd_put_ch(0x81); //下 開始アドレス0081h=129
lcd_put_cmd(0x2B); // リセット行アドレスセット
lcd_put_ch(0x00); //上
lcd_put_ch(0x01); //下 開始アドレス0003h
lcd_put_ch(0x00); //上
lcd_put_ch(0x82); //下 開始アドレス0082h=130
lcd_put_cmd(0x3A); // RGB転送タイプ/0x05=16ビットモード
lcd_put_ch(0x05); //
lcd_put_cmd(0x29); // ディスプレイ・表示開始
}
void delay_ms(uint32_t i)
{
i=i*100;
while(i>0){
asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP");
asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP");
asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP");
asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP");
i--;
} }
void delay_us(uint32_t i)
{
while(i>0){
asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP");
i--;
} }
]]>
STM32
2019-09-16T00:51:13+09:00
No Name Ninja
NINJA BLOG
No Name Ninja
-
http://obo.ko-me.com/stm32/stm32f030f4p6%E3%81%A75110lcd%E8%A1%A8%E7%A4%BA%EF%BC%88em
STM32F030F4P6で5110LCD表示(EmBitz-サンプルプログラム)
またしても、STM32F030F4P6でLCD表示を行う記事です。
今回はNokia5110というグラフィック液晶ディスプレーです。
1602よりも若干高めで、そもそも、供給源が解体された携帯電話からの回収部品であるために、市場からは1602よりも早く駆逐されてしまうと思いますが、決められたキャ...
またしても、STM32F030F4P6でLCD表示を行う記事です。
今回はNokia5110というグラフィック液晶ディスプレーです。
1602よりも若干高めで、そもそも、供給源が解体された携帯電話からの回収部品であるために、市場からは1602よりも早く駆逐されてしまうと思いますが、決められたキャラクター文字しか表示できない1602よりも、表現力は上で、使い勝手は圧倒的に勝るはずです。
とはいえ、まだ「表示できた」というだけのレベルで、文字や記号を表示するには至っていません。
今回は、「ちゃんと制御できた」ということを検証するためのデモプログラムという事になりますが、ここまでくればあとはどうにでもなるんじゃないかな? と思います。
とにかく、「ここまで来る道のり」が厳しかったです。
/*
**********************************************************************
**
** Main.c
** SPI-5110
** EmBitz
**
** A1-Input (現在は未使用)
** A5-Output RS (Reset)
** A6-Output CE (Master In Slave Out:Low=GND)
** A7-Output DC (Data/Command:Data=High_Command=Low)
** A2-Output DIN (Serial Input:送信Data)
** A3-Output CLK (Serial Clock)
** A4-Output LED (DL)
**
** 空のprojectを作成し、設定をhexファイルが取得できるように変更して、
** main.cにこの文章をcopy&pasteして、コンパイルすれば完成です
**
**
**********************************************************************/
/*
Last committed: $Revision: 27X$
Last changed by: $Author: Masaomi.Takahashi.$
Last changed date: $Date: 2019-09-01
ID: $Id: 0025
**********************************************************************/
#include "stm32f0xx.h"
int tt,tx; //画面更新のタイミング。Belay間隔。tx=実効値。tt=初期値。
int k; //描写する幅を少しずつ減らしてゆく為の変数。
int main(void)
{
RCC ->AHBENR |= (1<<17); // GPIO-Aの初期化(最初は0クロックで無可動状態)
GPIOA -> IDR |= (1<<2); // ピン A - 1 を入力モードに
GPIOA -> PUPDR |= (1<<2); // ピン A - 1 を プルアップ指定
GPIOA -> MODER |= (1<<4); // ピン A - 2 を出力モードに lcd-MOSI 送信データ。
GPIOA -> PUPDR |= (1<<4); // ピン A - 2 を プルアップ指定
GPIOA -> MODER |= (1<<6); // ピン A - 3 を出力モードに lcd-CLK クロック
GPIOA -> PUPDR |= (1<<6); // ピン A - 3 を プルアップ指定
GPIOA -> MODER |= (1<<8); // ピン A - 4 を出力モードに lcd-LED 赤=Low/青=Highで点灯
GPIOA -> PUPDR |= (1<<8); // ピン A - 4 を プルアップ指定
GPIOA -> MODER |= (1<<10); // ピン A - 5 を出力モードに lcd-RS リセット
GPIOA -> PUPDR |= (1<<10); // ピン A - 5 を プルアップ指定
GPIOA -> MODER |= (1<<12); // ピン A - 6 を出力モードに lcd-CE 入力データ (Low=GND)
GPIOA -> PUPDR |= (1<<12); // ピン A - 6 を プルアップ指定
GPIOA -> MODER |= (1<<14); // ピン A - 7 を出力モードに lcd-DC データ/コマンド
GPIOA -> PUPDR |= (1<<14); // ピン A - 7 を プルアップ指定
GPIOA ->ODR &= ~(1<<2); //GPIOA-Pin2をOffにする
GPIOA ->ODR &= ~(1<<3); //GPIOA-Pin3をOffにする
GPIOA ->ODR &= ~(1<<4); //GPIOA-Pin4をOffにする LEDなので、Onでも可
GPIOA ->ODR &= ~(1<<5); //GPIOA-Pin5をOffにする
GPIOA ->ODR &= ~(1<<6); //GPIOA-Pin6をOffにする
GPIOA ->ODR &= ~(1<<7); //GPIOA-Pin7をOffにする
delay_us(1);
lcd_init();
while(1){
tt=850;
while(tt>=0){
if (tt>=550)
tx=tt-550;
else
tx=0;
lcd_position(0,0);
int i=84*6;
while(i>0){
lcd_put_ch(0xFF);
i--;
}
delay_ms(tx);
lcd_position(0,0);
i=84*6;
while(i>0){
lcd_put_ch(0x7F);
i--;
}
delay_ms(tx);
lcd_position(0,0);
i=84*6;
while(i>0){
lcd_put_ch(0x3F);
i--;
}
delay_ms(tx);
lcd_position(0,0);
i=84*6;
while(i>0){
lcd_put_ch(0x1F);
i--;
}
delay_ms(tx);
lcd_position(0,0);
i=84*6;
while(i>0){
lcd_put_ch(0x0F);
i--;
}
delay_ms(tx);
lcd_position(0,0);
i=84*6;
while(i>0){
lcd_put_ch(0x07);
i--;
}
delay_ms(tx);
lcd_position(0,0);
i=84*6;
while(i>0){
lcd_put_ch(0x03);
i--;
}
delay_ms(tx);
lcd_position(0,0);
i=84*6;
while(i>0){
lcd_put_ch(0x01);
i--;
}
delay_ms(tx);
lcd_position(0,0);
i=84*6;
while(i>0){
lcd_put_ch(0x00);
i--;
}
delay_ms(tx);
lcd_position(0,0);
i=84*6;
while(i>0){
lcd_put_ch(0xFF);
i--;
}
delay_ms(tx);
k=7;
while(k>0){
lcd_position(0,0);
i=84*6;
int j=0;
while(i>0){
j++;
if (j>=k){
lcd_put_ch(0x00);
// j=0;
}
else{
lcd_put_ch(0xFF);
}
if (j>=7){
j=0;
}
i--;
}
delay_ms(tx);
k--;
}
tt=tt-25;
} } }
//---------- 文字列出力 ----------
// *str:文字列の先頭ポインタ
void lcd_put_str(char *str)
{
while(*str != 0){
lcd_put_ch( *str );
str++;
}
}
//---------- LCD初期化 ----------
void lcd_init()
{
GPIOA ->ODR &= ~(1<<5); //GPIOA-Pin5(RS)をOffにする
GPIOA ->ODR |= (1<<5); //GPIOA-Pin5(RS)をOnにする
delay_ms(2);
GPIOA ->ODR &= ~(1<<6); //GPIOA-Pin6(CE)をOffにする
lcd_put_cmd(0x21); //Extended Commands.
lcd_put_cmd(0xAF); //Contrast Vop=6.4V
lcd_put_cmd(0x04); //Set Temp coefficent.
lcd_put_cmd(0x13); //LCD bias mode 1:48.
lcd_put_cmd(0x20); //Standard Commands.
lcd_put_cmd(0x0C); //Normal mode
lcd_clear(); //Screen Clear.
}
//---------- 表示位置設定 ----------
// xx:x座標 yy:y座標
void lcd_position(int xx, int yy)
{
lcd_put_cmd(0x80 | xx | (0x40 * yy));
}
//---------- データ4bit出力 ----------
void lcd_put_4bit(char code)
{
GPIOA ->ODR &= ~(1<<3); //GPIOA-Pin3をOffにする
if(code & 0x80)
GPIOA ->ODR |= (1<<2); //GPIOA-Pin2をOnにする
else
GPIOA ->ODR &= ~(1<<2); //GPIOA-Pin2をOffにする
GPIOA ->ODR |= (1<<3); //GPIOA-Pin3をOnにする
GPIOA ->ODR &= ~(1<<3); //GPIOA-Pin3をOffにする
if(code & 0x40)
GPIOA ->ODR |= (1<<2); //GPIOA-Pin2をOnにする
else
GPIOA ->ODR &= ~(1<<2); //GPIOA-Pin2をOffにする
GPIOA ->ODR |= (1<<3); //GPIOA-Pin3をOnにする
GPIOA ->ODR &= ~(1<<3); //GPIOA-Pin3をOffにする
if(code & 0x20)
GPIOA ->ODR |= (1<<2); //GPIOA-Pin2をOnにする
else
GPIOA ->ODR &= ~(1<<2); //GPIOA-Pin2をOffにする
GPIOA ->ODR |= (1<<3); //GPIOA-Pin3をOnにする
GPIOA ->ODR &= ~(1<<3); //GPIOA-Pin3をOffにする
if(code & 0x10)
GPIOA ->ODR |= (1<<2); //GPIOA-Pin2をOnにする
else
GPIOA ->ODR &= ~(1<<2); //GPIOA-Pin2をOffにする
GPIOA ->ODR |= (1<<3); //GPIOA-Pin3をOnにする
}
//---------- 1文字出力 ----------
// ch:出力するデータ
void lcd_put_ch(char ch)
{
GPIOA ->ODR &= ~(1<<6); //GPIOA-Pin6(CE)をOffにする
GPIOA ->ODR |= (1<<7); //GPIOA-Pin7(DC)をOnにする
lcd_put_4bit(ch); //上位4bit出力
lcd_put_4bit(ch<<4); //下位4bit出力
GPIOA ->ODR |= (1<<6); //GPIOA-Pin6(CE)をOnにする
}
//---------- コマンド送信 ----------
void lcd_put_cmd(char cmd)
{
GPIOA ->ODR &= ~(1<<6); //GPIOA-Pin6(CE)をOffにする
GPIOA ->ODR &= ~(1<<7); //GPIOA-Pin7(DC)をOffにする
lcd_put_4bit(cmd); //上位4bit出力
lcd_put_4bit(cmd<<4);//下位4bit出力
GPIOA ->ODR |= (1<<6); //GPIOA-Pin6(CE)をOnにする
}
//---------- 塗りつぶし(消去) ----------
void lcd_clear()
{
lcd_position(0,0);
int i=84*6;
while(i>0){
lcd_put_ch(0x00);
i--;
} }
void delay_ms(uint32_t i)
{
i=i*100;
while(i>0){
asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP");
asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP");
asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP");
asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP");
i--;
} }
void delay_us(uint32_t i)
{
while(i>0){
asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP");
i--;
} }
以上。
恥ずかしくて顔が真っ赤になるような稚拙なプログラムかもしれませんが、所詮は専門的な教育を受けていない素人が、独学で好き勝手やっていることですので、ご理解ください。
(とりあえず、「無駄」とか「美しさ」とかは横に置いておいて、「動けばいい」、というスタンスです)
現在、回路はこんな感じでまとまっています。
消費電力は液晶付きでも10mA未満(簡易計測出来る限界未満)なので、この状況下では不満はないです。
配線はこんな感じ。
基板に落としこむ際に、Youtubeにアップロードした時とPinが随分変更されたのですが、「どうでもいい」話ですね。
この回路だと、USB端子を差しこめば動いてくれるので、ブレッドボードに沢山配線をぶっ刺していた頃と比べて、劇的に検証が楽になっています。
最後に。
この液晶(5110)に対して、STM32は一方的にデータを送信するだけの関係なので、LCDを回路から取り外しても、プログラムの挙動は変わりません。
ですので、ピンに余裕があるのでしたら、LCDはあくまでもシステムを管理する際の補助として使用し、普段はLDCを外して使用する、なんてことが可能です。
プログラムが正常に作動しているかどうかをチェックするだけなら、LCDの代わりにLEDを刺しておいても、ある程度把握できるはずです。]]>
STM32
2019-09-01T11:55:29+09:00
No Name Ninja
NINJA BLOG
No Name Ninja
-
http://obo.ko-me.com/%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3%E3%83%BB%E3%83%9E%E3%82%A4%E3%82%B3%E3%83%B3/stm32f030f4p6%E3%81%A71602lcd%E8%A1%A8%E7%A4%BA%EF%BC%88%E3%81%9D%E3%81%AE%EF%BC%92%EF%BC%89
STM32F030F4P6で1602LCD表示(その2)
先日のLCD1602の件なのですが、コードが大量に張り巡らされていて、ちょっとした衝撃で直ぐに動作不良を起こすという大問題がありました。
そこで、「基板化」を試みました。
(配線効率を考慮した結果、ピンに割り振っていた役割が変更された箇所が幾つかあります)
どちらが上でどちらが下かはともか...
そこで、「基板化」を試みました。
(配線効率を考慮した結果、ピンに割り振っていた役割が変更された箇所が幾つかあります)
どちらが上でどちらが下かはともかく、一方はこんな感じ。電源はマイクロUSB端子からもらうことにしました。
もう一方の側から見ると、こう。
一応、文字表示は行われているので、最低限の目標は達成したという事にしておきましょう。
左側の抵抗が幾つもくっついているのは、「良い子は絶対に真似をしてはいけません」 的な処理です。可変抵抗を組み込んでおいたのですが、それだと正常に作動しなかったので、こういう風に対処したのですが、ショートしてここに5V電流が流れこむと、加熱して最悪出火します。
うっかりやらかしてしまった私は、触って指の先に水ぶくれが出来ました。
まぁ、「プロトタイプ以前」の「テストタイプ 」 という事で、ご了承ください。
(とはいえ、実際に稼働することも事実なので、こんなものでも、実験機材としては十分に活躍の場面があるような気がします)
ちなみに、USB端子に差し込んで計測する簡易電流計で測定た所、これ一式の消費電流は10ミリアンペア程度のようです。
(以前、DigiSparkでこれと同じようなシステムを構築した時は2〜30mAだった気がする。あぁ、でも、あっちは、I2C変換するアダプタを噛ましていたので、消費電力が多くて当然なのか……。ダイソーの500円のモバイルバッテリーが900mAなので、それを使ったら90時間ぐらい動き続ける計算。ただ、消費電力が少ないので、ひと工夫しないと、自動的にOffになる)
それにしても、STM32F030、解ってくるとかなり楽しいです。
なにせ、ものすごく安価だし。
初心者が初心者っぽいことを楽しでいる分には、もてあますぐらい高性能だし。]]>
パソコン・マイコン
2019-08-12T09:42:00+09:00
No Name Ninja
NINJA BLOG
No Name Ninja
-
http://obo.ko-me.com/%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3%E3%83%BB%E3%83%9E%E3%82%A4%E3%82%B3%E3%83%B3/stm32f030f4p6%E3%81%A71602lcd%E8%A1%A8%E7%A4%BA%EF%BC%88em
STM32F030F4P6で1602LCD表示(EmBitz-サンプルプログラム)
STM32F030F4P6でLCD表示を行いました。
LCDは1602規格のもので、市場に安価に大量に出回っているので、供給についての不安は無用だと思います。
/*
**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&...
VIDEO
STM32F030F4P6でLCD表示を行いました。
LCDは1602規格のもので、市場に安価に大量に出回っているので、供給についての不安は無用だと思います。
/*
** Main.c
** LCD1602
** EmBitz
**
** A1-Input ボタン
** A2-Output RS
** A3-Output E
** A4-Output D4
** A5-Output D5
** A6-Output D6
** A7-Output D7
**
** 空のprojectを作成し、設定をhexファイルが取得できるように変更して、
** main.cにこの文章をcopy&pasteして、コンパイルすれば完成です
**
**********************************************************************/
/*
Last committed: $Revision: 16 $
Last changed by: $Author: Masaomi.Takahashi.$
Last changed date: $Date: 2019-08-09
ID: $Id: 0002$
**********************************************************************/
#include "stm32f0xx.h"
int main(void)
{
RCC ->AHBENR |= (1<<17); // GPIO-Aの初期化(最初は0クロックで無可動状態)
GPIOA -> IDR |= (1<<2); // ピン A - 1 を入力モードに
GPIOA -> PUPDR |= (1<<2); // ピン A - 1 を プルアップ指定
GPIOA -> MODER |= (1<<4); // ピン A - 2 を出力モードに lcd-Rs
GPIOA -> MODER |= (1<<6); // ピン A - 3 を出力モードに lcd-E
GPIOA -> MODER |= (1<<8); // ピン A - 4 を出力モードに lcd-D4
GPIOA -> MODER |= (1<<10); // ピン A - 5 を出力モードに lcd-D5
GPIOA -> MODER |= (1<<12); // ピン A - 6 を出力モードに lcd-D6
GPIOA -> MODER |= (1<<14); // ピン A - 7 を出力モードに lcd-D7
lcd_init(); // lcd初期設定
lcd_clear(); // 全消去
lcd_put_str("STM32F030F4P6");
lcd_position(0,1); // カーソル位置 桁0,行1
lcd_put_str("Make By EmBitz");
delay_ms(7500);
lcd_clear(); // 全消去
lcd_put_str("Vol.1.03");
delay_ms(2500);
lcd_clear(); // 全消去
lcd_put_str("ワレワレハシンリャクシャダ ト");
lcd_position(0,1); // カーソル位置 桁0,行1
lcd_put_str("イッテミル TEST");
delay_ms(7000);
while(1){
if(!(GPIOA->IDR & GPIO_IDR_1)){
delay_ms(7500);
lcd_clear(); // 全消去
lcd_put_str("ワレワレテキニハ コノワクセイヲ");
lcd_position(0,1); // カーソル位置 桁0,行1
lcd_put_str("シハイカニオク ヨテイデアル");
delay_ms(7500);
lcd_clear(); // 全消去
lcd_put_str("タダシ イカノ");
lcd_position(0,1); // カーソル位置 桁0,行1
lcd_put_str("アンゴウ ヲ");
delay_ms(7500);
lcd_clear(); // 全消去
lcd_put_str("カイドクデキタラ ");
lcd_position(0,1); // カーソル位置 桁0,行1
lcd_put_str("カンベンシテヤル");
delay_ms(7500);
lcd_clear(); // 全消去
lcd_put_str("1899190119251968");
lcd_position(0,1); // カーソル位置 桁0,行1
lcd_put_str("1975197919922011");
delay_ms(7500);
lcd_clear(); // 全消去
lcd_put_str("20192027");
lcd_position(0,1); // カーソル位置 桁0,行1
lcd_put_str("ヒント ハ - ワクセイ -");
delay_ms(7500);
lcd_clear(); // 全消去
lcd_put_str("ドウカ・・・"); // "ドウカ・・・"表示
lcd_position(0,1); // カーソル位置 桁0,行1
lcd_put_str("セカイガヘイワデスヨウニ");
delay_ms(7000);
} else {
delay_ms(500);
lcd_clear(); // 全消去
lcd_put_str("Hello World!!"); // "Hello World!!"表示
lcd_position(0,1); // カーソル位置 桁0,行1
lcd_put_str("コンニチハ セカイ!!");
} } }
//---------- 文字列出力 ----------
// *str:文字列の先頭ポインタ
void lcd_put_str(char *str)
{
while(*str != 0){
lcd_put_ch( *str );
str++;
}
}
//---------- LCD初期化 ----------
void lcd_init()
{
delay_ms(30);
lcd_put_4bit(0x30, 1); //8bit mode set
delay_ms(5);
lcd_put_4bit(0x30, 1); //8bit mode set
delay_ms(1);
lcd_put_4bit(0x30, 1); //8bit mode set
delay_ms(1);
lcd_put_4bit(0x20, 1); //4bit mode set
delay_ms(1);
lcd_put_cmd(0x2E); //DL=0 4bit mode
lcd_put_cmd(0x08); //display off C=D=B=0
lcd_put_cmd(0x0D); //display on C=D=1 B=0
lcd_put_cmd(0x06); //entry I/D=1 S=0
lcd_put_cmd(0x02); //cursor home
}
//---------- 表示位置設定 ----------
// tx:x座標 ty:y座標
void lcd_position(char tx, char ty)
{
GPIOA ->ODR &= ~(1<<2); //GPIOA-Pin4をOffにする(コマンドデータ)
lcd_put_cmd(0x80 | tx | (0x40 * ty));
GPIOA ->ODR |= (1<<2); //GPIOA-Pin2をOnにする(表示データ)
}
//---------- データ4bit出力 ----------
// code:DB4~DB7 に与えるデータ
// flag:0=表示モード 1=コマンドモード
void lcd_put_4bit(char code, int flag)
{
if(code & 0x80)
GPIOA ->ODR |= (1<<7); //GPIOA-Pin7をOnにする
else
GPIOA ->ODR &= ~(1<<7); //GPIOA-Pin7をOffにする
if(code & 0x40)
GPIOA ->ODR |= (1<<6); //GPIOA-Pin6をOnにする
else
GPIOA ->ODR &= ~(1<<6); //GPIOA-Pin6をOffにする
if(code & 0x20)
GPIOA ->ODR |= (1<<5); //GPIOA-Pin5をOnにする
else
GPIOA ->ODR &= ~(1<<5); //GPIOA-Pin5をOffにする
if(code & 0x10)
GPIOA ->ODR |= (1<<4); //GPIOA-Pin4をOnにする
else
GPIOA ->ODR &= ~(1<<4); //GPIOA-Pin4をOffにする
if (flag == 0)
GPIOA ->ODR |= (1<<2); //GPIOA-Pin2をOnにする(表示データ)
else
GPIOA ->ODR &= ~(1<<2); //GPIOA-Pin2をOffにする(コマンドデータ)
delay_us(1);
GPIOA ->ODR |= (1<<3); //GPIOA-Pin3をOnにする
delay_us(2);
GPIOA ->ODR &= ~(1<<3); //GPIOA-Pin3をOffにする
}
//---------- 1文字出力 ----------
// ch:出力するデータ
void lcd_put_ch(char ch)
{
lcd_put_4bit(ch, 0); //上位4bit出力
lcd_put_4bit(ch<<4, 0); //下位4bit出力
delay_us(50);
}
//---------- コマンド出力 ----------
// cmd:コマンド
void lcd_put_cmd(char cmd)
{
lcd_put_4bit(cmd, 1); //上位4bit出力
lcd_put_4bit(cmd<<4, 1);//下位4bit出力
delay_ms(2); //2msec待ち
}
//---------- 全消去 ----------
void lcd_clear()
{
lcd_put_cmd(0x01); //初期化コマンド出力
delay_ms(15); //15msec待ち
}
void delay_ms(uint32_t i)
{
i=i*100;
while(i>0){
asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP");
asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP");
asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP");
asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP");
i--;
} }
void delay_us(uint32_t i)
{
while(i>0){
asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP");
i--;
} }
以上をEmBitzで新規に作成したProjectのmain.cにまるごとコピペして、コンパイルすれば(ライブラリ等を新たに設定しなくても)動きます。
注意点は、LCDのEとRS端子の間にあるRW端子をGNDに繋げてやらないとダメ、という点です。
これが判らなくて、私は延々とドツボにはまり続けました。
なお、プログラムの主要部分は、
ohkinというブログの、
STM32と Arduino IDE で
液晶ディスプレイに文字表示(その1)
~ライブラリ未使用~
という記事を参考(丸パクリ)にさせていただきました。
なお、delayに関しては、完全に「適当」です。一切計測とかしてません。カンです。動いたから、そのままにしているだけです。他のプログラムにこれを流用して、そのままタイミングをとるとか無茶なことをされても、一切責任は負いません。
あと、割り込みとかしてないので、delay中にボタンを押しても反応しません。ので、次の処理へ移行させるためには、延々とボタンを押し続ける必要があります。
ちなみに、このプログラムによって使用される容量は4.5KBぐらい。
STM32F030F4P6のメモリは16KBだから、メインの処理を他に作って、こちら(ディスプレイ表示)を隠しモードとして潜ませておく、なんて事も可能ではないかと思います。
STM32F030F4P6はものすごく安くて高性能なので、もっと使いこなせるようになりたいです。]]>
パソコン・マイコン
2019-08-10T08:18:20+09:00
No Name Ninja
NINJA BLOG
No Name Ninja
-
http://obo.ko-me.com/%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3%E3%83%BB%E3%83%9E%E3%82%A4%E3%82%B3%E3%83%B3/stm32f030f4p6%E3%81%A7%E3%83%9C%E3%82%BF%E3%83%B3%E5%85%A5%E5%8A%9B%EF%BC%88embitz
STM32F030F4P6でボタン入力(EmBitz-サンプルプログラム)
EmBitzは思ったよりも資料が少ない感じで、もしかしたらおすすめでは無いかもしれません。
ですが、後々私自身が必要になりそうな気がするので、判ったことを、忘れないように書き留めておきます。
STM32F030F4P6の乗ったミニ基版で、わりとメジャーな存在のボードと、タクトスイッチで作...
ですが、後々私自身が必要になりそうな気がするので、判ったことを、忘れないように書き留めておきます。
STM32F030F4P6の乗ったミニ基版で、わりとメジャーな存在のボードと、タクトスイッチで作った押しボタン回路を接続しています。接続先はGPIOAの01番Pinです。
このボタンを押したら、ボード上のLEDが点灯するというプログラムを書きました。
/*
** GPIO-IDR-Main.c
** ボタンを押すとLEDが光るプログラム
** EmBitz
** A1-Input
** A4-LED
**
**********************************************************************/
/*
Last committed: $Revision: 03 $
Last changed by: $Author: Masaomi.Takahashi.$
Last changed date: $Date: 2019-07-02
ID: $Id: 0002$
**********************************************************************/
#include "stm32f0xx.h"
int main(void)
{
RCC ->AHBENR |= (1<<17); //GPIO-Aの初期化(最初は0クロックで無可動状態)
GPIOA -> MODER |= (1<<8); // ピン A - 4 を出力モードに
GPIOA -> IDR |= (1<<2); // ピン A - 1 を入力モードに
GPIOA -> PUPDR |= (1<<2); // ピン A - 1 を プルアップ指定
while(1){
if(!(GPIOA->IDR & GPIO_IDR_1)){
GPIOA ->ODR |= (1<<4); //GPIOA-Pin4をOnにする - - - - - - - - 9.4.6(ポート出力)
} else {
GPIOA ->ODR &= ~(1<<4); //GPIOA-Pin4をOffにする - - - - - - - - 9.4.6(ポート出力)
} } }
これだけです。
VIDEO
一応、動画にアップロードしました。
下はオマケ(蛇足)です。
自作した、ほぼ同等の回路。市販のミニ基板とほぼ同面積です。プログラムの書き込み、吸い出し、消去も出来ますし、LEDもミニ基板と同様のGPIOA-4番Pinに接続してあります。その上で、スイッチを追加出来るようになってます。
その前進の形。この時点では、スイッチ部分の回路がまだ未確定でした。
プログラムに関してもよく判らない、ハードウェアについてもよく解らない。
そんな状況下での開発だったので、開発はものすごく難航しました。当初は「点きっぱなしだったLEDが消えたぞ。やった、成功だ!!」と思ったら、単に回路がショートしているだけだったりとか。
まぁ、そんな感じです。]]>
パソコン・マイコン
2019-07-04T10:12:10+09:00
No Name Ninja
NINJA BLOG
No Name Ninja
-
http://obo.ko-me.com/%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3%E3%83%BB%E3%83%9E%E3%82%A4%E3%82%B3%E3%83%B3/stm32f030f4p6
STM32F030F4P6でLチカ(EmBitz-サンプルプログラム)
STM32F030F4P6というマイコンで、なんとか自力でLチカプログラムを制作することが出来ました。
(もちろん、幾つもの資料を参考にしています)
まず、IDEはEmBitz(Ver1.11)を採用しました。
このIDEは、ユーザー登録などしなくても使用できます。
XP以降のWindowsマシ...
(もちろん、幾つもの資料を参考にしています)
まず、IDEはEmBitz(Ver1.11)を採用しました。
このIDEは、ユーザー登録などしなくても使用できます。
XP以降のWindowsマシンに対応しているようなので、古いXPマシンを用意するとか、仮想マシン上でプログラミング環境を作ってしまうのが良いと思います。
※LinuxのWineだと、上手く動きませんでした。
新規作成すると、プロジェクトの中にSTM32シリーズがちゃんと用意されているので、そこからF0xxを選択します。
main.cを選択すると、最低限の情報が記載されたプログラムが表示されます。
(これをビルドすると、「何もしないプログラム」を得ることが出来ます)
これを、以下のプログラムで置き換えてしまうと、LEDが点滅するプログラムが得られます。
ですが、初期状態ではHEXファイルは作成されません。
Hexファイルを入手するためには、Project >> Projectties >> Build targets と選択して、そこにあるGenerate Hex Fileの項目にチェックを入れてください。
ここにチェックを入れた状態でBuildを行うと、Hexファイルが作成されるので、あとはこのHexファイルをマイコンに書き込んでやれば、制作したプログラムが実行されるはずです。
STM32に関して、私はほぼ完全な初心者なのでHALとかの事はよく判りませんが、EmBitzだけでも、とりあえずプログラミングは可能なのだと思いました。
※LEDは10番目のGPIOA-4Pinの位置に接続されているものとします。
/*
**
** Main.c
**
**
**********************************************************************/
/*
Last committed: $Revision: 01 $
Last changed by: $Masaomi Takahashi: $
Last changed date: $Date: 20190623$
ID: $Id: STM32F030F4P6-LED$
**********************************************************************/
#include "stddef.h"
#include "stm32f0xx.h"
#include "stm32f0xx_conf.h"
uint32_t count;
int main(void)
{
volatile unsigned int x=0;
RCC ->AHBENR |= (1<<17); //Enable CLK for Port A
// RCC ->AHBENR |= (1<<18); //Enable CLK for Port B
// RCC ->AHBENR |= (1<<19); //Enable CLK for Port C
GPIOA -> MODER |= (1<<8); //Enable Port A Pin4 as a digital output
// GPIOA -> MODER |= (1<<12); //Enable Port A Pin6 as a digital output
// GPIOA -> MODER |= (1<<14); //Enable Port A Pin7 as a digital output
// GPIOA -> MODER |= (1<<16); //Enable Port A Pin8 as a digital output
while(1){
// LED4 (blue) is controlled by Port C Pin8 output
GPIOA ->ODR |= (1<<4); //Turn GPIOA Pin 4 On
for (x=0; x<1000000; x++);
GPIOA ->ODR &= ~(1<<4); //Turn GPIOA Pin 4 Off
for (x=0; x<1000000; x++);
}
}]]>
パソコン・マイコン
2019-06-23T09:58:39+09:00
No Name Ninja
NINJA BLOG
No Name Ninja
-
http://obo.ko-me.com/%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3%E3%83%BB%E3%83%9E%E3%82%A4%E3%82%B3%E3%83%B3/sdl2-gcc-sample-progrum01
SDL2+gcc-Sample-progrum01(サンプルプログラム)
前の記事に載せた、サンプルプログラムです。
SDL2/gcc/Linuxという組み合わせで作成しています。
動作を確認することが目的なので、女の子の初期位置が微妙とか、色々ありますが、気にしないでください。
また、画面左上の数字はFPSのつもりですが、精度がどれほどのものかは、まったく当てになりま...
前の記事に載せた、サンプルプログラムです。
SDL2/gcc/Linuxという組み合わせで作成しています。
動作を確認することが目的なので、女の子の初期位置が微妙とか、色々ありますが、気にしないでください。
また、画面左上の数字はFPSのつもりですが、精度がどれほどのものかは、まったく当てになりません。
実行中の画面は、前記事を参考にしてください。
(本当に、期待するようなものじゃないです)
//
// 2019.01.28
// PNG-timer-02a.CPP
// png画像を扱い、透過処理を行うサンプルプログラム
// カーソルキーで左右に動き、ESCキーでプログラム終了
// 画像の一部分だけを切り出してコピーできる(画面左上のカウンターに使用している)
//
// 製作者の環境はgcc/ubuntu18.04(KonaLinux4.0)
// コンパイルコマンドは以下の通り
// gcc -g -o png-01 png-01.cpp `sdl2-config --cflags --libs` -lSDL2_image
// geany用コマンド
// gcc -g -o "%e" "%f" `sdl2-config --cflags --libs` -lSDL2_image
//
#include <stdio.h>
int loopy=1; //無限ループ処理で、whileを回し続けるためのもの
int va=0;
int vga=0; //画面のサイズ0ならウィンドーモード、1ならフル画面
int iw,ih; //テクスチャ画像の処理の為に用意する変数
int cx=200; //カーソルキーで左右にテクスチャを動かす実験用
int cxx=00; //カーソルキーで左右にテクスチャを動かす実験用
SDL_atomic_t frames;
/* 設定された間隔で平均フレームレートの計算と表示を行う */
Uint32 fps_timer_callback(Uint32 interval, void *data)
{
const float f = SDL_AtomicGet(&frames);
const float iv = (float)interval / 1000.0f;
// printf("%.2f\tfps\n", f / iv);
va=(f/iv)/60;
/* フレームカウンタをリセットする */
SDL_AtomicSet(&frames, 0);
return interval;
}
int main(int, char ** const){
SDL_Init(SDL_INIT_VIDEO); //Windows作成処理開始
SDL_Window* window = SDL_CreateWindow("SDL-Test", //Windows作成処理・タイトル
SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED, //Windows作成処理
320,240,vga); //Windows作成処理・サイズ&モード
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, 0); //Windows作成処理終了
SDL_Surface *screen = SDL_GetWindowSurface(window);
int flags = IMG_INIT_PNG; //SDL_Image初期化開始
int initted = IMG_Init(flags); //エラー対応
if((initted & flags) != flags) { //エラー対応
printf("IMG_Init: Failed to init required jpg and png support!\n");
printf("IMG_Init: %s\n", IMG_GetError()); //エラー対応
}; //SDL_Image初期化終了
SDL_Surface *image = IMG_Load("image/myw4sss.png"); //png画像読み込み(フロント)
SDL_Surface *backg = IMG_Load("image/spring.png"); //png画像読み込み(背景)
if(!image & !backg){ //エラー対応
printf("IMG_Load: %s\n", IMG_GetError()); //エラー対応
}; //png画像読み込み終了
SDL_Texture *backg_texture; //png画像の変数化(背景)
backg_texture = SDL_CreateTextureFromSurface(renderer, backg); //png画像の変数化(背景)
SDL_FreeSurface(backg); //RGBサーフェイス開放
SDL_Texture *image_texture; //png画像の変数化(フロント)
SDL_SetColorKey( image, SDL_TRUE, //透過色の設定
SDL_MapRGB(image->format, 255, 0, 255));//透過色の設定
image_texture = SDL_CreateTextureFromSurface(renderer, image); //png画像の変数化(フロント)
SDL_FreeSurface(image); //RGBサーフェイス開放
SDL_Event ev; //エラー確認
if (SDL_PollEvent(&ev)) { //エラーへの対応。対象はev
if (ev.type == SDL_QUIT) { //戻り値の如何によって処理は終了となる
loopy=0; //戻り値の如何によって処理は終了となる
}; //戻り値の如何によって処理は終了となる
}; //戻り値の如何によって処理は終了となる
SDL_QueryTexture(backg_texture, NULL, NULL, &iw, &ih); //画像テクスチャのサイズを取得
SDL_Rect backg_rect = (SDL_Rect){0,0,iw,ih}; //取得したサイズから、構造体を定義
SDL_QueryTexture(image_texture, NULL, NULL, &iw, &ih); //画像テクスチャのサイズを取得
// SDL_Rect image_rect = (SDL_Rect){0,0,iw/2,ih/2}; //取得したサイズから、構造体を定義
SDL_Rect SrcR; /*呪い少女A&B*/ //テクスチャから一部を切り出すための前処理
SrcR.x = 8; /*左端X座標 */ //テクスチャから一部を切り出すための前処理
SrcR.y = 0; /*左端Y座標 */ //テクスチャから一部を切り出すための前処理
SrcR.w = 56; /*取出し横量 */ //テクスチャから一部を切り出すための前処理
SrcR.h = 88; /*取出し縦量 */ //テクスチャから一部を切り出すための前処理
SDL_Rect DestR1; /*呪い少女 A */ //テクスチャから一部を切り出すための前処理
// DestR1.x = cx; /*表示X座標 */ //移動に関係するため、ループ中に設定
DestR1.y = 100; /*表示Y座標 */ //テクスチャから一部を切り出すための前処理
DestR1.w = (56); /*取出し横量 */ //テクスチャから一部を切り出すための前処理
DestR1.h = (88); /*取出し縦量 */ //テクスチャから一部を切り出すための前処理
SDL_Rect DestR2; /*呪い少女 B */ //テクスチャから一部を切り出すための前処理
// DestR2.x = cx; /*表示X座標 */ //移動に関係するため、ループ中に設定
DestR2.y = 100; /*表示Y座標 */ //テクスチャから一部を切り出すための前処理
DestR2.w = (56); /*取出し横量 */ //テクスチャから一部を切り出すための前処理
DestR2.h = (88); /*取出し縦量 */ //テクスチャから一部を切り出すための前処理
SDL_Rect NunbD3; /*数字3桁目 */ //テクスチャから数字部分を切り出す為の前処理
NunbD3.x = 30; //テクスチャから数字部分を切り出す為の前処理
NunbD3.y = 30; //テクスチャから数字部分を切り出す為の前処理
NunbD3.w = 16; //テクスチャから数字部分を切り出す為の前処理
NunbD3.h = 24; //テクスチャから数字部分を切り出す為の前処理
SDL_Rect NunbD2; //テクスチャから数字部分を切り出す為の前処理
NunbD2.x = 46; //テクスチャから数字部分を切り出す為の前処理
NunbD2.y = 30; //テクスチャから数字部分を切り出す為の前処理
NunbD2.w = 16; //テクスチャから数字部分を切り出す為の前処理
NunbD2.h = 24; //テクスチャから数字部分を切り出す為の前処理
SDL_Rect NunbD1; //テクスチャから数字部分を切り出す為の前処理
NunbD1.x = 62; //テクスチャから数字部分を切り出す為の前処理
NunbD1.y = 30; //テクスチャから数字部分を切り出す為の前処理
NunbD1.w = 16; //テクスチャから数字部分を切り出す為の前処理
NunbD1.h = 24; //テクスチャから数字部分を切り出す為の前処理
SDL_AddTimer((1000/60), fps_timer_callback, NULL); //サブルーチン呼び出し設定(1/60秒に1回)
//////////////////////////////////////////////////////////////////////
// 以下、メインアルゴリズム
//////////////////////////////////////////////////////////////////////
int vvga; //変数の設定(カウンター補佐用)
while(loopy){ //メインルーチン開始(無限ループ)
vvga=va/100;
SDL_Rect NunbU3; //テクスチャから一部を切り出すための前処理
NunbU3.x = 0+(vvga*8); //テクスチャから一部を切り出すための前処理
NunbU3.y = 180; //テクスチャから一部を切り出すための前処理
NunbU3.w = 8; //「8」はコピー元の数字で、2倍表示している
NunbU3.h = 12; //「12」はコピー元の数字で、2倍表示している
vvga=(va-(vvga*100))/10;
SDL_Rect NunbU2; //テクスチャから一部を切り出すための前処理
NunbU2.x = 0+(vvga*8); //テクスチャから一部を切り出すための前処理
NunbU2.y = 180; //テクスチャから一部を切り出すための前処理
NunbU2.w = 8; //「8」はコピー元の数字で、2倍表示している
NunbU2.h = 12; //「12」はコピー元の数字で、2倍表示している
vvga=0+va%10;
SDL_Rect NunbU1; //テクスチャから一部を切り出すための前処理
NunbU1.x = 0+(vvga*8); //テクスチャから一部を切り出すための前処理
NunbU1.y = 180; //テクスチャから一部を切り出すための前処理
NunbU1.w = 8; //「8」はコピー元の数字で、2倍表示している
NunbU1.h = 12; //「12」はコピー元の数字で、2倍表示している
DestR1.x = cx; //テクスチャから一部を切り出すための前処理
DestR2.x = 220-cx; //テクスチャから一部を切り出すための前処理
SDL_SetRenderDrawColor(renderer, 200, 200, 200, 255); //色指定(灰色)
SDL_RenderClear(renderer); //指定色による塗りつぶし(画面初期化)
SDL_RenderCopy(renderer,backg_texture, //描写のための処理(背景)
NULL, NULL); //描写のための処理(背景)
// SDL_Rect draw_rect = (SDL_Rect){640-cx,200,iw/2,ih/2}; //取得したサイズから、構造体を定義
SDL_RenderCopy(renderer,image_texture, //描写のための処理(フロント)
&SrcR,&DestR1); //描写のための処理(フロント)
SDL_RenderCopy(renderer,image_texture, //描写のための処理(フロント)
&SrcR,&DestR2); //描写のための処理(フロント)
SDL_RenderCopy(renderer,image_texture, //描写のための処理(数字)
&NunbU3,&NunbD3); //描写のための処理(数字)
SDL_RenderCopy(renderer,image_texture, //描写のための処理(数字)
&NunbU2,&NunbD2); //描写のための処理(数字)
SDL_RenderCopy(renderer,image_texture, //描写のための処理(数字)
&NunbU1,&NunbD1); //描写のための処理(数字)
SDL_Delay(0); //待機
SDL_RenderPresent(renderer); //描写を反映させる
SDL_AtomicAdd(&frames, 1); //FPS用のカウンターに加算する
SDL_Event e; //キーボード入力のための待機
while(SDL_PollEvent(&e)){ //イベントがなければ内部が実行される
if (e.type==SDL_KEYDOWN){ //キーボード入力があるかどうか調べている
switch (e.key.keysym.sym){ //キーをチェックしている
case SDLK_ESCAPE: //ESCキーだった場合
loopy=0; //looyt=0は、メインループからの脱出=終了
break;
case SDLK_RIGHT: //右カーソルキーだった場合
cx=cx+2;
break;
case SDLK_LEFT: //左カーソルキーだった場合
cx=cx-2;
break;
}}};
if (cx>=640){cx=cx-2;
};
if (cx<=0) {cx=cx+2;
};
};
//////////////////////////////////////////////////////////////////////
// 以下、プログラム終了処理
//////////////////////////////////////////////////////////////////////
IMG_Quit(); //プログラム終了処理
SDL_FreeSurface(image); //プログラム終了処理
SDL_DestroyTexture(image_texture); //プログラム終了処理
SDL_DestroyRenderer(renderer); //プログラム終了処理
SDL_DestroyWindow(window); //プログラム終了処理
SDL_Quit(); //SDL終了処理
return 0;
};
使用した画像ファイル。
/image/myw4sss.png
/ image/spring.png
2つの画像ファイルは、「image」というフォルダ内に収めてください。
ってか、背景画像は、640x480になってますね。
最初はこのサイズで作っていたので。 ]]>
パソコン・マイコン
2019-01-28T20:15:23+09:00
No Name Ninja
NINJA BLOG
No Name Ninja
-
http://obo.ko-me.com/%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3%E3%83%BB%E3%83%9E%E3%82%A4%E3%82%B3%E3%83%B3/linux%E3%81%A7sdl2%E3%82%92%E5%A7%8B%E3%82%81%E3%81%BE%E3%81%97%E3%81%9F
LinuxでSDL2を始めました
以前から、SDLというものに関心がありました。
プログラミングで、画像処理をしてくれる支援ツールのようなものです。
これさえあれば、WindowsでもMacでも、Linuxでも、移植し放題!!
みたいな、夢が詰まっていましたから。
それで、試行錯誤を重ねた結果、なんとか動かせるようになったの...
プログラミングで、画像処理をしてくれる支援ツールのようなものです。
これさえあれば、WindowsでもMacでも、Linuxでも、移植し放題!!
みたいな、夢が詰まっていましたから。
それで、試行錯誤を重ねた結果、なんとか動かせるようになったのです。
使用したOSはubuntu系列のもので、これに関しては、SDL2の導入はものすごく簡単でした。
まぁ、解るまでがものすごく困難を極めたわけですけどね。
sudo apt-get install libsdl2-dev
sudo apt-get install libsdl2-image-dev libsdl2-mixer-dev libsdl2-net-dev libsdl2-ttf-dev
ターミナルから、たったこの2行を打ち込む(というか、コピペ)するだけ。
たったそれだけで、SDL2のインストールは完了です。
そして、現在、私の場合はLinuxではメジャーなGeanyというエディターっぽいやつでプログラムを書いているのですが、これ用のコンパイルコマンドは、
gcc -g -o "%e" "%f" `sdl2-config --cflags --libs` -lSDL2_image
こんな感じでOKです。
ターミナルから入力する場合
gcc -g -o 欲しいプログラム名 実行したいプログラム名 `sdl2-config --cflags --libs` -lSDL2_image
みたいになります。
それから、-lSDL2_imageだけで足りない場合は、末尾の部分に-lSDL2_ttfとか-lSDL2_netとかを、プログラムに合わせて追加してやってください。
それと、DSLは単体では使用されず、CとかJAVAとかGoとかと組み合わせるものであるという性質上、自分が求めている環境のサンプルプログラムを探すのが、かなり厳しいです。
私の場合、こちらのブログ「ゲームを作りたい! 」が、ソースリストをあらかた開示してくれていてとても参考になりました。
まぁ、一番悲しいのは、欲しい情報が「SDL2」なのに、「無印SDL」の情報が出てきちゃうことでしょうかね。
こうなると、製作サイドには「名前を変える」ってことを、積極的に考えてほしいですね。]]>
パソコン・マイコン
2019-01-28T19:56:30+09:00
No Name Ninja
NINJA BLOG
No Name Ninja