2019蓝桥杯嵌入式寒假学习记录(3)LCD与串口通信
时间过得真快啊,1月30号了,明天就离开学校回家了,前几天学了一下LCD和串口通信,这两天没怎么看32在摸索学习画PCB,那么还是言归正传吧,我在网上查听说比赛直接会给LCD的.c和.h文件还有一个fonts.H文件font的意思是字体,大家可以打开看看,里面是一些数字,字母和符号的对应的一些代码,所以如果要在屏幕上显示这些数字,字母和符号要把这个文件添加进去。关于LCD的知识比赛直接给了驱动我们就省事很多了,LCD外设设置挺复杂的,以前看过视频教程,感兴趣的可以深入了解一下原理,这样对代码的理解会更深刻。然后学习了串口通信,串口通信就是对GPIO和中断的一些应用也比较简单,关键是了解收发时完成的寄存器标志,来协同完成通信。
LCD
比赛直接给驱动的话,我们就直接把文件添加到工程中就可以了,我们要做的就是要了解.h文件中函数的作用,还要知道如何运用,常用的函数有以下。
void STM3210B_LCD_Init(void); //初始化LCD
void LCD_SetTextColor(vu16 Color); //改变字体颜色
void LCD_SetBackColor(vu16 Color); //改变字体背景颜色
void LCD_ClearLine(u8 Line); //清除某一行
void LCD_Clear(u16 Color); //清除全部行
void LCD_DisplayChar(u8 Line, u16 Column, u8 Ascii); //行显示字符
void LCD_DisplayStringLine(u8 Line, u8 *ptr); //行显示字符串
USART
板子上有两个串口通信接口,一个是RS232串口1,一个是USB串口2(与电源在一起),我们要使用的是串口2,通过usb串口直接与PC机进行通信。既然是通信就有接收方和发送方,所以在写函数时就要写接收函数和发送函数。
#include"usart.h"
void Usart_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
//初始化发送引脚TX2
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2 ; //选择控制GPIO引脚
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //引脚设为模拟输出模式
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置引脚速录为50MHZ
GPIO_Init(GPIOA,&GPIO_InitStructure); //调用库函数,初始化GPIO
//初始化接收RX2 //RX2
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3 ; //选择控制GPIO引脚
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //引脚设为浮空输入模式
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置引脚速录为50MHZ
GPIO_Init(GPIOA,&GPIO_InitStructure); //调用库函数,初始化GPIO
//NVIC
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //配置NVIC优先级分组
NVIC_InitStructure.NVIC_IRQChannel =USART2_IRQn; //配置中断源
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1; //配置抢断优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //配置子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能NVIC
NVIC_Init(&NVIC_InitStructure); //初始化NVIC
//配置串口
USART_InitStructure.USART_BaudRate=9600; //配置串口波特率
USART_InitStructure.USART_WordLength=USART_WordLength_8b; //设置接收字节长度
USART_InitStructure.USART_StopBits=USART_StopBits_1; //1位停止位
USART_InitStructure.USART_Parity=USART_Parity_No; //无奇偶校验位
USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx; //使能接收和发送端口
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //不使能硬件流控制
USART_Init( USART2,&USART_InitStructure); //初始化串口
USART_Cmd(USART2,ENABLE); //使能串口
USART_ITConfig(USART2,USART_IT_RXNE,ENABLE); //是能接收中断
}
void Usart_Send(uint8_t *str) //串口发送函数
{
uint8_t index=0;
do
{
USART_SendData(USART2,str[index]);
while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==0); //等待发送完成
index++;
}while(str[index]!=0);
}
#ifndef _USART_H
#define _USART_H
#include"stm32f10x.h"
void Usart_Init(void);
void Usart_Send(uint8_t *str);
#endif
中断
void USART2_IRQHandler(void)
{
u8 temp;
if(USART_GetITStatus(USART2,USART_IT_RXNE)==1) //串口接收标志位
{
USART_ClearITPendingBit(USART2,USART_IT_RXNE); //清楚标志位
temp=USART_ReceiveData(USART2);
if(temp=='0') //判断是否接收完成
{
RXOVER = 1;
RXCUNT = 0;
USART_ITConfig(USART2,USART_IT_RXNE,DISABLE);
}
else //每次中断接收一个字节
{
RXBUF[RXCUNT]=temp; //RXBUF存储接收的字符串
RXCUNT++;
}
}
}
#include"led.h"
#include"SysTick.h"
#include "lcd.h"
#include"stdio.h"
#include"key.h"
#include"usart.h"
extern void Delay_Ms( __IO uint32_t ms);
u8 string[20];
u8 temp = 30;
float AO = 3.845;
u8 choose=0;
u8 RXBUF[20];
u8 RXOVER = 0;
u8 RXCUNT = 0;
u8 i;
int main()
{
SysTick_Init( );
LED_Init();
Key_Init();
Usart_Init();
//LCD工作模式配置
STM3210B_LCD_Init();
LCD_SetTextColor(White);
LCD_SetBackColor(Blue);
LCD_Clear(Blue);
while(1)
{
if(RXOVER)
{
LCD_ClearLine(Line3);
LCD_ClearLine(Line2);
LCD_DisplayStringLine(Line2, "massage:");
LCD_DisplayStringLine(Line3, RXBUF);
Usart_Send(RXBUF);
for(i=0;i<20;i++)
{
RXBUF[i] = 0;
}
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); //使能串口中断,为下次接收做准备
RXOVER = 0;
}
}
}