老来疯 发表于 2015-11-18 16:59:24

爱恨交加 U8G , 国际象棋 看!看!看!

玩 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_tuiKeyCodeSecond = 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;
}


粘贴图片真麻烦,一下搞不定

hmjack2008 发表于 2015-11-19 10:12:18

http://code.google.com/p/u8glib/
https://github.com/olikraus/u8glib

flying03 发表于 2015-11-19 10:29:15

这项目的目的是什么,只是练手,还是有实用价值

老来疯 发表于 2015-11-19 22:49:30

flying03 发表于 2015-11-19 10:29 static/image/common/back.gif
这项目的目的是什么,只是练手,还是有实用价值

在这里发文,你想能是什么
页: [1]
查看完整版本: 爱恨交加 U8G , 国际象棋 看!看!看!