前导:本文的目的与,意在于面向应用的学习单片机,故不会涉及太多的原理知识,例如寄存器之类的。
主要目的在于面向应用的学习单片机,学会单片机的基础用法,开发板采取野火的指南者f103。
作者大二小白,写的不好的地方轻点喷,欢迎评论区交流
全部工程代码开源在Gitee仓库
一 LCD简介
LCD是一类常见的彩色显示屏,常常作为输出设备接入在单片机上,提供给用户交互页面。
其显示是通过点亮屏幕上的像素点显示的,例如320*240的LCD屏幕,就可以分别点亮指定坐标上的像素点,做到显示的效果
二 LCD例程简单讲解
2.1 例程
将Gitee仓库里的LCD_Base复制到你要存的目录下,打开查看,可以看到主函数里调用了一行LCD测试函数
里面有详细的注释
运行后会发现,LCD屏会根据注释里所说的运行。
大致阅读之后,应该能够掌握屏幕的基础使用。
接下来,我们来阅读一下lcd的头文件。
2.2 头文件部分
基本上属于一个功能对应一个函数,在上面的例程里也都用了我们大部分情况下会使用的函数。
颜色的宏定义,可以用在设置背景色和字体颜色。
三 小实验
把之前的两个led的小实验整合lcd屏幕的显示
3.1 需求
显示之前的key1_flag,key2_flag,以及统计两个按键被按下的次数。
3.2解决思路
首先,既然要展示那些参数,参数本身是变量,那我们就需要动态展示。
如果是下图这种写死字符串的形式的话,那我们的参数就永远不会改变了,永远只能显示该字符串的内容
ILI9341_DispStringLine_EN(LINE(1),"KEY1_Flag:1");
ILI9341_DispStringLine_EN(LINE(2),"KEY2_Flag:1");
ILI9341_DispStringLine_EN(LINE(4),"KEY1_Count:1");
ILI9341_DispStringLine_EN(LINE(5),"KEY2_Count:1");
所以我们要使用 sprintf
sprintf指的是字符串格式化
sprintf(char *string, char *format [,argument,…]);
主要功能是把格式化的数据写入某个字符串中,即发送格式化输出到 string 所指向的字符串。
举个例子
char buf[20];
//把后面格式化的数据写入到buf里
sprintf(buf,"KEY1_Flag:%d",KEY1_Flag)
//展示出来
ILI9341_DispStringLine_EN(LINE(1),buf);
这样的写法,当我们的KEY1_Flag变量改变时,随着while(1)的刷新,就会显示新的字符串。
所以思路如下
- sprintf 结合 ILI9341_DispStringLine_EN 显示数据
- 按键按下时记录,并改变显示的变量
3.3 代码
由于该工程内已经集成了KEY和LED的文件,所以可以轻松的控制按键和LED,通过前两篇里的那些函数。
char disp[20];
int key1_flag = 0;
int key2_flag = 0;
int key1_count = 0;
int key2_count = 0;
void LCD_Show()
{
sprintf(disp,"KEY1_Flag:%d",key1_flag);
ILI9341_DispStringLine_EN(LINE(1),disp);
sprintf(disp,"KEY2_Flag:%d",key2_flag);
ILI9341_DispStringLine_EN(LINE(2),disp);
sprintf(disp,"KEY1_Count:%3d",key1_count);
ILI9341_DispStringLine_EN(LINE(4),disp);
sprintf(disp,"KEY2_Count:%3d",key2_count);
ILI9341_DispStringLine_EN(LINE(5),disp);
}
void KEY_Control()
{
char key = KEY_Scan();
if(key=='1'){
key1_flag = !key1_flag;
key1_count++;
}
if(key=='2'){
key2_flag = !key2_flag;
key2_count++;
}
}
while (1)
{
LCD_Show();
KEY_Control();
}