鸿蒙硬件HI3861-OLED扫雷版本

使用HI3861实现在OLED1602上面实现扫雷

效果请看:https://www.bilibili.com/video/BV1U54y1r78j/

1.OLED&按键

首先第一步是需要移植I2C显示屏代码

移植请看:https://bbs.elecfans.com/jishu_1999539_1_1.html

按键使用到的是OLED上面的两个按键,一个控制左一个控制右,HI3861上的按键时选中

2.扫雷代码

在OLED初始化启动之后调用mineclear_Start函数

static_library("mineclear") {sources = ["mineclear.c"]include_dirs = ["//domains/iot/link/mineclear","//kernel/liteos_m/components/cmsis/2.0","//utils/native/lite/include","//kernel/liteos_m/components/cmsis/2.0","//base/iot_hardware/interfaces/kits/wifiiot_lite","//foundation/communication/interfaces/kits/wifi_lite/wifiservice","//domains/iot/link/ssd1306",]
}

mineclear.h

#ifndef MINECLEAR_H
#define MINECLEAR_H#define MINECLEAR_WIDTH 8
#define MINECLEAR_HEIGHT 16
#define MINECLEAR_MAX 128
#define MINE_MAX 10
#define ADC_LENGTH  64
#define VLT_MIN 100void mineclear_Start(void);
void mine_init(void);
void mineMake(void);#endif

mineclear.c

