极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11664|回复: 3

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

[复制链接]
发表于 2015-11-18 16:59:24 | 显示全部楼层 |阅读模式
玩 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;
}


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

使用道具 举报

发表于 2015-11-19 10:12:18 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2015-11-19 10:29:15 | 显示全部楼层
这项目的目的是什么,只是练手,还是有实用价值
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-19 22:49:30 | 显示全部楼层
flying03 发表于 2015-11-19 10:29
这项目的目的是什么,只是练手,还是有实用价值

在这里发文,你想能是什么
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-16 23:22 , Processed in 0.086245 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表