本文以STM32F103R6为测试单片机 我们经常使用单片机完成一些工作,今天我写出的几个较为经典的例子希望能够帮助大家更好的认识单片机,更好的掌握STM32单片机的工作原理,为以后的运用带来方便! 以下例子是从易到难!
实例一:LCD屏幕显示倒计时
#include "stm32f10x.h"
#include "LQ12864.h"
#include <stdio.h>
void main_delay(u32 time)
{
int i,j;
for(i = 0; i < time; i++)
{
for(j = 0; j < 1000; j++)
{
j++;
j--;
}
}
}
int main(void)
{
int i;
char buf[100] = { 0 };//字符数组,可以保存字符串
LCD_Init();//LCD初始化
while(1)
{
for(i = 10; i >= 0; i--)
{
//将格式化出一个字符串,将字符串赋值给buf数组
sprintf(buf,"高手%d",i);//将字符串打印输出到buf数组中,相当于给buf数组赋值
//将buf中的字符串显示到屏幕中
LCD_Print(30,3,buf);//打印到屏幕上
main_delay(200);//显示一个会儿
LCD_CLS();//清屏
}
LCD_P14x16Str(30,3,"科技");
main_delay(200);//显示一个会儿
}
}
注意:
1、sprintf()函数可以格式化输出字符串,如数字10可格式化输出为字符串’10’,
sprintf(buf,“高手%d”,i);这里的打印输出并不是打印到屏幕,而是打印输出字符串到buf,这个字符串数组中。
2、调用sprintf()函数需要添加#include <stdio.h>
3、LCD的清屏函数LCD_CLS();
实例2: 用for循环嵌套实现如下#阵//一次允许打印’一个
* //i == 0 空格 3 4-1-i 星星 1 2*i+1
*** //i == 1 空格 2 4-1-i 星星 3
***** //i == 2 空格 1 4-1-i 星星 5
******* //i == 3 空格 0 4-1-i 星星 7
#include "stm32f10x.h"
#include "LQ12864.h"
void main_delay(u32 time)
{
int i,j;
for(i = 0; i < time; i++)
{
for(j = 0; j < 1000; j++)
{
j++;
j--;
}
}
}
int main(void)
{
int i ,j;
for(i = 0; i < 4; i++)//i = 0 1 2 3
{
//打印星星
for(j = 0; j < 2*i+1; j++)
{
LCD_P6x8Str((4-1-i)*6+j*6,i,"#");//(4-1-i)*6 往后移动一个空格
}
}
}
实例3: 完成一个菜单, 在液晶上显示
menu1 *
menu2
menu3
menu4
- 随着按键,走,
添加UP(button) DOWN(button) OK(button), 3个按钮
实现按下UP 菜单往上走,DWON菜单往下走…,最后一个再向下,回到第一个,第一个再向上回到最后一个。
#include "stm32f10x.h"
#include "LQ12864.h"
#include <stdio.h>
#define UP 1 //向上键
#define DOWN 2 //向下键
#define NONE 0 //没有按键
//延时
void main_delay(int time)
{
int i,j;
for(i = 0; i < time; i++)
{
for(j = 0; j < 1000; j++)
{
j++;
j--;
}
}
}
//按键初始化
void keyInit()
{
GPIO_InitTypeDef GPIO_InitStruct;//定义一个结构体变量
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//启动PA的时钟
//给结构体的成员变量赋值
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;//输入模式
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_7 ;//选中了3和 7
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;//工作频率
GPIO_Init(GPIOA,&GPIO_InitStruct);//PA0 对PA0进行初始化
}
//读取按键的值
int keyRead()
{
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3) == 0)//上
return UP;//1
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7) == 0)//下
return DOWN;//2
return NONE;//0 如果没有按键返回0
}
int main(void)
{
//字符指针数组,数组中每个元素都是字符指针,指向四个字符串
char * menu[4] = {"LED1","LED2","FAN","BUZZER"};
int i;
int flag = 0;//flag时刻代表当前星星所在的行数
int key;//用来保存读取到的按键的值
keyInit();//按键初始化
LCD_Init();//LCD初始化
while(1)
{
//在屏幕上显示四行菜单
for(i = 0; i < 4; i++)
LCD_P6x8Str(0,i,menu[i]);//menu[i]不要加" "号,menu[i]代表数组中的元素
//显示星星
LCD_P6x8Str(40,flag,"#");//40保证星星显示在菜单后面
//添加按键处理
key = keyRead();//读取按键的值
if(key == UP)//说明按了向上键
{
//在星星移动前,清除当前行的星星
LCD_P6x8Str(40,flag," ");//" "之间有空格
flag = flag == 0 ? 3 : flag-1;
}
else if(key == DOWN)//说明按了向下键
{
LCD_P6x8Str(40,flag," ");//" "之间有空格
flag = flag == 3 ? 0 : flag+1;
}
main_delay(200);//按键消抖
}
}
注意:用到sprintf()函数时需要添加头文件#include<stdio.h>,sprintf()可混合打印数字字符串