stm32学习笔记(十一)LCD显示

发布者:AngelicHeart最新更新时间:2018-12-29 来源: eefocus关键字:stm32  LCD显示 手机看文章 扫描二维码
随时随地手机看文章


#ifndef __LCD_H

#define __LCD_H

#include "sys.h"  

#include "stdlib.h"

//////////////////////////////////////////////////////////////////////////////////  

//本程序只供学习使用,未经作者许可,不得用于其它任何用途

//ALIENTEK MiniSTM32F103开发板

//2.4寸/2.8寸/3.5寸/4.3寸/7寸 TFT液晶驱动   

//支持驱动IC型号包括:ILI9341/ILI9325/RM68042/RM68021/ILI9320/ILI9328/LGDP4531/LGDP4535/

//                  SPFD5408/1505/B505/C505/NT35310/NT35510/SSD1963等     

//正点原子@ALIENTEK

//技术论坛:www.openedv.com

//创建日期:2010/7/4

//版本:V3.0

//版权所有,盗版必究。

//Copyright(C) 广州市星翼电子科技有限公司 2014-2024

//All rights reserved

//********************************************************************************

//V1.2修改说明

//支持了SPFD5408的驱动,另外把液晶ID直接打印成HEX格式.方便查看LCD驱动IC.

//V1.3

//加入了快速IO的支持

//修改了背光控制的极性(适用于V1.8及以后的开发板版本)

//对于1.8版本之前(不包括1.8)的液晶模块,请修改LCD_Init函数的LCD_LED=1;为LCD_LED=1;

//V1.4

//修改了LCD_ShowChar函数,使用画点功能画字符。

//加入了横竖屏显示的支持

//V1.5 20110730

//1,修改了B505液晶读颜色有误的bug.

//2,修改了快速IO及横竖屏的设置方式.

//V1.6 20111116

//1,加入对LGDP4535液晶的驱动支持

//V1.7 20120713

//1,增加LCD_RD_DATA函数

//2,增加对ILI9341的支持

//3,增加ILI9325的独立驱动代码

//4,增加LCD_Scan_Dir函数(慎重使用)   

//6,另外修改了部分原来的函数,以适应9341的操作

//V1.8 20120905

//1,加入LCD重要参数设置结构体lcddev

//2,加入LCD_Display_Dir函数,支持在线横竖屏切换

//V1.9 20120911

//1,新增RM68042驱动(ID:6804),但是6804不支持横屏显示!!原因:改变扫描方式,

//导致6804坐标设置失效,试过很多方法都不行,暂时无解。

//V2.0 20120924

//在不硬件复位的情况下,ILI9341的ID读取会被误读成9300,修改LCD_Init,将无法识别

//的情况(读到ID为9300/非法ID),强制指定驱动IC为ILI9341,执行9341的初始化。

//V2.1 20120930

//修正ILI9325读颜色的bug。

//V2.2 20121007

//修正LCD_Scan_Dir的bug。

//V2.3 20130120

//新增6804支持横屏显示

//V2.4 20131120

//1,新增NT35310(ID:5310)驱动器的支持

//2,新增LCD_Set_Window函数,用于设置窗口,对快速填充,比较有用,但是该函数在横屏时,不支持6804.

//V2.5 20140211

//1,新增NT35510(ID:5510)驱动器的支持

//V2.6 20140504

//1,新增ASCII 24*24字体的支持(更多字体用户可以自行添加)  

//2,修改部分函数参数,以支持MDK -O2优化

//3,针对9341/35310/35510,写时间设置为最快,尽可能的提高速度

//4,去掉了SSD1289的支持,因为1289实在是太慢了,读周期要1us...简直奇葩.不适合F4使用

//5,修正68042及C505等IC的读颜色函数的bug.

//V2.7 20140710

//1,修正LCD_Color_Fill函数的一个bug. 

//2,修正LCD_Scan_Dir函数的一个bug.

//V2.8 20140721

//1,解决MDK使用-O2优化时LCD_ReadPoint函数读点失效的问题.

//2,修正LCD_Scan_Dir横屏时设置的扫描方式显示不全的bug.

//V2.9 20141130

//1,新增对SSD1963 LCD的支持.

//2,新增LCD_SSD_BackLightSet函数

//3,取消ILI93XX的Rxx寄存器定义

//V3.0 20150423

//修改SSD1963 LCD屏的驱动参数.

//////////////////////////////////////////////////////////////////////////////////  

 

 

//LCD重要参数集

typedef struct  

{     

u16 width; //LCD 宽度

u16 height; //LCD 高度

u16 id; //LCD ID

u8  dir; //横屏还是竖屏控制:0,竖屏;1,横屏。

u16 wramcmd; //开始写gram指令

u16 setxcmd; //设置x坐标指令

u16  setycmd; //设置y坐标指令  

}_lcd_dev;   

 

//LCD参数

extern _lcd_dev lcddev; //管理LCD重要参数

//LCD的画笔颜色和背景色    

extern u16  POINT_COLOR;//默认红色    

extern u16  BACK_COLOR; //背景颜色.默认为白色

 

////////////////////////////////////////////////////////////////////

//-----------------LCD端口定义---------------- 

#define LCD_LED PCout(10) //LCD背光    PC10 

 

#define LCD_CS_SET  GPIOC->BSRR=1<<9    //片选端口  PC9

#define LCD_RS_SET GPIOC->BSRR=1<<8    //数据/命令 PC8    

#define LCD_WR_SET GPIOC->BSRR=1<<7    //写数据 PC7

#define LCD_RD_SET GPIOC->BSRR=1<<6    //读数据 PC6

    

#define LCD_CS_CLR  GPIOC->BRR=1<<9     //片选端口  PC9

#define LCD_RS_CLR GPIOC->BRR=1<<8     //数据/命令 PC8    

#define LCD_WR_CLR GPIOC->BRR=1<<7     //写数据 PC7

#define LCD_RD_CLR GPIOC->BRR=1<<6     //读数据 PC6   

 

 

//PB0~15,作为数据线

#define DATAOUT(x) GPIOB->ODR=x; //数据输出

#define DATAIN     GPIOB->IDR;   //数据输入

 

 

//////////////////////////////////////////////////////////////////////

//扫描方向定义

#define L2R_U2D  0 //从左到右,从上到下

#define L2R_D2U  1 //从左到右,从下到上

#define R2L_U2D  2 //从右到左,从上到下

#define R2L_D2U  3 //从右到左,从下到上

 

#define U2D_L2R  4 //从上到下,从左到右

#define U2D_R2L  5 //从上到下,从右到左

#define D2U_L2R  6 //从下到上,从左到右

#define D2U_R2L  7 //从下到上,从右到左

 

#define DFT_SCAN_DIR  L2R_U2D  //默认的扫描方向

 

//扫描方向定义

#define L2R_U2D  0 //从左到右,从上到下

#define L2R_D2U  1 //从左到右,从下到上

#define R2L_U2D  2 //从右到左,从上到下

#define R2L_D2U  3 //从右到左,从下到上

 

#define U2D_L2R  4 //从上到下,从左到右

#define U2D_R2L  5 //从上到下,从右到左

#define D2U_L2R  6 //从下到上,从左到右

#define D2U_R2L  7 //从下到上,从右到左  

 

#define DFT_SCAN_DIR  L2R_U2D  //默认的扫描方向

 

//画笔颜色

#define WHITE          0xFFFF

#define BLACK          0x0000   

#define BLUE          0x001F  

#define BRED             0XF81F

#define GRED 0XFFE0

#define GBLUE 0X07FF

#define RED            0xF800

#define MAGENTA        0xF81F

#define GREEN          0x07E0

#define CYAN          0x7FFF

#define YELLOW        0xFFE0

#define BROWN 0XBC40 //棕色

#define BRRED 0XFC07 //棕红色

#define GRAY  0X8430 //灰色

//GUI颜色

 

#define DARKBLUE      0X01CF //深蓝色

#define LIGHTBLUE      0X7D7C //浅蓝色  

#define GRAYBLUE        0X5458 //灰蓝色

//以上三色为PANEL的颜色 

 

#define LIGHTGREEN      0X841F //浅绿色 

#define LGRAY 0XC618 //浅灰色(PANNEL),窗体背景色

 

#define LGRAYBLUE        0XA651 //浅灰蓝色(中间层颜色)

#define LBBLUE           0X2B12 //浅棕蓝色(选择条目的反色)

      

void LCD_Init(void);     //初始化

void LCD_DisplayOn(void); //开显示

void LCD_DisplayOff(void); //关显示

void LCD_Clear(u16 Color); //清屏

void LCD_SetCursor(u16 Xpos, u16 Ypos); //设置光标

void LCD_DrawPoint(u16 x,u16 y); //画点

void LCD_Fast_DrawPoint(u16 x,u16 y,u16 color); //快速画点

u16  LCD_ReadPoint(u16 x,u16 y); //读点 

void LCD_Draw_Circle(u16 x0,u16 y0,u8 r);     //画圆

void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2); //画线

void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2);     //画矩形

void LCD_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 color);     //填充单色

void LCD_Color_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 *color); //填充指定颜色

void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode); //显示一个字符

void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len,u8 size);  //显示一个数字

void LCD_ShowxNum(u16 x,u16 y,u32 num,u8 len,u8 size,u8 mode); //显示 数字

