stm32的LCD显示

液晶显示器,简称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        

    }
}
 

注:以上文字和图片来自《野火》。

  • 38
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值