stm32 系列ili9341lcd屏驱动程序

发布者:TranquilGaze最新更新时间:2024-07-29 来源: cnblogs关键字:stm32  系列  驱动程序 手机看文章 扫描二维码
随时随地手机看文章

C文件


#define _LCD_ODEV_C_


#include 'LCD_odev.h'

#include 'fonts.h'    //ASCII×Ö·ûÐÍ×Ö¿â


void LCD_Delay(unsigned short int i)

{

    while(i--);

}


void LCD_wt8bitData(unsigned char da) //·¢ËÍÊý¾Ý-8λ²ÎÊý

{    

    LCD_CS_en();

  LCD_DC_data();

    SPI1_ReadWriteByte(da);  

    LCD_CS_dis();

}


void LCD_wt16bitData(unsigned short int da)

{        

        LCD_CS_en();

    LCD_DC_data();

        SPI1_ReadWriteByte(da>>8);

    SPI1_ReadWriteByte(da&0xFF);

        LCD_CS_dis();

}


void LCD_wtREG(unsigned char cmd) 

{        

    LCD_CS_en();

  LCD_DC_reg();

    SPI1_ReadWriteByte(cmd);

    LCD_CS_dis();

}


void LCD_wtREG_DATA(unsigned char reg,unsigned short int da)

{

  LCD_wtREG(reg);

    LCD_wt16bitData(da);

}


unsigned char LCD_Read_Data(void)

{

    LCD_CS_en();

    LCD_DC_data();

    //´Ë´¦½ûÖ¹disbaleµôCS½Å£¬CS½Å±ØÐëһֱʹÄÜ£¬·ñÔò¶ÁÈ¡µÄÊý¾ÝÈ«ÊÇ0xff

    return SPI1_ReadWriteByte(0xFF);

}


void     ILI9341_io_Init() // ÆäËûÒý½Å³õʼ»¯ 

{

        GPIO_InitTypeDef GPIO_InitStructure;

        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB ,  ENABLE);

        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA ,  ENABLE);

    

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;

        GPIO_Init(GPIOA, &GPIO_InitStructure);

    

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;

        GPIO_Init(GPIOB, &GPIO_InitStructure);

}

 

// -------------------------------

void LCD_odev_init(void)