void LCD_ShowString(u16 x,u16 y,u16 width,u16 height,u8 size,u8 *p); //显示一个字符串,12/16字体

 

void LCD_WriteReg(u16 LCD_Reg, u16 LCD_RegValue);

u16 LCD_ReadReg(u16 LCD_Reg);

void LCD_WriteRAM_Prepare(void);

void LCD_WriteRAM(u16 RGB_Code);   

void LCD_Scan_Dir(u8 dir); //设置屏扫描方向

void LCD_Display_Dir(u8 dir); //设置屏幕显示方向

void LCD_Set_Window(u16 sx,u16 sy,u16 width,u16 height); //设置窗口

 

//写数据函数

#define LCD_WR_DATA(data){\

LCD_RS_SET;\

LCD_CS_CLR;\

DATAOUT(data);\

LCD_WR_CLR;\

LCD_WR_SET;\

LCD_CS_SET;\

 

//LCD分辨率设置

#define SSD_HOR_RESOLUTION 800 //LCD水平分辨率

#define SSD_VER_RESOLUTION 480 //LCD垂直分辨率

//LCD驱动参数设置

#define SSD_HOR_PULSE_WIDTH 1 //水平脉宽

#define SSD_HOR_BACK_PORCH 46 //水平前廊

#define SSD_HOR_FRONT_PORCH 210 //水平后廊

 

#define SSD_VER_PULSE_WIDTH 1 //垂直脉宽

#define SSD_VER_BACK_PORCH 23 //垂直前廊

#define SSD_VER_FRONT_PORCH 22 //垂直前廊

//如下几个参数,自动计算

#define SSD_HT (SSD_HOR_RESOLUTION+SSD_HOR_BACK_PORCH+SSD_HOR_FRONT_PORCH)

#define SSD_HPS (SSD_HOR_BACK_PORCH)

#define SSD_VT (SSD_VER_RESOLUTION+SSD_VER_BACK_PORCH+SSD_VER_FRONT_PORCH)

#define SSD_VPS (SSD_VER_BACK_PORCH)

   

#endif



#include "led.h"

#include "delay.h"

#include "sys.h"

#include "usart.h"

#include "lcd.h"

 

//ALIENTEK Mini STM32开发板范例代码11

//TFTLCD显示实验   

//技术支持:www.openedv.com

//广州市星翼电子科技有限公司 

 int main(void)

 { 

u8 x=0;

u8 lcd_id[12]; //存放LCD ID字符串

delay_init();     //延时函数初始化   

uart_init(9600); //串口初始化为9600

LED_Init();   //初始化与LED连接的硬件接口

  LCD_Init();

POINT_COLOR=RED; 

sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);//将LCD ID打印到lcd_id数组。

  while(1) 

{  

switch(x)

{

case 0:LCD_Clear(WHITE);break;

case 1:LCD_Clear(BLACK);break;

case 2:LCD_Clear(BLUE);break;

case 3:LCD_Clear(RED);break;

case 4:LCD_Clear(MAGENTA);break;

case 5:LCD_Clear(GREEN);break;

case 6:LCD_Clear(CYAN);break;

 

case 7:LCD_Clear(YELLOW);break;

case 8:LCD_Clear(BRRED);break;

case 9:LCD_Clear(GRAY);break;

case 10:LCD_Clear(LGRAY);break;

case 11:LCD_Clear(BROWN);break;

}

POINT_COLOR=RED;   

LCD_ShowString(30,40,200,24,24,"Mini STM32 ^_^");

LCD_ShowString(30,70,200,16,16,"TFTLCD TEST");

LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");

  LCD_ShowString(30,110,200,16,16,lcd_id); //显示LCD ID        

LCD_ShowString(30,130,200,12,12,"2014/3/7");

        LCD_ShowString(30,150,200,18,12,"YYYYYYYYYYYYYYY");

    x++;

if(x==12)x=0;

LED0=!LED0;  

delay_ms(1000);

}


关键字:stm32  LCD显示 引用地址:stm32学习笔记(十一)LCD显示

上一篇:stm32学习笔记(十二)ADC实验
下一篇:stm32学习笔记(十)输入捕获实验

推荐阅读最新更新时间:2024-03-16 16:21

