- 本文会介绍如何使用NB-IOT开发板一步步实现[计数器系统开发功能(基于STM32L151C8T6芯片)
- 一.看题
- 仔细审题很重要,找出题目最后要我们实现的效果
-
二.理清思路
-
简单来说,最后要实现的功能就是按下KEY2、KEY3能够加减数值,并显示在结果Y中,同时灯亮起一秒后熄灭。
-
三.解题步骤
-
首先拿到物联网竞赛工程,对工程进行编译,养成良好的习惯!!
-
显示0错误0警告,说明工程没问题
-
根据题目可知,我们要用到Flash,第一步可以先引入头文件
#include "flash.h"
#include "stm32l1xx_hal_flash_ex.h"
#include "stm32l1xx_hal_flash.h"
#include <stdio.h>
- 引入这几个头文件即可,我一般喜欢放在一起,就头文件跟头文件放在一起,这样方便找
#include <string.h>
#include "board.h"
#include "hal_key.h"
#include "tim-board.h"
#include "timer_handles.h"
#include "flash.h"
#include "stm32l1xx_hal_flash_ex.h"
#include "stm32l1xx_hal_flash.h"
#include <stdio.h>
- 接下来进行按键、LED灯的宏定义,便于后续编程,加快速度
#define LED1_ON() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET)
#define LED1_OFF() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET)
#define LED2_ON() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET)
#define LED2_OFF() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET)
#define KEY2 HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13)
#define KEY3 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)
#define KEY4 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_5)
- 按键和灯所对应的引脚为
LED1——>PA3 LED2——>PB8
KEY2——>PC13 KEY3——>PB1 KEY4——>PB5
- 接下来通过取自模软件得到将中文字转成十六进制数
char ji[]={0x40,0x40,0x42,0xCC,0x00,0x40,0x40,0x40,0x40,0xFF,0x40,0x40,0x40,0x40,0x40,0x00,
0x00,0x00,0x00,0x7F,0x20,0x10,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00};
char shu[]={0x90,0x52,0x34,0x10,0xFF,0x10,0x34,0x52,0x80,0x70,0x8F,0x08,0x08,0xF8,0x08,0x00,
0x82,0x9A,0x56,0x63,0x22,0x52,0x8E,0x00,0x80,0x40,0x33,0x0C,0x33,0x40,0x80,0x00};
char qi[]={0x80,0x80,0x9E,0x92,0x92,0x92,0x9E,0xE0,0x80,0x9E,0xB2,0xD2,0x92,0x9E,0x80,0x00,
0x08,0x08,0xF4,0x94,0x92,0x92,0xF1,0x00,0x01,0xF2,0x92,0x94,0x94,0xF8,0x08,0x00};
char zhi[]={0x00,0x80,0x60,0xF8,0x07,0x04,0xE4,0xA4,0xA4,0xBF,0xA4,0xA4,0xE4,0x04,0x00,0x00,
0x01,0x00,0x00,0xFF,0x40,0x40,0x7F,0x4A,0x4A,0x4A,0x4A,0x4A,0x7F,0x40,0x40,0x00};
char jie[]={0x20,0x30,0xAC,0x63,0x20,0x18,0x08,0x48,0x48,0x48,0x7F,0x48,0x48,0x48,0x08,0x00,
0x22,0x67,0x22,0x12,0x12,0x12,0x00,0xFE,0x42,0x42,0x42,0x42,0x42,0xFE,0x00,0x00,};
char guo[]={0x00,0x00,0x00,0xFE,0x92,0x92,0x92,0xFE,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,0x00,
0x44,0x44,0x24,0x25,0x14,0x0C,0x04,0xFF,0x04,0x0C,0x14,0x25,0x24,0x44,0x44,0x00};
- 开始写函数
- 这个函数的主要功能是在液晶屏上显示中文字和程序一启动读到的Flash的值显示出来
void display_dat()
{
OLED_ShowCHineseArray(32,0,ji);
OLED_ShowCHineseArray(48,0,shu);
OLED_ShowCHineseArray(64,0,qi);
OLED_ShowCHineseArray(16,3,shu);
OLED_ShowCHineseArray(32,3,zhi);
OLED_ShowString(48,3,(uint8_t *)":");
OLED_ShowCHineseArray(16,6,jie);
OLED_ShowCHineseArray(32,6,guo);
OLED_ShowString(48,6,(uint8_t *)":");
STMFLASH_Read(0x0800f000,&str2[0],1);
/*str1[3]=(str2[0]>>24) &0xff;
str1[2]=(str2[0]>>16) &0xff;*/
str1[1]=(str2[0]>>8) &0xff;
str1[0]=(str2[0]) &0xff;
//a=(str1[0]-'0')*1000+(str1[1]-'0')*100+(str1[2]-'0')*10+(str1[3]-'0');
a = (int)str1[0]*256+(int)str1[1];
sprintf(str3,"%5d",a);
OLED_ShowString(64,3,(uint8_t *)str3);
LED2_OFF();
}
- 这个函数的主要功能就是实现对N的值的加和减,并能保存到Flash中
void KEY_Control()
{
if(KEY2==0)
{
HAL_Delay(1);
if(KEY2==0)
{
while(KEY2==0);
a++;
sprintf(str3,"%5d",a);
OLED_ShowString(64,6,(uint8_t *)str3);
}
}
if(KEY3==0)
{
HAL_Delay(1);
if(KEY3==0)
{
while(KEY3==0);
a--;
sprintf(str3,"%5d",a);
OLED_ShowString(64,6,(uint8_t *)str3);
}
}
if(KEY4==0)
{
HAL_Delay(1);
if(KEY4==0)
{
while(KEY4==0);
// int a3;
//int a4;
/*a1=b/1000;
a2=(b-(a1*1000))/100;
a3=(b-(a1*1000)-(a2*100))/10;
a4=b-(a1*1000)-(a2*100)-(a3*10);
str2[0]=((uint8_t)( a4+'0') << 24) + ((uint8_t)(a3+'0') << 16) +((uint8_t) (a2+'0') << 8 )+ (uint8_t)(a1+'0');*/
//a3=a-a1-a2;
//a4=a-a1-a2-a3-a4;
a1=a/256;
a2=a-a1*256;
str2[0]=((uint8_t)(a1)) | ((uint8_t)(a2) << 8) ;
STMFLASH_Write(0x0800f000,str2,1);
STMFLASH_Write(0x0800f000,str2,1);
STMFLASH_Write(0x0800f000,str2,1);
STMFLASH_Write(0x0800f000,str2,1);
LED2_ON();
HAL_Delay(1000);
LED2_OFF();
}
}
}
- 最后就是在main函数里调用即可
int main( void )
{
Init();
OLED_Init();
display_dat();
while( 1 )
{
KEY_Control();
}
}
- 四.功能展示
物联网竞赛----NB-IOT计数器系统开发
- 五.源代码分享链接
- 计数器源代码附取自模软件