1.新建工程
使用第一章配好的STM32CubeMX和Keil5
2.查看数据书册及图形化配置
打开CT117E-M4产品手册
查看LCD和LED的原理图
发现LED和LCD的部分引脚相同,这时候图中U1锁存器的作用就出来了,下面会讲如何解决引脚冲突的问题。
图形化配置,与第三章相同即可,这里就不过多叙述了
配置完成后,点击导航栏右侧 GENERATE CODE 生成项目
3.代码部分
创建headfile.h,并导入到项目(第二章有此部分讲解)
将赛点数据包中的lcd.h、lcd.c、font.h三个文件导入到项目中,并在headfile.h中引用
在while(1)外main里的标准LCD屏初始化流程:
LCD_Init(); //LCD初始化
LCD_Clear(Black); //LCD用黑色清屏
LCD_SetBackColor(Black); //设置背景颜色为黑色
LCD_SetTextColor(White); //设置字体颜色为白色
新建lcd_fun.c文件
#include "headfile.h"
char text[20]; //文本缓存区
uint8_t count = 0; //用来记录按键的按下次数
void lcd_show(void)
{
sprintf(text," ChenSir "); //将双引号中的字符串放进text数组中
LCD_DisplayStringLine(Line0,(uint8_t *)text); //将text数组展示在LCD的第0行
sprintf(text," Count:%d ",count);
LCD_DisplayStringLine(Line3,(uint8_t *)text);
}
lcd.h末尾加上:void lcd_show(void); 声明一下函数
修改上一章的key.c文件的内容,添加一个外部变量count
#include "headfile.h"
uint8_t B1_State;
uint8_t B1_Last_State;
uint8_t B2_State;
uint8_t B2_Last_State;
uint8_t B3_State;
uint8_t B3_Last_State;
uint8_t B4_State;
uint8_t B4_Last_State;
extern uint8_t count;
void Key_Scan(void)
{
B1_State = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
B2_State = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
B3_State = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
B4_State = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
if(B1_State == 0 && B1_Last_State == 1)
{
led_show(1,1);
count++;
}
if(B2_State == 0 && B2_Last_State == 1)
{
led_show(1,0);
count--;
}
if(B3_State == 0 && B3_Last_State == 1)
{
led_show(2,1);
count++;
}
if(B4_State == 0 && B4_Last_State == 1)
{
led_show(2,0);
count--;
}
B1_Last_State = B1_State;
B2_Last_State = B2_State;
B3_Last_State = B3_State;
B4_Last_State = B4_State;
}
main函数内容如下
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
LCD_Init();
LCD_Clear(Black);
LCD_SetBackColor(Black);
LCD_SetTextColor(White);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
lcd_show();
Key_Scan();
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
4.编译并烧录
点击导航栏的全部编译,输出窗口显示0错误
将烧录线一端连接至电脑的USB口,另一端连接至开发板的Download下载口
连好之后点击烧录按钮
烧录完成后,LCD屏亮起,显示对应的字符串,按下相应按键时Count的数值改变,并显示在LCD屏上。
5.解决led和lcd引脚冲突问题
首先在LCD_Init()前将PD2给高电平
修改赛点数据包的lcd.c中的LCD_Clear()和LCD_DisplayStringLine()函数,在开头加temp变量暂存GPIOC的输出, 在末尾将temp再赋值给GPIOC的输出
void LCD_Clear(u16 Color)
{
uint16_t temp = GPIOC->ODR;
u32 index = 0;
LCD_SetCursor(0x00, 0x0000);
LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
for(index = 0; index < 76800; index++)
{
LCD_WriteRAM(Color);
}
GPIOC->ODR = temp;
}
void LCD_DisplayStringLine(u8 Line, u8 *ptr)
{
uint16_t temp = GPIOC->ODR;
u32 i = 0;
u16 refcolumn = 319;//319;
while ((*ptr != 0) && (i < 20)) // 20
{
LCD_DisplayChar(Line, refcolumn, *ptr);
refcolumn -= 16;
ptr++;
i++;
}
GPIOC->ODR = temp;
}