基于STM32从零写操作系统系列---使用C语言
目的 C语言,相对于汇编有更好的可读性,便于维护等优点。下面实验将使用C语言实现点亮LED灯。C语言与硬件是紧密连在一起的,结合芯片中的flash和sram,简单了解C语言。 要求 1.有一定的C语言基础 2.了解编译链接脚本 3.了解stm32F103的硬件结构 实验源代码在这下载,代码中有详细注释! 分析 1.首先了解硬件,如图 FLASH,就是存放.bin文件的地方。SRAM,用于存放程序的堆栈,全局变量。 2.了解链接脚本,如图: MEMORY,用于定义存储器范围。 AT rom,表示将对应的SECTION放置到rom中,即Flash中。 _data_start / _data_end,用
[单片机]
基于<font color='red'>STM32</font>从零写操作系统系列---使用C语言
STM32学习之传感器篇——DHT11温湿度传感器
1、DHT11传感器简介 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式存在OTP内存中,传感器内部在检测型号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,使其成为该类应用甚至最为苛刻的应用场合的最佳选择。产品为4针单排引脚封装,连接方便。
[单片机]
<font color='red'>STM32</font>学习之传感器篇——DHT11温湿度传感器
STM32的IIC库函数使用误区
HAL库里有很多的IIC的库函数,比如 HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout) HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout) HAL_I2C_Master_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t
[单片机]
<font color='red'>STM32</font>的IIC库函数使用误区
STM32高级定时器那些事
首先说下我使用飞、高级定时器的一些坑爹经历,由于开始高级定时器使用不当,造成有如下问题: 1、PWM输出占空比反向(这个也还能接受点) 2、程序烧进去了就不能烧第二次了,下载时候提示如下图(这个够坑爹的了) 错误而提示 仔细看提示信息说是CPU一直在复位,解决的方法是通过出厂IAP用串口擦除芯片程序。需要准备的工作是:USB转串口工具、把BOOT0拉高、使用ISPMCU擦除芯片。 3、从外部flash读取出来的图片不能够正常显示,屏幕显示的是黑色,后来发现是因为SPI1的I/O与TIM8的N通道冲突了。(由此我下决心要找到问题的原因) 通过一番搜寻和查看相关资料,发现造成上述原因是因为我对高级定时器初始化的时候漏掉了部分成员
[单片机]
<font color='red'>STM32</font>高级定时器那些事
stm32局部变量过大,导致栈溢出
在做一个以stm32为主控的项目时发现自己程序中一个机构体里面的数据总是一运行就被改变,刚开始以为是自己不小心在哪个地方用了extern扩展了变量的作用域,重新赋了值, 自己忘记了,后来查找了好久都没有其他地方使用这个结构体变量,于是开始单步调试,结果进入一个函数的时候(里面定义了一个200个数据float型的数组),发现只要定了一个这个数组,这时前文提到的那个结构的值就发生改变,通过在keil软件中的Memory窗口查看结构体的变量可以清楚看到结构体的地址里面的数据在这个时候发生改变, 然后修改,这个局部变量数组的大小,把它改小之后,就没有发生问题。因为局部变量是储存在栈中的,于是猜想,这种问题应该是stm32的栈的内存的溢出造
[单片机]
<font color='red'>stm32</font>局部变量过大,导致栈溢出
MAX3232芯片与stm32芯片通信硬件线路连接和引脚说明
1、硬件连接图 STM32芯片的任意一个串口与上图中的232_RX和232_TX连接,上图中的RS232_TXD和RS232_RXD连接一个9针串口硬件。 2、引脚功能说明 DOUT1(14PIN): RS232线数据输出(到远程RS232系统) RIN1(13PIN): RS232线路数据输入(来自远程RS232系统) ROUT1(23PIN): 逻辑数据输出(至UART) DIN1(11PIN): 逻辑数据输入(来自UART)
[单片机]
MAX3232芯片与<font color='red'>stm32</font>芯片通信硬件线路连接和引脚说明
C语言 STM32 求绝对值函数
  函数名: abs   功 能: 求整数的绝对值   头文件:math.h   函数原型:int abs(int i);   程序例:   #include stdio.h   #include math.h   int main(void)   {   int number = -1234;   printf( number: %d absolute value: %d\n , number, abs(number));   return 0;   }   在C语言中还有fabs,也是求绝对值的,不同的是,fabs函数参数与返回值为实型。 ////////////////////////////////
[单片机]
STMCU应用过程中与电源相关的案例分享
我们在从事STM32单片机的应用开发及调试过程中,往往会碰到各类异常。其中有不少比例的问题跟电源有关。对于一个电子产品而言,电源部分很关键、很重要,但在实际开发调试中,我们偶尔会有意无意的忽视它。这里分享几个实际案例,以加强刺激,加深印象。 毕竟因为电源问题可能导致的异常很多很多,这里分享几个案例算是抛砖引玉,希望大家在调试中对电源方面加以重视。个人认为,往往电源出问题时导致的异常时并不太好分析。多数时候异常表现得更为诡异或没章法。 注:下面提到的案例中异常原因都与电源有关,但并不是说出现类似异常时一定是电源的原因。 下面主要分享五个基于STM32应用的案例。 案例1:STM32芯片的PLL无法正常工作。 有人使用STM3
[单片机]
STMCU应用过程中与电源相关的案例分享
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved