打印
[应用相关]

[stm32] 一个简单的stm32vet6驱动的天马4线SPI-1.77寸LCD彩屏DEMO

[复制链接]
502|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本节主要采用72MHz的stm32尝试刷屏效果
工程结构如下:
注:整个工程最重要的部分在USR中,其它是必须!

使用特权

评论回复
沙发
comparison|  楼主 | 2020-1-5 17:00 | 只看该作者
首先是LCD.c:

1、类似与用nRF51822做的彩屏驱动,这里主要的不同点在于引脚的初始化~

2、同时,为了使刷屏速度更快点,在39~46行将原来的循环拆成了8行命令~

3、没写的地方和基于nRF51的一样,上一篇说的很详细

#include "LCD.h"


void LCD_GPIO_Init()
{
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
   
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;             //口线翻转速度为50MHz
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

////////////////////////////////////////////////////////////////////////////////////
//下面是SPI函数及实现LCD通信基础的写数据和写命令函数
//有了这两个函数就能实现复杂的LCD初始化和GUI了
////////////////////////////////////////////////////////////////////////////////////
/*
SPI Send Data
*/
void SendDataSPI(unsigned char DatByte)
{
//    unsigned char i;
//    for(i = 0; i < 8; i++)
//    {
//        if((dat&0x80)!=0)SDA_SET;
//        else SDA_CLEAR;

//        dat <<= 1;

//        SCL_CLEAR;
//        SCL_SET;
//    }
       int bit;        


    bit = DatByte >> 7; LCD_SCK = 0; LCD_SDA = bit; LCD_SCK = 1;
    bit = DatByte >> 6; LCD_SCK = 0; LCD_SDA = bit; LCD_SCK = 1;
    bit = DatByte >> 5; LCD_SCK = 0; LCD_SDA = bit; LCD_SCK = 1;
    bit = DatByte >> 4; LCD_SCK = 0; LCD_SDA = bit; LCD_SCK = 1;
    bit = DatByte >> 3; LCD_SCK = 0; LCD_SDA = bit; LCD_SCK = 1;
    bit = DatByte >> 2; LCD_SCK = 0; LCD_SDA = bit; LCD_SCK = 1;
    bit = DatByte >> 1; LCD_SCK = 0; LCD_SDA = bit; LCD_SCK = 1;
    bit = DatByte >> 0; LCD_SCK = 0; LCD_SDA = bit; LCD_SCK = 1;
            
}

/*
LCD WRITE COMMAND AND DATA
*/
void WriteComm(unsigned int i)
{ 59 }
void WriteData(unsigned int i)
{ 66 }

/*
写显示数据向屏幕(屏幕显示数据需要2字节)
*/
void WriteDispData(unsigned char DataH, unsigned char DataL)
{ 75 }
////////////////////////////////////////////////////////////////////////////////////

/*
LCD初始化函数
*/
void LCD_Init(void)
{173 }

/*
LCD块写(大量数据修改,相当于擦除)
*/
void BlockWrite(unsigned int Xstart, unsigned int Xend, unsigned int Ystart, unsigned int Yend)
{194 }


/*
LCD显示颜色(颜色已在.h文件中定义)
*/
void DispColor(unsigned int color)
{216 }


/*
写一个点(带颜色)
*/
void WriteOneDot(unsigned int color)
{231 }

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


/*
绘制一个像素点
*/
void PutPixel(unsigned int x, unsigned int y, unsigned int color)
{247 }

/*
绘制一片区域(名字为线,其实可以刷一个面)
*/
void DrawLine(unsigned int Xstart, unsigned int Xend, unsigned int Ystart, unsigned int Yend, unsigned int color)
{265 }

void Delay_ms(u16 time)
{
    u16 i=0;  
    while(time--)
    {
        i=12000;
        while(i--);   
    }
}

使用特权

评论回复
板凳
comparison|  楼主 | 2020-1-5 17:00 | 只看该作者
同样的为了适配stm32,.H文件中宏定义也做了相应调整:

1、蓝色部分引脚高低电平宏定义是根据stm引脚设置特性做的修改~

2、黄色部分是为了使stm32的引脚能够像51单片机一样直接给赋值,如:LCD_CS=0或LCD_CS=1

3、其他部分没变,这就说明了之前我们用宏定义的好处了~

#include "stm32f10x.h"



/*
引脚高低电平宏定义
*/
#define CS_SET        GPIO_SetBits(GPIOA, GPIO_Pin_0)//GPIO_Mode_Out_PP  
#define CS_CLEAR     GPIO_ResetBits(GPIOA, GPIO_Pin_0)//普通推挽输出
#define RS_SET        GPIO_SetBits(GPIOA, GPIO_Pin_1)  
#define RS_CLEAR     GPIO_ResetBits(GPIOA, GPIO_Pin_1)
#define RET_SET        GPIO_SetBits(GPIOA, GPIO_Pin_2)
#define RET_CLEAR     GPIO_ResetBits(GPIOA, GPIO_Pin_2)
#define SCL_SET        GPIO_SetBits(GPIOA, GPIO_Pin_3)//GPIO_Mode_AF_PP
#define SCL_CLEAR     GPIO_ResetBits(GPIOA, GPIO_Pin_3)//复用推挽输出
#define SDA_SET        GPIO_SetBits(GPIOA, GPIO_Pin_4)
#define SDA_CLEAR     GPIO_ResetBits(GPIOA, GPIO_Pin_4)

#define BitBand(Addr, Bit) *((volatile int*)(((int)(Addr) & 0x60000000) + 0x02000000 + (int)(Addr) * 0x20 + (Bit) * 4))
#define LCD_CS          BitBand(&GPIOA->ODR, 0)
#define LCD_RS          BitBand(&GPIOA->ODR, 1)
#define LCD_SDA         BitBand(&GPIOA->ODR, 4)
#define LCD_SCK         BitBand(&GPIOA->ODR, 3)

/*
宏定义等待函数
*/
#define DELAY_MS(n) Delay_ms(n)

//-------------------------------------------------------------
#define ROW  160            //显示的行、列数
#define COL  128


#define BLUE   0xF800         //定义颜色常量
#define GREEN  0x07E0
#define RED    0x001F
#define WHITE  0xFFFF
#define BLACK  0x0000
#define GRAY   0xEF5D         //0x2410
#define GRAY75 0x39E7
#define GRAY50 0x7BEF   
#define GRAY25 0xADB5

void Delay(u16 time);
void Delay_ms(u16 time);
void DrawLine(unsigned int Xstart, unsigned int Xend, unsigned int Ystart, unsigned int Yend, unsigned int color);
void PutPixel(unsigned int x, unsigned int y, unsigned int color);
void WriteOneDot(unsigned int color);
void DispColor(unsigned int color);
void BlockWrite(unsigned int Xstart, unsigned int Xend, unsigned int Ystart, unsigned int Yend);
void LCD_Init(void);
void WriteDispData(unsigned char DataH, unsigned char DataL);
void LCD_GPIO_Init(void);

使用特权

评论回复
地板
comparison|  楼主 | 2020-1-5 17:02 | 只看该作者
这样在main函数中只要简单调用即可:

#include "stm32f10x.h"
#include "LCD.h"


void RCC_Configuration(void);


int main(void)
{
    RCC_Configuration();                   //系统时钟配置
    LCD_GPIO_Init();
//    Delay_ms(5000);
    LCD_Init();
    while (1>0)
    {        
        DispColor(RED);
        Delay_ms(1000);
        DispColor(BLUE);
        Delay_ms(1000);
    }
}

void RCC_Configuration(void)//系统时钟配置为72MHZ
{   
  SystemInit();
}

使用特权

评论回复
5
comparison|  楼主 | 2020-1-5 17:02 | 只看该作者
小结:

从上面视频来看即使改成了STM32,驱动SPI屏幕还是不能实现肉眼分辨不出的刷屏效果

接下来试着采用并口数据传输试试~



本节工程链接:http://pan.baidu.com/s/1gdfkwoz

使用特权

评论回复
6
renzheshengui| | 2020-2-3 11:29 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
7
wakayi| | 2020-2-3 11:33 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
8
wowu| | 2020-2-3 11:46 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
9
xiaoqizi| | 2020-2-3 12:02 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
10
木木guainv| | 2020-2-3 12:22 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
11
磨砂| | 2020-2-3 16:34 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
12
晓伍| | 2020-2-3 16:35 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
13
八层楼| | 2020-2-3 16:36 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

417

帖子

0

粉丝