一、 LCD移植
1.添加官方给的三个文件分别到Inc和Src文件夹中
2.将lcd.c文件添加到项目中,与之前的做法一致
3.在主函数中添加头文件
4.LCD的初始化 注:这个初始化一定要放到其他初始化的后面,不然前面会覆盖后面的!!!
二、 常用的LCD函数
void LCD_Init(void);
这个函数用于初始化LCD。它可能会设置LCD的各种参数,如时序控制、接口配置、显示参数等,以确保LCD能够正确工作。通常,这个函数在系统启动时调用一次。
void LCD_SetTextColor(vu16 Color);
这个函数用于设置LCD显示的文本颜色。调用这个函数后,所有的文本输出都将使用这个颜色,直到再次改变颜色。
void LCD_SetBackColor(vu16 Color);
这个函数用于设置LCD的背景颜色。与 LCD_SetTextColor 类似。这个背景颜色将用于下一个字符或字符串的背景或LCD屏幕的空白部分。
void LCD_Clear(u16 Color);
这个函数用于清除LCD屏幕,并用指定的颜色填充整个屏幕。这通常用于屏幕内容的初始化或者在屏幕更新前清除旧的显示内容。
void LCD_DisplayStringLine(u8 Line, u8 *ptr);
在LCD屏幕的指定行上显示一个字符串。这个字符串从ptr指向的内存地址开始,直到遇到空字符结束。
三、 LCD基础功能使用
本实验的实验现象:用按键控制页面的切换,刚上电,页面为白色,按下按钮1切换页面1,按下按钮2切换页面2
1.在key.c中将写功能增加几行代码,用于按键控制页面切换!
2.在lcd.c文件中写入页面代码
char str[50];
extern int gui;
void lcd()
{
if(gui==0) //界面0
{
LCD_SetBackColor(Blue);//设置背景颜色
LCD_SetTextColor(White);//设置字体颜色
LCD_DisplayStringLine(Line0, (uint8_t *)" ");//写界面内容
LCD_DisplayStringLine(Line1, (uint8_t *)" ");
LCD_DisplayStringLine(Line2, (uint8_t *)" LD MODE ");
LCD_DisplayStringLine(Line3, (uint8_t *)" ");
LCD_DisplayStringLine(Line4, (uint8_t *)" ");
LCD_SetBackColor(White);
LCD_SetTextColor(Blue);
LCD_DisplayStringLine(Line5, (uint8_t *)" ");
LCD_DisplayStringLine(Line6, (uint8_t *)" ");
LCD_DisplayStringLine(Line7, (uint8_t *)" ");
LCD_DisplayStringLine(Line8, (uint8_t *)" LD1:On ");
LCD_DisplayStringLine(Line9, (uint8_t *)" ");
}
if(gui==1)
{
LCD_SetBackColor(Blue);
LCD_SetTextColor(White);
LCD_DisplayStringLine(Line0, (uint8_t *)" ");
LCD_DisplayStringLine(Line1, (uint8_t *)" ");
LCD_DisplayStringLine(Line2, (uint8_t *)" TIM MODE ");
LCD_DisplayStringLine(Line3, (uint8_t *)" ");
LCD_DisplayStringLine(Line4, (uint8_t *)" ");
LCD_SetBackColor(White);
LCD_SetTextColor(Blue);
LCD_DisplayStringLine(Line5, (uint8_t *)" ");
LCD_DisplayStringLine(Line6, (uint8_t *)" Stopwatch timing ");
LCD_DisplayStringLine(Line7, (uint8_t *)" ");
sprintf(str," c ");//在屏幕上显示计数值
LCD_DisplayStringLine(Line8, (uint8_t *)str);
LCD_DisplayStringLine(Line9, (uint8_t *)" ");
}
}
3.在main.c函数中进行初试化,清屏和调用
四、LCD 高亮显示某一行
在LCD 屏幕中高亮显示某一行
在lcd.c中加入如下代码
void gaoliang(int gaoliang_line,int gaoliang_color,int other_color)//1是高亮显示0--9行,2是高亮颜色,3是其他颜色
{
LCD_SetBackColor(other_color);
if(gaoliang_line!=0)
{LCD_DisplayStringLine(Line0,(uint8_t *)" hello ");}
if(gaoliang_line!=1)
{LCD_DisplayStringLine(Line1,(uint8_t *)" hello ");}
if(gaoliang_line!=2)
{LCD_DisplayStringLine(Line2,(uint8_t *)" hello ");}
if(gaoliang_line!=3)
{LCD_DisplayStringLine(Line3,(uint8_t *)" hello ");}
if(gaoliang_line!=4)
{LCD_DisplayStringLine(Line4,(uint8_t *)" hello ");}
if(gaoliang_line!=5)
{LCD_DisplayStringLine(Line5,(uint8_t *)" hello ");}
if(gaoliang_line!=6)
{LCD_DisplayStringLine(Line6,(uint8_t *)" hello ");}
if(gaoliang_line!=7)
{LCD_DisplayStringLine(Line7,(uint8_t *)" hello ");}
if(gaoliang_line!=8)
{LCD_DisplayStringLine(Line8,(uint8_t *)" hello ");}
if(gaoliang_line!=9)
{LCD_DisplayStringLine(Line9,(uint8_t *)" hello ");}
LCD_SetBackColor(gaoliang_color);
switch (gaoliang_line)
{
case 0: LCD_DisplayStringLine(Line0,(uint8_t *)" hello ");break;
case 1: LCD_DisplayStringLine(Line1,(uint8_t *)" hello ");break;
case 2: LCD_DisplayStringLine(Line2,(uint8_t *)" hello ");break;
case 3: LCD_DisplayStringLine(Line3,(uint8_t *)" hello ");break;
case 4: LCD_DisplayStringLine(Line4,(uint8_t *)" hello ");break;
case 5: LCD_DisplayStringLine(Line5,(uint8_t *)" hello ");break;
case 6: LCD_DisplayStringLine(Line6,(uint8_t *)" hello ");break;
case 7: LCD_DisplayStringLine(Line7,(uint8_t *)" hello ");break;
case 8: LCD_DisplayStringLine(Line8,(uint8_t *)" hello ");break;
case 9: LCD_DisplayStringLine(Line9,(uint8_t *)" hello ");break;
}
LCD_SetBackColor(other_color);
}
在main.c中的while(1)中进行函数的调用
gaoliang(0,Blue,White);
五、LCD 高亮显示某一个字符
在lcd.c中加入如下代码
注:LCD共319列,从右边开始计算,故采用319-y就表示从左侧起第y列
//高亮变量(两位小数),高亮的颜色,背景颜色,行,列
void gaoliang_char(float value,int color,int Back_color,int line,int y)
{
int x_shi,x_ge,x_xiao1,x_xiao2;
LCD_SetBackColor(Back_color);
LCD_SetTextColor(color);
x_shi=(int)(value*100)/1000;
x_ge=(int)(value*100)%1000/100;
x_xiao1=(int)(value*100)%1000%100/10;
x_xiao2=(int)(value*100)%1000%100%10;
LCD_DisplayChar(line, 319-y, (char)x_shi+'0');
LCD_DisplayChar(line, 319-(y+15), (char)x_ge+'0');
LCD_DisplayChar(line, 319-(y+30), '.');
LCD_DisplayChar(line, 319-(y+45), (char)x_xiao1+'0');
LCD_DisplayChar(line, 319-(y+60), (char)x_xiao2+'0');
}
在main.c中的while(1)中进行函数的调用
gaoliang_char(45.31,Green,White,Line0,110);
六、解决LCD和LED冲突
查阅LCD官方原理图跟LED官方原理图可知,LED的八个GPIO引脚与LCD冲突。
为了解决这一冲突,在这三个函数的头尾分别加上
u16 pcout = GPIOC->ODR;
GPIOC->ODR = pcout;
GPIOC->ODR 是一个寄存器,ODR 通常代表输出数据寄存器(Output Data Register),用于控制连接到 GPIOC 端口的引脚的高低电平状态。
如果你在LCD和LED之间遇到冲突,这可能是因为它们共享了相同的GPIO端口(在这个例子中是 GPIOC),并且在操作LCD时可能会不小心改变了应该控制LED的引脚状态。为了避免这种情况,你可以在操作LCD之前保存当前GPIOC端口的状态,并在操作完成后恢复它。这样可以确保在LCD操作期间不会影响到LED的状态。
七、易错点
1.这行初始化一定不能忘记,否则无法运行!
LCD_Init();//lcd初始化
2.注意这个函数,这个函数会额外为设置字体的那一行添加白色背景
LCD_SetTextColor();
以下这两个案例就很好的说明了。
第一个案例,因为字体颜色是白色,额外添加了白色背景所以显示就覆盖了。
LCD_Clear(Black);
LCD_SetTextColor(White);
第二个案例,字体颜色是绿色,额外添加了白色背景也不会覆盖其颜色,所以正常显示。
LCD_Clear(Black);
LCD_SetTextColor(Green);