液晶显示器,简称LCD(Liquid Crystal Display),相对于上一代CRT显示器(阴极射线管显示器),LCD显示器具有功耗低、体积小、 承载的信息量大及不伤眼的优点,因而它成为了现在的主流电子显示设备,其中包括电视、电脑显示器、手机屏幕及各种嵌入式设备的显示器。
显示器的基本参数
不管是哪一种显示器,都有一定的参数用于描述它们的特性,各个参数介绍如下:
(1) 像素
像素是组成图像的最基本单元要素,显示器的像素指它成像最小的点,即前面讲解液晶原理中提到的一个显示单元。
(2) 分辨率
一些嵌入式设备的显示器常常以“行像素值x列像素值”表示屏幕的分辨率。如分辨率800x480表示该显示器的每一行有800个像素点, 每一列有480个像素点,也可理解为有800列,480行。
(3) 色彩深度
色彩深度指显示器的每个像素点能表示多少种颜色,一般用“位”(bit)来表示。如单色屏的每个像素点能表示亮或灭两种状态(即实际上能显示2种颜色), 用1个数据位就可以表示像素点的所有状态,所以它的色彩深度为1bit,其它常见的显示屏色深为16bit、24bit。
(4) 显示器尺寸
显示器的大小一般以英寸表示,如5英寸、21英寸、24英寸等,这个长度是指屏幕对角线的长度, 通过显示器的对角线长度及长宽比可确定显示器的实际长宽尺寸。
(5) 点距
点距指两个相邻像素点之间的距离,它会影响画质的细腻度及观看距离,相同尺寸的屏幕,若分辨率越高,则点距越小, 画质越细腻。如现在有些手机的屏幕分辨率比电脑显示器的还大,这是手机屏幕点距小的原因;LED点阵显示屏的点距一般都比较大,所以适合远距离观看。
#include "stm32F4xx.h"
#include "stm32f4xx_conf.h"
#include "stdio.h"
#include "led.h"
#include "key.h"
#include "delay.h"
#include "uart.h"
#include "adc.h"
#include "bsp_lcd.h"
uint16_t select_index = 0; //表明当前选中哪一个菜单项
uint8_t beep_state = 0; //表示蜂鸣器的开关状态 0表示关闭
uint8_t led_state = 0; //表示LED的开关状态 0表示关闭
#define USER_NEW_METHOD 1 //1表示使用新方法 0 表示使用旧方法
#define USER_KEY_EXIT 1 //1表示按键外部中断 0 表示使用按键轮训检测
//编写中断服务函数
void EXTI0_IRQHandler()
{
if(EXTI_GetITStatus(EXTI_Line0) != RESET) //证明触发了中断
{
#if USER_KEY_EXIT == 1
select_index++;
if(select_index>=6)
{
select_index = 0;
}
#endif
EXTI_ClearITPendingBit(EXTI_Line0);
}
}
void EXTI15_10_IRQHandler()
{
if(EXTI_GetITStatus(EXTI_Line13) != RESET) //证明触发了中断
{
#if USER_KEY_EXIT == 1
switch(select_index)
{
//开关蜂鸣器
case 0:
if(beep_state == 0)
{
GPIO_SetBits(GPIOI,GPIO_Pin_11);//开启蜂鸣器
beep_state = 1;//更新蜂鸣器的状态
}
else
{
GPIO_ResetBits(GPIOI,GPIO_Pin_11);//关闭蜂鸣器
beep_state = 0;//更新蜂鸣器的状态
}
break;
case 1:
if(led_state == 0)
{
LED_Red_Ctrl(LED_ON);//开启红灯
led_state = 1;//更新LED的状态
}
else
{
LED_Red_Ctrl(LED_OFF);//关闭红灯
led_state = 0;//更新LED的状态
}
break;
case 2:
//画一个矩形
LCD_DrawRect(300,200,100,100);
break;
case 3:
//画一个圆形
LCD_DrawCircle(400,200,50);
break;
case 4:
//画三角形
LCD_DrawUniLine(200 ,200 ,300 ,100);
LCD_DrawUniLine(200 ,200 ,300 ,300);
LCD_DrawUniLine(300 ,100 ,300 ,300);
break;
case 5:
//清除屏幕并用黑色填充
LCD_Clear(LCD_COLOR_BLACK);
break;
}
#endif
EXTI_ClearITPendingBit(EXTI_Line13);
}
}
#if USER_NEW_METHOD == 1
//mode 0:字体颜色和背景颜色正常显示 1 字体颜色和背景颜色对调
void MyLCD_DisplayStringLine(uint16_t Line, uint8_t *ptr,uint8_t mode)
{
if(mode ==1)
{
//将字体颜色和背景颜色对调
LCD_SetColors(LCD_COLOR_BLACK,LCD_COLOR_WHITE);
//显示文字
LCD_DisplayStringLine(Line,ptr);
//还原字体颜色和背景颜色
LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);
}
else if(mode == 0)
{
//显示文字
LCD_DisplayStringLine(Line,ptr);
}
}
#endif
int main(void)
{
GPIO_InitTypeDef gpio_info;
Delay_init();
UART_init(115200);
Adc_init();
key1_init();
key2_init();
LED_init();
//屏幕初始化
LCD_Init();
//屏幕显示层初始化
LCD_LayerInit();
//LTCD外设初始化
LTDC_Cmd(ENABLE);
/*把背景层刷黑色*/
//选定控制背景层
LCD_SetLayer(LCD_BACKGROUND_LAYER);
//清除屏幕并用黑色填充
LCD_Clear(LCD_COLOR_BLACK);
/*初始化后默认使用前景层*/
LCD_SetLayer(LCD_FOREGROUND_LAYER);
/*默认设置不透明 ,该函数参数为不透明度,范围 0-0xff ,0为全透明,0xff为不透明*/
LCD_SetTransparency(0xFF);
//清除屏幕并用黑色填充
LCD_Clear(LCD_COLOR_BLACK);
#if 1
//PI11 蜂鸣器
//初始化GPIO-I时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOI,ENABLE);
gpio_info.GPIO_Mode = GPIO_Mode_OUT;
gpio_info.GPIO_OType = GPIO_OType_PP;
gpio_info.GPIO_Pin = GPIO_Pin_11;
gpio_info.GPIO_PuPd = GPIO_PuPd_UP;
gpio_info.GPIO_Speed = GPIO_Low_Speed;
GPIO_Init(GPIOI,&gpio_info);
#endif
/*设置字体颜色及字体的背景颜色(此处的背景不是指LCD的背景层!注意区分)*/
LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);
/*选择字体*/
LCD_SetFont(&Font16x24);
while(1)
{
LCD_DisplayStringLine(LINE(1),(uint8_t* )"Device Control");
#if USER_KEY_EXIT == 0
//方法1:使用轮训方式检测按键
uint8_t key1 = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);
uint8_t key2 = GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13);
//如果Key1按下
if(key1 == 1)
{
select_index++;
if(select_index>=6)
{
select_index = 0;
}
}
//如果key2按下
if(key2 == 1)
{
switch(select_index)
{
//开关蜂鸣器
case 0:
if(beep_state == 0)
{
GPIO_SetBits(GPIOI,GPIO_Pin_11);//开启蜂鸣器
beep_state = 1;//更新蜂鸣器的状态
}
else
{
GPIO_ResetBits(GPIOI,GPIO_Pin_11);//关闭蜂鸣器
beep_state = 0;//更新蜂鸣器的状态
}
break;
case 1:
if(led_state == 0)
{
LED_Red_Ctrl(LED_ON);//开启红灯
led_state = 1;//更新LED的状态
}
else
{
LED_Red_Ctrl(LED_OFF);//关闭红灯
led_state = 0;//更新LED的状态
}
break;
case 2:
//画一个矩形
LCD_DrawRect(300,200,100,100);
break;
case 3:
//画一个圆形
LCD_DrawCircle(400,200,50);
break;
case 4:
//画三角形
LCD_DrawUniLine(200 ,200 ,300 ,100);
LCD_DrawUniLine(200 ,200 ,300 ,300);
LCD_DrawUniLine(300 ,100 ,300 ,300);
break;
case 5:
//清除屏幕并用黑色填充
LCD_Clear(LCD_COLOR_BLACK);
break;
}
}
#endif
#if USER_NEW_METHOD == 0
//界面显示处理部分
switch(select_index)
{
case 0:
//将字体颜色和背景颜色对调
LCD_SetColors(LCD_COLOR_BLACK,LCD_COLOR_WHITE);
//显示文字
LCD_DisplayStringLine(LINE(2),(uint8_t* )"BEEP");
//还原字体颜色和背景颜色
LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);
LCD_DisplayStringLine(LINE(3),(uint8_t* )"RGB-R");
LCD_DisplayStringLine(LINE(4),(uint8_t* )"DrawRect");
LCD_DisplayStringLine(LINE(5),(uint8_t* )"DrawCircle");
LCD_DisplayStringLine(LINE(6),(uint8_t* )"DrawTriangle");
LCD_DisplayStringLine(LINE(7),(uint8_t* )"Clear");
break;
case 1:
LCD_DisplayStringLine(LINE(2),(uint8_t* )"BEEP");
//将字体颜色和背景颜色对调
LCD_SetColors(LCD_COLOR_BLACK,LCD_COLOR_WHITE);
LCD_DisplayStringLine(LINE(3),(uint8_t* )"RGB-R");
//还原字体颜色和背景颜色
LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);
LCD_DisplayStringLine(LINE(4),(uint8_t* )"DrawRect");
LCD_DisplayStringLine(LINE(5),(uint8_t* )"DrawCircle");
LCD_DisplayStringLine(LINE(6),(uint8_t* )"DrawTriangle");
LCD_DisplayStringLine(LINE(7),(uint8_t* )"Clear");
break;
case 2:
LCD_DisplayStringLine(LINE(2),(uint8_t* )"BEEP");
LCD_DisplayStringLine(LINE(3),(uint8_t* )"RGB-R");
//将字体颜色和背景颜色对调
LCD_SetColors(LCD_COLOR_BLACK,LCD_COLOR_WHITE);
LCD_DisplayStringLine(LINE(4),(uint8_t* )"DrawRect");
//还原字体颜色和背景颜色
LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);
LCD_DisplayStringLine(LINE(5),(uint8_t* )"DrawCircle");
LCD_DisplayStringLine(LINE(6),(uint8_t* )"DrawTriangle");
LCD_DisplayStringLine(LINE(7),(uint8_t* )"Clear");
break;
case 3:
LCD_DisplayStringLine(LINE(2),(uint8_t* )"BEEP");
LCD_DisplayStringLine(LINE(3),(uint8_t* )"RGB-R");
LCD_DisplayStringLine(LINE(4),(uint8_t* )"DrawRect");
//将字体颜色和背景颜色对调
LCD_SetColors(LCD_COLOR_BLACK,LCD_COLOR_WHITE);
LCD_DisplayStringLine(LINE(5),(uint8_t* )"DrawCircle");
//还原字体颜色和背景颜色
LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);
LCD_DisplayStringLine(LINE(6),(uint8_t* )"DrawTriangle");
LCD_DisplayStringLine(LINE(7),(uint8_t* )"Clear");
break;
case 4:
LCD_DisplayStringLine(LINE(2),(uint8_t* )"BEEP");
LCD_DisplayStringLine(LINE(3),(uint8_t* )"RGB-R");
LCD_DisplayStringLine(LINE(4),(uint8_t* )"DrawRect");
LCD_DisplayStringLine(LINE(5),(uint8_t* )"DrawCircle");
//将字体颜色和背景颜色对调
LCD_SetColors(LCD_COLOR_BLACK,LCD_COLOR_WHITE);
LCD_DisplayStringLine(LINE(6),(uint8_t* )"DrawTriangle");
//还原字体颜色和背景颜色
LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);
LCD_DisplayStringLine(LINE(7),(uint8_t* )"Clear");
break;
case 5:
LCD_DisplayStringLine(LINE(2),(uint8_t* )"BEEP");
LCD_DisplayStringLine(LINE(3),(uint8_t* )"RGB-R");
LCD_DisplayStringLine(LINE(4),(uint8_t* )"DrawRect");
LCD_DisplayStringLine(LINE(5),(uint8_t* )"DrawCircle");
LCD_DisplayStringLine(LINE(6),(uint8_t* )"DrawTriangle");
//将字体颜色和背景颜色对调
LCD_SetColors(LCD_COLOR_BLACK,LCD_COLOR_WHITE);
LCD_DisplayStringLine(LINE(7),(uint8_t* )"Clear");
//还原字体颜色和背景颜色
LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);
break;
}
#else
//使用新方法
MyLCD_DisplayStringLine(LINE(2),(uint8_t* )"BEEP",select_index == 0);
MyLCD_DisplayStringLine(LINE(3),(uint8_t* )"RGB-R",select_index == 1);
MyLCD_DisplayStringLine(LINE(4),(uint8_t* )"DrawRect",select_index == 2);
MyLCD_DisplayStringLine(LINE(5),(uint8_t* )"DrawCircle",select_index == 3);
MyLCD_DisplayStringLine(LINE(6),(uint8_t* )"DrawTriangle",select_index == 4);
MyLCD_DisplayStringLine(LINE(7),(uint8_t* )"Clear",select_index == 5);
#endif
}
}
注:以上文字和图片来自《野火》。