鸿蒙硬件HI3861-OLED扫雷版本1
鸿蒙硬件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相关推荐
- 鸿蒙硬件HI3861开发环境搭建-串口2测试
鸿蒙硬件HI3861开发环境搭建-串口2测试 鸿蒙硬件HI3861开发环境搭建-串口2测试 - 哔哩哔哩 鸿蒙其他教程请看https://blog.csdn.net/qq_33259323/categ ...
- 鸿蒙硬件HI3861点灯
鸿蒙硬件HI3861点灯 鸿蒙其他教程请看https://blog.csdn.net/qq_33259323/category_10520249.html 创建文件 BUILD.gn static_l ...
- 鸿蒙硬件HI3861开发环境搭建
鸿蒙HI3861开发环境搭建 最新的环境搭建教程请看:https://blog.csdn.net/qq_33259323/article/details/117854579 鸿蒙其他教程请看https ...
- 鸿蒙硬件开发:Hi3861开发环境搭建及Windows下编译下载程序
Windows开发环境准备 可参考官方文档Windows开发环境准备进行配置. 安装VS Code https://code.visualstudio.com/Download 安装Python ht ...
- 鸿蒙硬件HI3861-MQTT
警告:MQTT移植不匹配,此文章作废,后续有鸿蒙高版本MQTT移植 鸿蒙硬件HI3861-MQTT 鸿蒙其他教程请看https://blog.csdn.net/qq_33259323/category ...
- 基于鸿蒙OS移植OLED驱动程序
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 人工智能编程入门博客 硬件连接 通过万用表测量,得到I2C总线的OLED屏的引脚连接情况如上图所示, ...
- 鸿蒙硬件HI3861-连接WIFI
鸿蒙硬件HI3861-连接WIFI 鸿蒙其他教程请看https://blog.csdn.net/qq_33259323/category_10520249.html 目录是这样的 BUILD.gn s ...
- 鸿蒙OS Hi3861的芯片实际开发中遇到的问题
鸿蒙OS Hi3861的芯片实际开发中遇到的问题 优点: 比较适合开发者快速开发,上面的硬件操作的函数封装很简单,非常适合初学者使用封装好的函数调用硬件管脚,比如I2c gpio spi sdio 都 ...
- 华为鸿蒙osbeta在哪看发布会,重磅消息!华为在发布鸿蒙OS2.0手机beta版本后,又发布搭载鸿蒙的新品!!...
原标题:重磅消息!华为在发布鸿蒙OS2.0手机beta版本后,又发布搭载鸿蒙的新品!! 就在12月16号华为刚刚发布鸿蒙OS2.0beta系统手机版本后,就在今天华为又举行了一个新品发布会,他就 是华 ...
最新文章
- 权威发布 |《科学美国人》:2018全球十大新兴技术
- 精读《Function VS Class 组件》
- 【测试点2超时问题】1046 Shortest Distance (20 分)_21行代码AC
- 2018年SIAF 广州国际工业自动化技术及装备展览会下周隆重开幕
- 恭喜你!在25岁前看到了这篇最最靠谱的深度学习入门指南
- python 进阶知识点_高效率 Python 进阶:10 个关键知识点与特性
- python pdb调试快捷键,Python调试工具pdb使用详解
- 使用link 链接外部样式和网站logo,减少html文档Style部分的信息量
- 腾讯 2017 年投资项目榜单 TOP 10,与阿里死磕到底?
- matlab whos命令
- WIN7下IIS的安装与配置
- plc编程入门视频教程
- 2022危险化学品经营单位主要负责人考试模拟100题及模拟考试
- Blumind 思维图软件
- 阿里巴巴分布式调度引擎tbschedule实战二源码环境搭建
- 我花10个小时,写出了小白也能看懂的阿里数据中台分析
- 等比求和模版,下标从1开始
- 海关179接口终极解决方案
- CSDN日报20170312——《成功人士的七个习惯》
- Go Slice实现原理分析