- /* ============================================================
- * 浦晓明滑动菜单移植版 —— 统一布局 + 提速
- * 图标 x=4/48/92,滑动 44 列,滑完不重画,只更新文字
- * 滑动一次移 11 列,只刷前 4 页
- * 4 个菜单项共用同一个 32x32 实心方块图标
- * 4 针 I2C,按键 P3.5 左移 / P5.4 右移 / P3.4 清屏
- * 主频 36.864MHz
- * ============================================================ */
-
- #include "STC32G.h"
- #include <string.h>
- #include <stdlib.h>
-
- typedef unsigned char u8;
- typedef unsigned int u16;
- typedef unsigned long u32;
-
- #define MAIN_Fosc 36864000L
- #define MENU_NUM 4
-
- /* ==================== 按键定义 ==================== */
- sbit KEY_LEFT = P3^5;
- sbit KEY_RIGHT = P5^4;
- sbit KEY_EXIT = P3^4;
-
- /* ==================== 显存缓冲(双页) ==================== */
- u8 xdata ShowBuf[8][256];
-
- /* ==================== 6x8 ASCII 字库 ==================== */
- u8 code ASC8[][6] = {
- 0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x2F,0x00,0x00,
- 0x00,0x00,0x07,0x00,0x07,0x00,
- 0x00,0x14,0x7F,0x14,0x7F,0x14,
- 0x00,0x24,0x2A,0x7F,0x2A,0x12,
- 0x00,0x62,0x64,0x08,0x13,0x23,
- 0x00,0x36,0x49,0x55,0x22,0x50,
- 0x00,0x00,0x05,0x03,0x00,0x00,
- 0x00,0x00,0x1C,0x22,0x41,0x00,
- 0x00,0x00,0x41,0x22,0x1C,0x00,
- 0x00,0x14,0x08,0x3E,0x08,0x14,
- 0x00,0x08,0x08,0x3E,0x08,0x08,
- 0x00,0x00,0x00,0xA0,0x60,0x00,
- 0x00,0x08,0x08,0x08,0x08,0x08,
- 0x00,0x00,0x60,0x60,0x00,0x00,
- 0x00,0x20,0x10,0x08,0x04,0x02,
- 0x00,0x3E,0x51,0x49,0x45,0x3E,
- 0x00,0x00,0x42,0x7F,0x40,0x00,
- 0x00,0x42,0x61,0x51,0x49,0x46,
- 0x00,0x21,0x41,0x45,0x4B,0x31,
- 0x00,0x18,0x14,0x12,0x7F,0x10,
- 0x00,0x27,0x45,0x45,0x45,0x39,
- 0x00,0x3C,0x4A,0x49,0x49,0x30,
- 0x00,0x01,0x71,0x09,0x05,0x03,
- 0x00,0x36,0x49,0x49,0x49,0x36,
- 0x00,0x06,0x49,0x49,0x29,0x1E,
- 0x00,0x00,0x36,0x36,0x00,0x00,
- 0x00,0x00,0x56,0x36,0x00,0x00,
- 0x00,0x08,0x14,0x22,0x41,0x00,
- 0x00,0x14,0x14,0x14,0x14,0x14,
- 0x00,0x00,0x41,0x22,0x14,0x08,
- 0x00,0x02,0x01,0x51,0x09,0x06,
- 0x00,0x32,0x49,0x59,0x51,0x3E,
- 0x00,0x7C,0x12,0x11,0x12,0x7C,
- 0x00,0x7F,0x49,0x49,0x49,0x36,
- 0x00,0x3E,0x41,0x41,0x41,0x22,
- 0x00,0x7F,0x41,0x41,0x22,0x1C,
- 0x00,0x7F,0x49,0x49,0x49,0x41,
- 0x00,0x7F,0x09,0x09,0x09,0x01,
- 0x00,0x3E,0x41,0x49,0x49,0x7A,
- 0x00,0x7F,0x08,0x08,0x08,0x7F,
- 0x00,0x00,0x41,0x7F,0x41,0x00,
- 0x00,0x20,0x40,0x41,0x3F,0x01,
- 0x00,0x7F,0x08,0x14,0x22,0x41,
- 0x00,0x7F,0x40,0x40,0x40,0x40,
- 0x00,0x7F,0x02,0x0C,0x02,0x7F,
- 0x00,0x7F,0x04,0x08,0x10,0x7F,
- 0x00,0x3E,0x41,0x41,0x41,0x3E,
- 0x00,0x7F,0x09,0x09,0x09,0x06,
- 0x00,0x3E,0x41,0x51,0x21,0x5E,
- 0x00,0x7F,0x09,0x19,0x29,0x46,
- 0x00,0x46,0x49,0x49,0x49,0x31,
- 0x00,0x01,0x01,0x7F,0x01,0x01,
- 0x00,0x3F,0x40,0x40,0x40,0x3F,
- 0x00,0x1F,0x20,0x40,0x20,0x1F,
- 0x00,0x3F,0x40,0x38,0x40,0x3F,
- 0x00,0x63,0x14,0x08,0x14,0x63,
- 0x00,0x07,0x08,0x70,0x08,0x07,
- 0x00,0x61,0x51,0x49,0x45,0x43,
- 0x00,0x00,0x7F,0x41,0x41,0x00,
- 0x00,0x55,0x2A,0x55,0x2A,0x55,
- 0x00,0x00,0x41,0x41,0x7F,0x00,
- 0x00,0x04,0x02,0x01,0x02,0x04,
- 0x00,0x40,0x40,0x40,0x40,0x40,
- 0x00,0x00,0x01,0x02,0x04,0x00,
- 0x00,0x20,0x54,0x54,0x54,0x78,
- 0x00,0x7F,0x48,0x44,0x44,0x38,
- 0x00,0x38,0x44,0x44,0x44,0x20,
- 0x00,0x38,0x44,0x44,0x48,0x7F,
- 0x00,0x38,0x54,0x54,0x54,0x18,
- 0x00,0x08,0x7E,0x09,0x01,0x02,
- 0x00,0x18,0xA4,0xA4,0xA4,0x7C,
- 0x00,0x7F,0x08,0x04,0x04,0x78,
- 0x00,0x00,0x44,0x7D,0x40,0x00,
- 0x00,0x40,0x80,0x84,0x7D,0x00,
- 0x00,0x7F,0x10,0x28,0x44,0x00,
- 0x00,0x00,0x41,0x7F,0x40,0x00,
- 0x00,0x7C,0x04,0x18,0x04,0x78,
- 0x00,0x7C,0x08,0x04,0x04,0x78,
- 0x00,0x38,0x44,0x44,0x44,0x38,
- 0x00,0xFC,0x24,0x24,0x24,0x18,
- 0x00,0x18,0x24,0x24,0x18,0xFC,
- 0x00,0x7C,0x08,0x04,0x04,0x08,
- 0x00,0x48,0x54,0x54,0x54,0x20,
- 0x00,0x04,0x3F,0x44,0x40,0x20,
- 0x00,0x3C,0x40,0x40,0x20,0x7C,
- 0x00,0x1C,0x20,0x40,0x20,0x1C,
- 0x00,0x3C,0x40,0x30,0x40,0x3C,
- 0x00,0x44,0x28,0x10,0x28,0x44,
- 0x00,0x1C,0xA0,0xA0,0xA0,0x7C,
- 0x00,0x44,0x64,0x54,0x4C,0x44,
- 0x14,0x14,0x14,0x14,0x14,0x14,
- };
-
- /* ==================== 8x16 ASCII 字库(只保留空格和冒号) ==================== */
- u8 code ASC16[][16] = {
- {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
- {0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x00,0x00,0x00},
- };
-
- /* ==================== 汉字字库(只保留 Mn 里用到的字) ==================== */
- #define TotalHZ16 29
-
- u8 code HZ16M[TotalHZ16][2] = {
- "文","件","测","试","分","析","系","统","设","置",
- "打","印","输","出","调","零","校","准",
- "维","护","单","片","机","O","K","查","询","管","理"
- };
-
- u8 code HZ16[TotalHZ16][32] = {
- {0x08,0x08,0x08,0x08,0x78,0x88,0x09,0x0E,0x08,0x88,0x78,0x08,0x08,0x08,0x08,0x00,
- 0x40,0x40,0x40,0x20,0x20,0x11,0x0A,0x04,0x0A,0x11,0x10,0x20,0x60,0x20,0x20,0x00},
- {0x40,0x20,0xF8,0x0F,0x82,0x60,0x1E,0x14,0x10,0xFF,0x10,0x10,0x10,0x10,0x00,0x00,
- 0x00,0x00,0xFF,0x00,0x01,0x01,0x01,0x01,0x01,0xFF,0x01,0x01,0x01,0x01,0x01,0x00},
- {0x08,0x31,0x86,0x60,0x00,0xFE,0x02,0xF2,0x02,0xFE,0x00,0xF8,0x00,0x00,0xFF,0x00,
- 0x04,0xFC,0x03,0x00,0x80,0x47,0x30,0x0F,0x10,0x67,0x00,0x07,0x40,0x80,0x7F,0x00},
- {0x40,0x42,0xDC,0x08,0x00,0x90,0x90,0x90,0x90,0x90,0xFF,0x10,0x12,0x1C,0x10,0x00,
- 0x00,0x00,0x7F,0x20,0x10,0x20,0x20,0x1F,0x10,0x10,0x01,0x06,0x18,0x20,0x78,0x00},
- {0x80,0x40,0x20,0x98,0x87,0x82,0x80,0x80,0x83,0x84,0x98,0x30,0x60,0xC0,0x40,0x00,
- 0x00,0x80,0x40,0x20,0x10,0x0F,0x00,0x00,0x20,0x40,0x3F,0x00,0x00,0x00,0x00,0x00},
- {0x08,0x88,0x68,0xFF,0x48,0x88,0x00,0xFC,0x24,0x24,0x22,0xE2,0x22,0x22,0x20,0x00,
- 0x02,0x01,0x00,0xFF,0x00,0x41,0x30,0x0F,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00},
- {0x00,0x00,0x02,0x22,0xB2,0xAA,0x66,0x62,0x22,0x11,0x4D,0x81,0x01,0x01,0x00,0x00,
- 0x00,0x40,0x21,0x13,0x09,0x05,0x41,0x81,0x7F,0x01,0x05,0x09,0x13,0x62,0x00,0x00},
- {0x20,0x30,0x2C,0xA3,0x60,0x10,0x84,0xC4,0xA4,0x9D,0x86,0x84,0xA4,0xC4,0x84,0x00,
- 0x20,0x22,0x23,0x12,0x12,0x92,0x40,0x30,0x0F,0x00,0x00,0x3F,0x40,0x41,0x70,0x00},
- {0x40,0x41,0xCE,0x04,0x00,0x80,0x40,0xBE,0x82,0x82,0x82,0xBE,0xC0,0x40,0x40,0x00,
- 0x00,0x00,0x7F,0x20,0x90,0x80,0x40,0x43,0x2C,0x10,0x10,0x2C,0x43,0xC0,0x40,0x00},
- {0x00,0x20,0x2F,0xA9,0xA9,0xAF,0xE9,0xB9,0xA9,0xAF,0xA9,0xA9,0x2F,0x20,0x00,0x00,
- 0x80,0x80,0x80,0xFF,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xFF,0x80,0x80,0x80,0x00},
- {0x10,0x10,0x10,0xFF,0x90,0x50,0x14,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0x04,0x00,
- 0x02,0x42,0x81,0x7F,0x00,0x00,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00},
- {0x00,0xFC,0x44,0x44,0x42,0x42,0x42,0x00,0xFE,0x02,0x02,0x02,0x02,0xFE,0x00,0x00,
- 0x08,0x1F,0x08,0x04,0x04,0x02,0x00,0x00,0xFF,0x00,0x00,0x04,0x08,0x07,0x00,0x00},
- {0x44,0xF4,0x4F,0xE4,0x44,0x64,0x90,0x98,0x94,0x93,0x14,0x98,0x08,0xD0,0x10,0x00,
- 0x04,0x04,0x04,0xFF,0x02,0x02,0xFF,0x4A,0x8A,0x7F,0x00,0x3F,0x80,0xFF,0x00,0x00},
- {0x00,0x00,0xFC,0x40,0x40,0x40,0x40,0xFF,0x40,0x40,0x40,0x40,0x40,0xFC,0x00,0x00,
- 0x00,0x00,0x7E,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x7E,0x00,0x00},
- {0x20,0x21,0xEE,0x04,0x00,0x00,0xFF,0x29,0xA9,0xBF,0xA9,0xA9,0x01,0xFF,0x00,0x00,
- 0x00,0x00,0x1F,0x88,0x44,0x30,0x0F,0x00,0x0F,0x04,0x04,0x4F,0x80,0x7F,0x00,0x00},
- {0x00,0x0C,0x04,0x55,0x55,0x55,0x85,0x7F,0x85,0x55,0x55,0x55,0x05,0x0C,0x04,0x00,
- 0x04,0x04,0x04,0x0A,0x0A,0x09,0x2A,0xCC,0x28,0x19,0x09,0x02,0x06,0x02,0x02,0x00},
- {0x08,0x88,0x68,0xFF,0x28,0x48,0x00,0x88,0x68,0x09,0x0E,0x08,0xA8,0x48,0x88,0x00,
- 0x02,0x01,0x00,0xFF,0x00,0x40,0x42,0x21,0x26,0x18,0x18,0x26,0x61,0xC0,0x40,0x00},
- {0x00,0x02,0x1C,0xC8,0x20,0x10,0xFF,0x4A,0x48,0x49,0xFE,0x48,0x68,0x4C,0x08,0x00,
- 0x02,0x02,0x7E,0x01,0x00,0x00,0x7F,0x22,0x22,0x22,0x3F,0x22,0x23,0x32,0x20,0x00},
- {0x20,0x38,0xA7,0x62,0x10,0x20,0x18,0xFF,0x4A,0x48,0x4A,0xFC,0x48,0x48,0x48,0x00,
- 0x22,0x23,0x22,0x12,0x12,0x00,0x00,0xFF,0x22,0x22,0x22,0x3F,0x22,0x22,0x22,0x00},
- {0x00,0x10,0x10,0xFF,0x90,0x50,0x10,0x00,0xF8,0x89,0x8A,0x8E,0x88,0x88,0xF8,0x00,
- 0x02,0x42,0x81,0x7F,0x80,0x40,0x20,0x18,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
- {0x00,0x00,0xF8,0x28,0x29,0x2E,0x2A,0xF8,0x28,0x2C,0x2B,0x2A,0xF8,0x00,0x00,0x00,
- 0x08,0x08,0x0B,0x09,0x09,0x09,0x09,0xFF,0x09,0x09,0x09,0x09,0x0B,0x08,0x08,0x00},
- {0x00,0x00,0x00,0xFE,0x10,0x10,0x10,0x10,0x10,0x1F,0x10,0x10,0x10,0x18,0x10,0x00,
- 0x80,0x40,0x30,0x0F,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xFF,0x00,0x00,0x00,0x00},
- {0x08,0x08,0xC8,0xFF,0x48,0x88,0x08,0x00,0xFE,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,
- 0x04,0x03,0x00,0xFF,0x00,0x41,0x30,0x0C,0x03,0x00,0x00,0x00,0x3F,0x40,0x78,0x00},
- {0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
- {0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
- {0x80,0x88,0x48,0xC8,0xA8,0x98,0x88,0xFF,0x88,0x98,0xA8,0xA8,0x48,0xC8,0x48,0x00,
- 0x00,0x40,0x40,0x5F,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x5F,0x40,0x40,0x40,0x00},
- {0x40,0x42,0xCC,0x04,0x00,0x10,0xE8,0x27,0x24,0x24,0xE4,0x04,0x04,0xFC,0x00,0x00,
- 0x00,0x00,0x7F,0x20,0x10,0x00,0x1F,0x09,0x09,0x09,0x1F,0x40,0x80,0x7F,0x00,0x00},
- {0x08,0x64,0x23,0xA6,0xAA,0xA2,0xAA,0xB4,0xA3,0xA2,0xA6,0x2A,0x22,0x62,0x20,0x00,
- 0x00,0x00,0x00,0xFF,0x4A,0x4A,0x4A,0x4A,0x4A,0x4A,0x4B,0xF8,0x00,0x00,0x00,0x00},
- {0x44,0x44,0xFC,0x44,0x44,0x00,0xFE,0x92,0x92,0xFE,0x92,0x92,0x92,0xFE,0x00,0x00,
- 0x10,0x10,0x0F,0x08,0x48,0x40,0x45,0x44,0x44,0x7F,0x44,0x44,0x44,0x45,0x40,0x00},
- };
-
- /* ==================== 菜单数据(4 项) ==================== */
- u8 Mn[MENU_NUM][9] = {
- "文件管理", "测试分析", "系统设置", "打印输出"
- };
-
- /* ==================== 唯一的 32x32 实心方块图标 ==================== */
- u8 code Icon_Solid[128] = {
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
- };
-
- u8 code * code MenuIcons[MENU_NUM] = {
- Icon_Solid, Icon_Solid, Icon_Solid, Icon_Solid
- };
-
- /* ==================== 硬件 I2C ==================== */
- void I2C_Init(void)
- {
- I2CCFG = 0xC1;
- I2CMSST = 0x00;
- }
-
- void I2C_Wait(void)
- {
- while(!(I2CMSST & 0x40));
- I2CMSST &= ~0x40;
- }
-
- void I2C_WriteByte(u8 dat, u8 cmd)
- {
- I2CMSCR = 0x01; I2C_Wait();
- I2CTXD = 0x78; I2CMSCR = 0x02; I2C_Wait();
- I2CMSCR = 0x03; I2C_Wait();
- I2CTXD = cmd ? 0x40 : 0x00; I2CMSCR = 0x02; I2C_Wait();
- I2CMSCR = 0x03; I2C_Wait();
- I2CTXD = dat; I2CMSCR = 0x02; I2C_Wait();
- I2CMSCR = 0x03; I2C_Wait();
- I2CMSCR = 0x06; I2C_Wait();
- }
-
- void OLED_WR_CMD(u8 cmd)
- {
- EA = 0;
- I2C_WriteByte(cmd, 0);
- EA = 1;
- }
-
- void OLED_WR_DAT(u8 dat)
- {
- EA = 0;
- I2C_WriteByte(dat, 1);
- EA = 1;
- }
-
- /* ==================== OLED 初始化 ==================== */
- void OLED_Init(void)
- {
- I2C_Init();
- OLED_WR_CMD(0xAE);
- OLED_WR_CMD(0x00);
- OLED_WR_CMD(0x10);
- OLED_WR_CMD(0x40);
- OLED_WR_CMD(0x81);
- OLED_WR_CMD(0xCF);
- OLED_WR_CMD(0xA1);
- OLED_WR_CMD(0xC8);
- OLED_WR_CMD(0xA6);
- OLED_WR_CMD(0xA8);
- OLED_WR_CMD(0x3F);
- OLED_WR_CMD(0xD3);
- OLED_WR_CMD(0x00);
- OLED_WR_CMD(0xD5);
- OLED_WR_CMD(0x80);
- OLED_WR_CMD(0xD9);
- OLED_WR_CMD(0xF1);
- OLED_WR_CMD(0xDA);
- OLED_WR_CMD(0x12);
- OLED_WR_CMD(0xDB);
- OLED_WR_CMD(0x40);
- OLED_WR_CMD(0x20);
- OLED_WR_CMD(0x00);
- OLED_WR_CMD(0x8D);
- OLED_WR_CMD(0x14);
- OLED_WR_CMD(0xA4);
- OLED_WR_CMD(0xA6);
- OLED_WR_CMD(0xAF);
- }
-
- /* ==================== 显存操作 ==================== */
- void OLED_ShowTop(void)
- {
- u8 i, n;
- for(i = 0; i < 4; i++)
- {
- OLED_WR_CMD((u8)(0xB0 + i));
- OLED_WR_CMD(0x00);
- OLED_WR_CMD(0x10);
- for(n = 0; n < 128; n++)
- OLED_WR_DAT(ShowBuf[i][n]);
- }
- }
-
- void OLED_Show(u8 page)
- {
- u8 i, n;
- for(i = 0; i < 8; i++)
- {
- OLED_WR_CMD((u8)(0xB0 + i));
- OLED_WR_CMD(0x00);
- OLED_WR_CMD(0x10);
- for(n = 0; n < 128; n++)
- OLED_WR_DAT(ShowBuf[i][128 * page + n]);
- }
- }
-
- void OLED_CLS(u8 page)
- {
- u8 i;
- for(i = 0; i < 8; i++)
- memset(&ShowBuf[i][128 * page], 0, 128);
- OLED_Show(page);
- }
-
- void OLED_BMP(u8 X, u8 Y, u8 W, u8 H, u8 code *BMP, u8 page, u8 mode)
- {
- u16 num = 0;
- u8 i, l;
- if(page == 0)
- for(i = 0; i < H; i++)
- for(l = 0; l < W; l++)
- ShowBuf[Y + i][X + l] = BMP[num++];
- else
- for(i = 0; i < H; i++)
- for(l = 0; l < W; l++)
- ShowBuf[Y + i][X + l + 128] = BMP[num++];
- if(mode) OLED_ShowTop();
- }
-
- /* ==================== 字符显示 ==================== */
- void OLED_A16(u8 X, u8 Y, char Ch, u8 page)
- {
- u8 i, j;
- for(j = 0; j < 2; j++)
- {
- for(i = 0; i < 8; i++)
- {
- u8 dat;
- if(Ch == ' ') dat = 0;
- else if(Ch == ':') dat = ASC16[1][i + j * 8];
- else dat = 0;
- if(page == 0) ShowBuf[Y + j][X + i] = dat;
- else ShowBuf[Y + j][X + i + 128] = dat;
- }
- }
- }
-
- void OLED_HZ16(u8 X, u8 Y, u8 no, u8 page)
- {
- u8 i, j;
- if(no >= TotalHZ16) return;
- for(j = 0; j < 2; j++)
- {
- for(i = 0; i < 16; i++)
- {
- if(page == 0) ShowBuf[Y + j][X + i] = HZ16[no][i + j * 16];
- else ShowBuf[Y + j][X + i + 128] = HZ16[no][i + j * 16];
- }
- }
- }
-
- void OLED_String(u8 X, u8 Y, u8 *s, u8 page, u8 mode)
- {
- u8 hz[3];
- u16 m;
- while(*s != 0)
- {
- if(*s < 0x80)
- {
- OLED_A16(X, Y, *s, page);
- X += 8; s++;
- }
- else
- {
- hz[0] = *s; hz[1] = *(s + 1); hz[2] = 0;
- for(m = 0; m < TotalHZ16; m++)
- {
- if(HZ16M[m][0] == hz[0] && HZ16M[m][1] == hz[1]) break;
- }
- if(m < TotalHZ16) OLED_HZ16(X, Y, (u8)m, page);
- X += 16; s += 2;
- }
- if(X > 127) { X = 0; Y += 2; }
- }
- if(mode) OLED_Show(page);
- }
-
- void OLED_MoveL(u8 code *pic)
- {
- u8 i, l;
- OLED_BMP(4, 0, 32, 4, pic, 1, 0); /* 待移入图标画到第二页 x=4 */
- for(l = 0; l < 44; l++) /* 一次移 1 列 */
- {
- for(i = 0; i < 172; i++)
- {
- ShowBuf[0][i] = ShowBuf[0][i + 1];
- ShowBuf[1][i] = ShowBuf[1][i + 1];
- ShowBuf[2][i] = ShowBuf[2][i + 1];
- ShowBuf[3][i] = ShowBuf[3][i + 1];
- }
- OLED_ShowTop();
- }
- }
-
- void OLED_MoveR(u8 code *pic)
- {
- u8 i, l;
- OLED_BMP(4, 0, 32, 4, pic, 1, 0); /* 待移入图标画到第二页 x=4 */
- for(l = 0; l < 44; l++) /* 一次移 1 列 */
- {
- for(i = 128; i > 0; i--)
- {
- ShowBuf[0][i] = ShowBuf[0][i - 1];
- ShowBuf[1][i] = ShowBuf[1][i - 1];
- ShowBuf[2][i] = ShowBuf[2][i - 1];
- ShowBuf[3][i] = ShowBuf[3][i - 1];
- }
- ShowBuf[0][0] = ShowBuf[0][171 - l];
- ShowBuf[1][0] = ShowBuf[1][171 - l];
- ShowBuf[2][0] = ShowBuf[2][171 - l];
- ShowBuf[3][0] = ShowBuf[3][171 - l];
- OLED_ShowTop();
- }
- }
-
- /* ==================== 延时 ==================== */
- void delay_ms(u16 ms)
- {
- u16 i;
- do {
- i = MAIN_Fosc / 6000;
- while(--i);
- } while(--ms);
- }
-
- /* ==================== 主函数 ==================== */
- void main(void)
- {
- u8 m = 0;
- u8 move;
-
- WTST = 0;
- EAXFR = 1;
- CKCON = 0;
-
- P0M1 = 0x00; P0M0 = 0x00;
- P1M1 = 0x00; P1M0 = 0x00;
- P2M1 = 0x00; P2M0 = 0x00;
- P3M1 = 0x00; P3M0 = 0x00;
- P4M1 = 0x00; P4M0 = 0x00;
- P5M1 = 0x00; P5M0 = 0x00;
-
- OLED_Init();
- OLED_CLS(1);
- OLED_CLS(0);
-
- /* 初始画面:三个图标画在 x=4/48/92 */
- OLED_BMP( 4, 0, 32, 4, MenuIcons[0], 0, 0);
- OLED_BMP(48, 0, 32, 4, MenuIcons[1], 0, 0);
- OLED_BMP(92, 0, 32, 4, MenuIcons[2], 0, 0);
- OLED_String(32, 6, Mn[0], 0, 1);
-
- while(1)
- {
- move = 0;
-
- /* ---------- 左键:按下滑一次,长按持续滑 ---------- */
- if(KEY_LEFT == 0)
- {
- delay_ms(10);
- if(KEY_LEFT == 0)
- {
- /* 第一次滑动 */
- m = (m == 0) ? (MENU_NUM - 1) : (m - 1);
- OLED_MoveR(MenuIcons[(m + MENU_NUM - 1) % MENU_NUM]);
- OLED_String(32, 6, Mn[m], 0, 1);
-
- /* 长按:只要还按着就继续滑 */
- while(KEY_LEFT == 0)
- {
- m = (m == 0) ? (MENU_NUM - 1) : (m - 1);
- OLED_MoveR(MenuIcons[(m + MENU_NUM - 1) % MENU_NUM]);
- OLED_String(32, 6, Mn[m], 0, 1);
- }
- }
- }
-
- /* ---------- 右键:按下滑一次,长按持续滑 ---------- */
- if(KEY_RIGHT == 0)
- {
- delay_ms(10);
- if(KEY_RIGHT == 0)
- {
- /* 第一次滑动 */
- m = (m == MENU_NUM - 1) ? 0 : (m + 1);
- OLED_MoveL(MenuIcons[(m + 1) % MENU_NUM]);
- OLED_String(32, 6, Mn[m], 0, 1);
-
- /* 长按:只要还按着就继续滑 */
- while(KEY_RIGHT == 0)
- {
- m = (m == MENU_NUM - 1) ? 0 : (m + 1);
- OLED_MoveL(MenuIcons[(m + 1) % MENU_NUM]);
- OLED_String(32, 6, Mn[m], 0, 1);
- }
- }
- }
-
- /* ---------- 退出键:清屏 ---------- */
- if(KEY_EXIT == 0)
- {
- delay_ms(10);
- if(KEY_EXIT == 0)
- {
- while(KEY_EXIT == 0);
- OLED_CLS(0);
- }
- }
- }
- }
复制代码 为什么第一次左移,右边两个图标的间距变小了,
|