#include "mineclear.h"#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "ohos_init.h"
#include "ssd1306.h"
#include <stddef.h>
#include "cmsis_os2.h"
#include <time.h>#include <hi_io.h>
#include <hi_gpio.h>
#include <hi_stdlib.h>
#include "hi_adc.h"#include "wifiiot_gpio.h"
#include "wifiiot_gpio_ex.h"
#include <hi_stdlib.h>const uint32_t W = 8, H = 8;uint8_t fonts[][8] = {{0x00,0x00,0x3C,0x3C,0x3C,0x3C,0x00,0x00},  // 默认状态{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},  // 没有雷{0x00,0x42,0x24,0x18,0x18,0x24,0x42,0x00},  // 有雷{0x55,0x80,0x01,0x80,0x01,0x80,0x01,0xAA},  // 选中
};  uint32_t mine_data2[MINECLEAR_MAX];
uint32_t mineClear_data2[MINECLEAR_MAX];hi_u16 key_adc_buf[ADC_LENGTH] = { 0 };
int key_flg;
uint32_t key_status = 0;
static uint32_t play_index = 0;hi_void convert_to_voltage2(hi_u32 data_len){hi_u32 i;float vlt_max = 0;float vlt_min = VLT_MIN;float vlt_val = 0;hi_u16 vlt;for (i = 0; i < data_len; i++) {vlt = key_adc_buf[i];float voltage = (float)vlt * 1.8 * 4 / 4096.0;  /* vlt * 1.8 * 4 / 4096.0: Convert code into voltage */vlt_max = (voltage > vlt_max) ? voltage : vlt_max;vlt_min = (voltage < vlt_min) ? voltage : vlt_min;}vlt_val = (vlt_min + vlt_max)/2.0;if((vlt_val > 0.4) && (vlt_val < 0.6)){key_status = 1;//printf("[key]K1\r\n");}if((vlt_val > 0.8) && (vlt_val < 1.1)){key_status = 2;//printf("[key]K2\r\n",vlt_val);}if((vlt_val > 0.01) && (vlt_val < 0.3)){key_status = 3;//printf("[key]K3\r\n",vlt_val);}
}void starttest2(void){hi_u32 ret, i;hi_u16 data;  /* 10 */memset_s(key_adc_buf, sizeof(key_adc_buf), 0x0, sizeof(key_adc_buf));for (i = 0; i < ADC_LENGTH; i++) {ret = hi_adc_read((hi_adc_channel_index)HI_ADC_CHANNEL_2, &data, HI_ADC_EQU_MODEL_1, HI_ADC_CUR_BAIS_DEFAULT, 0);if (ret != HI_ERR_SUCCESS) {printf("ADC Read Fail\n");return;}key_adc_buf[i] = data;}convert_to_voltage2(ADC_LENGTH);
}void ssd1306_Draw(uint32_t x, uint32_t y,int type){ssd1306_DrawRegion(x, y, W, H, fonts[type], sizeof(fonts[type]), W);
}void mineClear_Refresh2(uint32_t d[]){uint32_t i = 0, j = 0, h = 0;ssd1306_Fill(Black);for(i=0;i<MINECLEAR_WIDTH;i++){for(j=0;j<MINECLEAR_HEIGHT;j++){uint32_t md_data = d[h];if(md_data == 0){ssd1306_Draw((j*W),(i*H),0);}else if(md_data == 1){ssd1306_Draw((j*W),(i*H),2);}else if(md_data == 102){ssd1306_Draw((j*W),(i*H),3);}else if(md_data == 2){ssd1306_Draw((j*W),(i*H),1);}else{}h++;}}ssd1306_UpdateScreen();
}void mine_init(void){uint32_t i;ssd1306_Fill(Black);for(i=0;i<MINECLEAR_MAX;i++){mineClear_data2[i] = 0;}mineClear_Refresh2(mineClear_data2);
}/***  制作炸弹 */
void mineMake(void){int count = MINE_MAX-1;int mine_rand = 0;while (true){if(count<0) break;mine_rand = rand() % MINECLEAR_MAX;if (mine_data2[mine_rand] == 0){mine_data2[mine_rand] = 1;count--;}}//mineClear_Refresh2(mine_data2);
}/*** 移动光标*/
void mouse_move(void){int index = play_index - 1;printf("[key]2--%d\r\n",index);if(index == 0){if(mineClear_data2[1] == 102 && mineClear_data2[1] != 0){mineClear_data2[1] = 0;}if(mineClear_data2[MINECLEAR_MAX-1] == 102 && mineClear_data2[MINECLEAR_MAX-1] != 0){mineClear_data2[MINECLEAR_MAX-1] = 0;}}else if(index == (MINECLEAR_MAX-1)){printf("[key]laster\r\n");if(mineClear_data2[0] == 102 && mineClear_data2[0] != 0){mineClear_data2[0] = 0;  }if(mineClear_data2[index-1] == 102 && mineClear_data2[index-1] != 0){mineClear_data2[index-1] = 0;}}else{if(mineClear_data2[index-1] == 102 && mineClear_data2[index-1] != 0){mineClear_data2[index-1] = 0;}if(mineClear_data2[index+1] == 102 && mineClear_data2[index+1] != 0){mineClear_data2[index+1] = 0;}}if(mineClear_data2[index] != 2){mineClear_data2[index] = 102;}mineClear_Refresh2(mineClear_data2);ssd1306_UpdateScreen();
}void mine_find_num(void){mineClear_data2[play_index-1] = 2;ssd1306_UpdateScreen();// 获取周围8方块的雷}static void *MineClearTask(const char *arg){(void)arg;play_index = 1;while(1){starttest2();if(key_status == 1){    // 左移动if(play_index == 0){play_index = MINECLEAR_MAX;}  play_index--;  mouse_move();}if(key_status == 2){    // 右移动if(play_index > (MINECLEAR_MAX-1)){play_index = 0;}play_index++;  mouse_move();}if(key_status == 3){    // 选中if(mine_data2[play_index-1] == 1){  // 炸弹mineClear_data2[play_index-1] = 1;mineClear_Refresh2(mineClear_data2);osDelay(40);mineClear_Refresh2(mine_data2);break;}else{mine_find_num();}//printf("[11]%d\r\n",play_index);}key_status = 0;osDelay(10);}printf("GAME OVER\r\n");return NULL;
}void mineclear_Start(void){osThreadAttr_t attr;attr.name = "MineClearTask";attr.attr_bits = 0U;attr.cb_mem = NULL;attr.cb_size = 0U;attr.stack_mem = NULL;attr.stack_size = 10240;attr.priority = 34;mineMake();// osDelay(10);mine_init();osDelay(10);if (osThreadNew((osThreadFunc_t)MineClearTask, NULL, &attr) == NULL) {printf("[DoorDemo] Falied to create DoorTask!\n");}
}

鸿蒙硬件HI3861-OLED扫雷版本1相关推荐

  1. 鸿蒙硬件HI3861开发环境搭建-串口2测试

    鸿蒙硬件HI3861开发环境搭建-串口2测试 鸿蒙硬件HI3861开发环境搭建-串口2测试 - 哔哩哔哩 鸿蒙其他教程请看https://blog.csdn.net/qq_33259323/categ ...

  2. 鸿蒙硬件HI3861点灯

    鸿蒙硬件HI3861点灯 鸿蒙其他教程请看https://blog.csdn.net/qq_33259323/category_10520249.html 创建文件 BUILD.gn static_l ...

  3. 鸿蒙硬件HI3861开发环境搭建

    鸿蒙HI3861开发环境搭建 最新的环境搭建教程请看:https://blog.csdn.net/qq_33259323/article/details/117854579 鸿蒙其他教程请看https ...

  4. 鸿蒙硬件开发:Hi3861开发环境搭建及Windows下编译下载程序

    Windows开发环境准备 可参考官方文档Windows开发环境准备进行配置. 安装VS Code https://code.visualstudio.com/Download 安装Python ht ...

  5. 鸿蒙硬件HI3861-MQTT

    警告:MQTT移植不匹配,此文章作废,后续有鸿蒙高版本MQTT移植 鸿蒙硬件HI3861-MQTT 鸿蒙其他教程请看https://blog.csdn.net/qq_33259323/category ...

  6. 基于鸿蒙OS移植OLED驱动程序

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 人工智能编程入门博客 硬件连接 通过万用表测量,得到I2C总线的OLED屏的引脚连接情况如上图所示, ...

  7. 鸿蒙硬件HI3861-连接WIFI

    鸿蒙硬件HI3861-连接WIFI 鸿蒙其他教程请看https://blog.csdn.net/qq_33259323/category_10520249.html 目录是这样的 BUILD.gn s ...

  8. 鸿蒙OS Hi3861的芯片实际开发中遇到的问题

    鸿蒙OS Hi3861的芯片实际开发中遇到的问题 优点: 比较适合开发者快速开发,上面的硬件操作的函数封装很简单,非常适合初学者使用封装好的函数调用硬件管脚,比如I2c gpio spi sdio 都 ...

  9. 华为鸿蒙osbeta在哪看发布会,重磅消息!华为在发布鸿蒙OS2.0手机beta版本后,又发布搭载鸿蒙的新品!!...

    原标题:重磅消息!华为在发布鸿蒙OS2.0手机beta版本后,又发布搭载鸿蒙的新品!! 就在12月16号华为刚刚发布鸿蒙OS2.0beta系统手机版本后,就在今天华为又举行了一个新品发布会,他就 是华 ...

最新文章

  1. 权威发布 |《科学美国人》:2018全球十大新兴技术
  2. 精读《Function VS Class 组件》
  3. 【测试点2超时问题】1046 Shortest Distance (20 分)_21行代码AC
  4. 2018年SIAF 广州国际工业自动化技术及装备展览会下周隆重开幕
  5. 恭喜你!在25岁前看到了这篇最最靠谱的深度学习入门指南
  6. python 进阶知识点_高效率 Python 进阶:10 个关键知识点与特性
  7. python pdb调试快捷键,Python调试工具pdb使用详解
  8. 使用link 链接外部样式和网站logo,减少html文档Style部分的信息量
  9. 腾讯 2017 年投资项目榜单 TOP 10,与阿里死磕到底?
  10. matlab whos命令
  11. WIN7下IIS的安装与配置
  12. plc编程入门视频教程
  13. 2022危险化学品经营单位主要负责人考试模拟100题及模拟考试
  14. Blumind 思维图软件
  15. 阿里巴巴分布式调度引擎tbschedule实战二源码环境搭建
  16. 我花10个小时,写出了小白也能看懂的阿里数据中台分析
  17. 等比求和模版,下标从1开始
  18. 海关179接口终极解决方案
  19. CSDN日报20170312——《成功人士的七个习惯》
  20. Go Slice实现原理分析

热门文章

  1. chmod简介及其使用方法
  2. java三个数比大小_三个数的比较 不同的实现方法java
  3. 双稳态电路的两个稳定状态是什么_利用SR锁存器实现SPDT开关消抖电路
  4. 深入分析String类型(一)
  5. vue 自定义指令(directive)实例
  6. Hadoop集群部署权限总结
  7. 3.15 晚会—「饿了么」之殇
  8. [实战]Router configuration for TP ROOM
  9. php实战第二十五天
  10. z-index属性简介