2019蓝桥杯嵌入式寒假学习记录(3)LCD与串口通信

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;
			}

  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值