{

    ILI9341_io_Init();


    lcddev.width = LCD_Wide;

    lcddev.height = LCD_High;

    

    LCD_RST_Clr();

    delay_ms(20);

    LCD_RST_Set();

    delay_ms(20);

    //LCD_BLK_Set();

    

    //************* Start Initial Sequence **********// 

    LCD_wtREG(0xCF);  

    LCD_wt8bitData(0x00); 

    LCD_wt8bitData(0xD9); 

    LCD_wt8bitData(0X30); 

     

    LCD_wtREG(0xED);  

    LCD_wt8bitData(0x64); 

    LCD_wt8bitData(0x03); 

    LCD_wt8bitData(0X12); 

    LCD_wt8bitData(0X81); 

     

    LCD_wtREG(0xE8);  

    LCD_wt8bitData(0x85); 

    LCD_wt8bitData(0x10); 

    LCD_wt8bitData(0x78); 

     

    LCD_wtREG(0xCB);  

    LCD_wt8bitData(0x39); 

    LCD_wt8bitData(0x2C); 

    LCD_wt8bitData(0x00); 

    LCD_wt8bitData(0x34); 

    LCD_wt8bitData(0x02); 

     

    LCD_wtREG(0xF7);  

    LCD_wt8bitData(0x20); 

     

    LCD_wtREG(0xEA);  

    LCD_wt8bitData(0x00); 

    LCD_wt8bitData(0x00); 

     

    LCD_wtREG(0xC0);    //Power control 

    LCD_wt8bitData(0x21);   //VRH[5:0] 

     

    LCD_wtREG(0xC1);    //Power control 

    LCD_wt8bitData(0x12);   //SAP[2:0];BT[3:0] 

     

    LCD_wtREG(0xC5);    //VCM control 

    LCD_wt8bitData(0x32); 

    LCD_wt8bitData(0x3C); 

     

    LCD_wtREG(0xC7);    //VCM control2 

    LCD_wt8bitData(0XC1); 

     

    LCD_wtREG(0x36);    // Memory Access Control 

    LCD_wt8bitData(0x68); 


    LCD_wtREG(0x2A);         //ÐеØÖ·ÉèÖÃ

    LCD_wt8bitData(0x00);

    LCD_wt8bitData(0x00);

    LCD_wt8bitData(0x01);

    LCD_wt8bitData(0x3f);

    

    LCD_wtREG(0x2B);         //ÁеØÖ·ÉèÖÃ

    LCD_wt8bitData(0x00);

    LCD_wt8bitData(0x00);

    LCD_wt8bitData(0x00);

    LCD_wt8bitData(0xef);     

     

    LCD_wtREG(0x3A);   

    LCD_wt8bitData(0x55); 


    LCD_wtREG(0xB1);   

    LCD_wt8bitData(0x00);   

    LCD_wt8bitData(0x18); 

     

    LCD_wtREG(0xB6);    // Display Function Control 

    LCD_wt8bitData(0x0A); 

    LCD_wt8bitData(0xA2); 

     

    LCD_wtREG(0xF2);    // 3Gamma Function Disable 

    LCD_wt8bitData(0x00); 

     

    LCD_wtREG(0x26);    //Gamma curve selected 

    LCD_wt8bitData(0x01); 

     

    LCD_wtREG(0xE0);    //Set Gamma 

    LCD_wt8bitData(0x0F); 

    LCD_wt8bitData(0x20); 

    LCD_wt8bitData(0x1E); 

    LCD_wt8bitData(0x09); 

    LCD_wt8bitData(0x12); 

    LCD_wt8bitData(0x0B); 

    LCD_wt8bitData(0x50); 

    LCD_wt8bitData(0XBA); 

    LCD_wt8bitData(0x44); 

    LCD_wt8bitData(0x09); 

    LCD_wt8bitData(0x14); 

    LCD_wt8bitData(0x05); 

    LCD_wt8bitData(0x23); 

    LCD_wt8bitData(0x21); 

    LCD_wt8bitData(0x00); 

     

    LCD_wtREG(0XE1);    //Set Gamma 

    LCD_wt8bitData(0x00); 

    LCD_wt8bitData(0x19); 

    LCD_wt8bitData(0x19); 

    LCD_wt8bitData(0x00); 

    LCD_wt8bitData(0x12); 

    LCD_wt8bitData(0x07); 

    LCD_wt8bitData(0x2D); 

    LCD_wt8bitData(0x28); 

    LCD_wt8bitData(0x3F); 

    LCD_wt8bitData(0x02); 

    LCD_wt8bitData(0x0A); 

    LCD_wt8bitData(0x08); 

    LCD_wt8bitData(0x25); 

    LCD_wt8bitData(0x2D); 

    LCD_wt8bitData(0x0F); 

 

    LCD_wtREG(0x11);    //Exit Sleep 

    delay_ms(120); 

    LCD_wtREG(0x29);    //Display on 

    

    lcddev.bled = BLEDoff;

     


unsigned short int LCD_Read_Point(unsigned short int cx,unsigned short int cy)

{

    unsigned char r=0,g=0,b=0;

    LCD_set_windows(cx,cy,cx,cy);

    LCD_wtREG(0x2E);

    

    LCD_Read_Data();        //Ö»ÐèÒªÖ´ÐÐÒ»´Î¿Õ¶ÁÈ¡

    r = LCD_Read_Data();

    g = LCD_Read_Data();

    b = LCD_Read_Data();

    

    LCD_wtREG(0x2C);        //¹Ø¼ü²½Ö裬±ØÐëÒªÓÐ


    return (((r>>3)<<11)|((g>>2)<<5)|(b>>3));

}



void LCD_restar(void)        //Èí¼þ¸´Î»Ö¸Áî²»ÄÜÔÚÍ˳ö˯ÃßÐòÁÐʱ·¢ËÍ

{

    LCD_wtREG(0x01);

    delay_ms(250);

}


void LCD_inSleep(void)

{

    LCD_wtREG(0x28);        //display TURNOFF

    delay_ms(50);

    LCD_wtREG(0x10);        //sleep ENABLE

    LCD_BLK_Clr();

}


void LCD_outSleep(void)

{

    LCD_wtREG(0x11);        //sleep DISABLE

    delay_ms(50);

    LCD_wtREG(0x29);        //display TURNON

    LCD_BLK_Set();

}


unsigned char LCD_onDisp(void)

{

    LCD_wtREG(0x29);        //display TURNON

    return BLEDon;

}


unsigned char LCD_offDisp(void)

{

    LCD_wtREG(0x28);        //display TURNOFF

    return BLEDoff;

}



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

*** º¯Êý¹¦ÄÜ£ºÇóÏÔʾµÄµãÕóÃæ»ý

*** Èë¿Ú²ÎÊý£ºm:ºá×ø±ê

***           n:×Ý×ø±ê

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

//m^nº¯Êý

//·µ»ØÖµ:m^n´Î·½.

unsigned long LCD_Pow(unsigned char m,unsigned char n)

{

    unsigned long result=1;     

    while(n--)result*=m;    

    return result;

}


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

*** º¯Êý¹¦ÄÜ£ºÉèÖùâ±êλÖ㬼´ÉèÖÃÏÔʾµÄÆðʼ×ø±ê

*** Èë¿Ú²ÎÊý£ºXpos:ºá×ø±ê

***           Ypos:×Ý×ø±ê

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

void LCD_SetCursor(unsigned short int Xpos, unsigned short int Ypos)

{

    LCD_wtREG_DATA(Xreg ,Xpos);    

    LCD_wtREG_DATA(Yreg ,Ypos);

}



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

*** º¯Êý¹¦ÄÜ£ºÉèÖÃÏÔʾ´°¿Ú£¬¼´´´½¨Ò»¸öÏÔʾ´°¿Ú

*** Èë¿Ú²ÎÊý£ºx1,y1-->Æðʼ×ø±ê

***          x2,y2-->ÖÕµã×ø±ê

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

void LCD_set_windows(unsigned short int x1,unsigned short int y1,unsigned short int x2,unsigned short int y2)

    LCD_wtREG(0x2a);

    LCD_wt16bitData(x1);

    LCD_wt16bitData(x2);


    LCD_wtREG(0x2b);

    LCD_wt16bitData(y1);

    LCD_wt16bitData(y2);


    LCD_wtREG(0x2C);                                              

[1] [2] [3] [4] [5]
关键字:stm32  系列  驱动程序 引用地址:stm32 系列ili9341lcd屏驱动程序

上一篇:LDC1000在STM32的程序 LDC1000的STM32驱动源程序
下一篇:STM32F072标准库spi操作细节

推荐阅读最新更新时间:2024-11-13 13:54

STM32固件库中assert_param的作用——学习笔记
在学习stm32库函数过程中,笔者遇到大量的assert_param语句。经查明,assert_param的作用就是用来判断传递给函数的参数是否是有效值。 以下是从固件库中复制粘贴的: void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState) { /* Check the parameters */ assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph)); assert_param(IS_FUNCTIONAL_STATE(NewState)); if (NewState !=
[单片机]
STM32 uCos的移植问题
中断优先级分组的设置: 从ucos官网下载的例程,经过验证查看该例程并未进行优先级的分组设置。如果AIRCR【10:8】是0的话说明为未设置中断分组,而采用的默认即按照中断向量号来进行中断排序。 STM32的分组 只能是: #define NVIC_PriorityGroup_0 ((u32)0x700) /* 0 bits for pre-emption priority 4 bits for subpriority */ #define NVIC_PriorityGroup_1 ((u32)0x600) /* 1 bits for pre-emption priority 3 bits for su
[单片机]
LPC2000系列ARM启动代码(startup部分)
;定义堆栈的大小 SVC_STACK_LEGTH EQU 0 FIQ_STACK_LEGTH EQU 0 IRQ_STACK_LEGTH EQU 256 ABT_STACK_LEGTH EQU 0 UND_STACK_LEGTH EQU 0 NoInt EQU 0x80 ;禁止IRQ中断 NoFIQ EQU 0x40 ;禁止FIQ中断 USR32Mode EQU 0x10 ;ARM的各种工作模式 SVC32Mode EQU 0x13 SYS32Mode EQU 0x1f
[单片机]
STM32单片机的ISP一键下载
ISP就是In System Programming在线系统编程,最常用的就是通过单片机的串口将程序HEX文件下载到内部FLASH中,单片机重启时就执行内部FLASH中的程序。根据STM32的数据手册,STM32的启动方式和BOOT引脚有关 MCUISP软件是STM32单片机ISP下载程序的软件,就像我们用STC单片机ISP下载程序时通过STCISP软件一样,下载程序时的步骤都是类似的,无非就是选择好串口和波特率,加载HEX文件,选择附加选项后再烧录程序即可。 ISP普通烧录 根据上表所示,我们用STM32的串口下载程序的步骤为: 1.电脑通过USB线连接STM32的串口(因为在STM32开发板上已经设计了USB转串口电路,常
[单片机]
“看门狗“VS“打狗棒”,谁胜谁负?(STM32篇)—MCU抗干扰实验系列专题(3)
在上两期文章和视频中,为了公平起见,所有的MCU使用的是同一个工程程序,(不同的MCU,时钟和GPIO的配置略有不同,使用宏定义区分MCU),除了使用滴答时钟和基本GPIO操作外,没有任何抗干扰手段,全靠MCU内部自身的抗干扰能力进行的测试。结果,只有芯源CW32MCU没有彻底死机外,其它均有死机现象。 这种死机现象,在我们实际开发产品时,是禁止发生的。为了对付这种干扰,除了硬件上有些技术对策,那软件上又有些什么呢? 当然是我们最熟悉的看门狗了。“看门狗”这个神器在“古老的年代”51时期,那是没有的,需要在外面加一个“昂贵”的芯片来实现。当然,现在新时代,所有的ARM MCU基本上都标配了看门狗外设。 看门狗是啥,我们来看一下
[单片机]
“看门狗“VS“打狗棒”,谁胜谁负?(<font color='red'>STM32</font>篇)—MCU抗干扰实验<font color='red'>系列</font>专题(3)
关于在Ubuntu下开发STM32程序printf函数的重映射问题
最近使用STM32CubeMX加Ubuntu18.0来进行STM32相关程序的开发,在使用串口打印的使用出现了如下问题: printf函数按照Keil中的方式进行映射后,在软件仍然无法正常使用Printf函数 使用了__io_putchar() 和 int putc()都无法解决问题 我是使用的时makefile项目来通过命令行进行编译的,在网上查了,并且亲自测试后得出结论,在STM32CubeMX生成的makefile项目文件缺少syscalls.c文件,进一步查询发现这个主要是进行系统调用的。结合其中的函数,在使用int __io_putchar(int ch)进行printf重映射的时候还需加入系统调用的相关函数,如
[单片机]
关于在Ubuntu下开发<font color='red'>STM32</font>程序printf函数的重映射问题
基于STM32平台的μC/OS-II上的μC/GUI移植过程解析
μC/GUI是一种专为嵌入式应用设计的通用图形接口软件。本文详细介绍了μC/GUI的结构框架和基于STM32平台的μC/OS-II上的μC/GUI移植过程,并在此基础上进行图形界面设计;阐述了μC/GUI的窗口管理机制,提出了实现μC/GUI中文小型字库的两种方法并采用存储设备解决了图形显示的闪烁问题。 嵌入式系统的图形用户界面,要求具有占用资源少、性能高、可靠性高、可移植、可配置等特点,μC/GUI就是这样一种专门为嵌入式应用设计的图形用户界面软件。μC/GUI可应用于多任务环境中,同时使用实时操作系统与μC/GUI,既可以发挥优先级的实时性,又能实现良好的人机界面。本文使用Cortex-M3内核的STM32平台,介绍了基于
[单片机]
基于<font color='red'>STM32</font>平台的μC/OS-II上的μC/GUI移植过程解析
【“源”察秋毫系列】柔性可穿戴电子设备材料的导电测试
柔性可穿戴电子设备主要由柔性压阻传感器材料、柔性传感器框架、电极连接、信号采集和处理电路组成。 其中最重要的部分就是对柔性压阻传感器材料的测试,对于用于制造压阻式传感器的材料 , 需要全面评估其电学、机械、动态响应和环境稳定性等多方面性能指标 , 以确保材料能够满足实际应用的需求。 对于柔性材料,其中电学需要测试其导电性能,测试材料的电导率和电阻率,和材料中导电填料的分散性和接触性能,材料的电导率和电阻率决定了传感器的基本电学特性, 影响传感器的灵敏度和响应速度,导电填料的分散性和接触性能决定了材料的整体导电性能。 对于柔性设备,还需要循环测试材料在不同弯曲程度下的输出电压,查看其结果是否为一个稳定值,以此来评价其是否稳定
[工业控制]
【“源”察秋毫<font color='red'>系列</font>】柔性可穿戴电子设备材料的导电测试
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved