0、添加lLibrary的相关依赖
1、打开液晶参考历程
2、重新定义液晶初始化函数
void lcdall_init(void);
void lcdall_init(void)
{
STM3210B_LCD_Init();
LCD_Clear(Blue);
LCD_SetBackColor(Blue);
LCD_SetTextColor(White);
LCD_Clear(Blue);
LCD_DisplayStringLine(Line4 ," Hello,world. ");
Delay_Ms(1000);
}
3、初始化 LED和按键(蓝桥杯嵌入式开发板LED灯位PC8-15,使用LED灯时应同时控制锁存PD2;按键为PA0、8和PB1、2)
(1)打开:第十一届蓝桥杯大赛个人赛(电子类)模拟题\嵌入式设计与开发\STM32固件库v3.5\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\GPIO\IOToggle复制以下主函数的初始化代码,进行更改,进行LED和按键初始化,注意按键模式不是GPIO_Mode_Out_PP而是
int main(void)
{
/*!< At this stage the microcontroller clock setting is already configured,
this is done through SystemInit() function which is called from startup
file (startup_stm32f10x_xx.s) before to branch to application main.
To reconfigure the default setting of SystemInit() function, refer to
system_stm32f10x.c file
*/
/* GPIOD Periph clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
/* Configure PD0 and PD2 in output pushpull mode */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
定义LED初始化 (将LED初始化为灭的状态)
void led_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //要放在函数最前面
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
/* Configure PD0 and PD2 in output pushpull mode */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_SetBits(GPIOC,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15) ;
GPIO_SetBits(GPIOD,GPIO_Pin_2);//
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
Delay_Ms(1000);
}
4、特别需要注意的是,系统时钟初始化、液晶初始化,LED初始化顺序
最好是一下顺序,不然会产生灯全亮,液晶初始化没字等情况,所以最好为一下顺序
SysTick_Config(SystemCoreClock/1000);
led_init();
lcdall_init();
5、按照LED灯的初始化情况,初始化按键,按键模式为GPIO_Mode_IPU,按键为PA0\8,PB1\2
void key_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //要放在函数最前面
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //注意 输入模式
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
6、定义流水灯控制函数
void led_control(uint16_t LED,uint16_t staues)
{
if(staues)
{
GPIO_SetBits(GPIOC,LED);
GPIO_SetBits(GPIOD,GPIO_Pin_2);//
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
}
else
{
GPIO_ResetBits(GPIOC,LED);
GPIO_SetBits(GPIOD,GPIO_Pin_2);//
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
}
}
7、检测流水灯函数、实现闪烁使用GPIO_Pin_All让灯全熄灭,然后再控制自己想控制的 灯
while(1)
{
led_control(GPIO_Pin_9,0);
led_control(GPIO_Pin_10,0);
Delay_Ms(500);
led_control(GPIO_Pin_All,1);
led_control(GPIO_Pin_9,1);
led_control(GPIO_Pin_10,1);
Delay_Ms(500);
}
8、定义按键输入
#define KEY1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
#define KEY2 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)
#define KEY3 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)
#define KEY4 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2)
9、编写按键控制函数
uint16_t key_scan(void)
{
uint16_t key_value=0 ;
if(KEY1==0)
{
key_value=1;
}
if(KEY2==0)
{
key_value=2;
}
if(KEY3==0)
{
key_value=3;
}
if (KEY4==0)
{
key_value=4;
}
return key_value;
}
10、主函数按键具体控制:下面这种是按下就亮不按不亮不持续的
```clike
while(1)
{
KEY_value=key_scan();
if(KEY_value==1)
{
led_control(GPIO_Pin_9,0);
}
if(KEY_value==2)
{
led_control(GPIO_Pin_10,0);
}
if(KEY_value==3)
{
led_control(GPIO_Pin_11,0);
}
if(KEY_value==4)
{
led_control(GPIO_Pin_12,0);
}
else
{
led_control(GPIO_Pin_All,1);
}
}
下面是按下一直亮、直到按下别的按键
while(1)
{
key_scan();
if(key_value==1)
{
led_control(GPIO_Pin_9,0);
}
if(key_value==2)
{
led_control(GPIO_Pin_10,0);
}
if(key_value==3)
{
led_control(GPIO_Pin_11,0);
}
if(key_value==4)
{
led_control(GPIO_Pin_12,0);
}
else
{
led_control(GPIO_Pin_All,1);
}
}
11、流水灯函数、最简单写法,go to definition of
GPIO_ResetBits 找到相应的BRR寄存器,将0x80左移即可。
void led_flow(uint16_t staues)
{
GPIOC->BRR = 0x80<<staues;
GPIO_SetBits(GPIOD,GPIO_Pin_2);//
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
}
相应的主函数如下时从左往右亮,到8全熄灭,然后再左向右亮’
while(1)
{
for(i=0;i<=8;i++)
{
led_flow(i);
Delay_Ms(1000);
if(i==8)
{
led_control(GPIO_Pin_All,1);
Delay_Ms(1000);
}
}
}