玩 Arduino 已有时日,虽然不懂英文,不会编程,懵懵懂懂 误闯误撞,总算略知一二。
玩单片机,总离不了人机交互,屏幕键盘是少不了的,驱动键盘 比较好办,驱动屏幕 也不麻烦。麻烦的是控制屏幕。
自编驱动屏幕程序,虽然最简单,但是控制屏幕最麻烦,所有程序都得自编,好处是程序空间占用最少。
借用屏幕驱动程序,虽然省去了编写屏幕驱动的麻烦,但要查找大量资料,控制屏幕的大量命令都得仔细揣摩。
经过对比时下流行的驱动程序,如:SSD_1306, Adafruit_SSD1306-master, U8GLIB,发现 U8GLIB 最让人爱恨交加。
其好处是:
1. 功能非常强大,几乎是你想办的事,基本都能办到。
2. 支持的硬件很多,硬件选择比较灵活。
3. 程序代码较少,程序流程明晰。
4. 关键是程序代码精炼,不仅占用程序空间少,关键是占用 内存很少,这是一个好消息。
但是不好的地方也有:
1. 现成资料较少。官网上不去,国家把这个放荡不羁 gooie 挡住了,但是他的本事也难以学习。爱恨交加悠然人生。
2. 查找命令 麻烦,好大的一堆文件,处处都有命令代码,脑子再清醒,此时也大了。
耐着性子 学学学!
现在把 U8G 的 国际象棋 程序 略微精简 加 简单注释,(必应翻译加猜注),不懂英文,专家指教。
/*******************************
Chess.pde
国际象棋
项目使用了 15,302 字节,占用了 (49%) 程序存储空间。最大为 30,720 字节。
全局变量使用了638字节,(31%)的动态内存,余留1,410字节局部变量。最大为2,048字节。
********************************/
#include "U8glib.h"
//U8GLIB_SSD1306_128X64 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
U8GLIB_SH1106_128X64 u8g(13, 11, 10, 9,12); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RET=12
//*********** 按键配置 *********************
uint8_t uiKeyPrev = 2; // 键盘 上一页
uint8_t uiKeyNext = 4; // 键盘 下一页
uint8_t uiKeySelect = 5; // 键盘 选择
uint8_t uiKeyBack = 3; // 键盘 返回
uint8_t uiKeyCodeFirst = CHESS_KEY_NONE; // 第一次代码
uint8_t uiKeyCodeSecond = CHESS_KEY_NONE; // 第二次代码
uint8_t uiKeyCode = CHESS_KEY_NONE; // 键 代码值
//****************** 设置 用户键盘界面 ************************
void uiSetup(void) {
// configure input keys // 配置输入的键
pinMode(uiKeyPrev, INPUT); // 设置 上一页 输入端口
digitalWrite(uiKeyPrev, HIGH); // 初始化为 高电平
pinMode(uiKeyNext, INPUT); // 设置 下一页 输入端口
digitalWrite(uiKeyNext, HIGH);
pinMode(uiKeySelect, INPUT); // 设置 选择 输入端口
digitalWrite(uiKeySelect, HIGH);
pinMode(uiKeyBack, INPUT); // 设置 返回 输入端口
digitalWrite(uiKeyBack, HIGH);
}
//*************** 判断 键盘 ****************************
void uiStep(void)
{
uiKeyCodeSecond = uiKeyCodeFirst; // 第一次代码
if ( digitalRead(uiKeyPrev) == LOW ) // 键盘 上一页 = 低电平
uiKeyCodeFirst = CHESS_KEY_PREV;
else if ( digitalRead(uiKeyNext) == LOW ) // 如果按下 下一页 键盘
uiKeyCodeFirst = CHESS_KEY_NEXT;
else if ( digitalRead(uiKeySelect) == LOW ) // 如果按下 选择 键盘
uiKeyCodeFirst = CHESS_KEY_SELECT;
else if ( digitalRead(uiKeyBack) == LOW ) // 如果按下 返回 键盘
uiKeyCodeFirst = CHESS_KEY_BACK;
else
uiKeyCodeFirst = CHESS_KEY_NONE;
if ( uiKeyCodeSecond == uiKeyCodeFirst )
uiKeyCode = uiKeyCodeFirst;
else
uiKeyCode = CHESS_KEY_NONE;
}
void setup() {
// u8g.setRot180(); // 如果需要,旋转屏幕,
uiSetup();
chess_Init(u8g.getU8g(), 0); // 初始化 国际象棋, 神秘兮兮东西 你在哪?
}
void loop() {
uint8_t keyCode = CHESS_KEY_NONE;
u8g.firstPage();
do {
chess_Draw(); // (画 国际象棋) 你在哪?Google 的大侠们!
uiStep();
if ( uiKeyCode != CHESS_KEY_NONE )
keyCode = uiKeyCode;
} while( u8g.nextPage() );
u8g_Delay(10); // U8G 的 延时?
chess_Step(keyCode);
uiStep(); // 取 按一次 键盘的值
keyCode = uiKeyCode;
}
粘贴图片真麻烦,一下搞不定
|