[stm32] 一个简单的stm32vet6驱动的天马4线SPI-1.77寸LCD彩屏DEMO
书接上文《1、一个简单的nRF51822驱动的天马4线SPI-1.77寸LCD彩屏DEMO》
我们发现用16MHz晶振的nRF51822驱动1.77寸的spi速度达不到要求
本节主要采用72MHz的stm32尝试刷屏效果
效果如下:
工程结构如下:

注:整个工程最重要的部分在USR中,其它是必须!
首先是LCD.c:
1、类似与用nRF51822做的彩屏驱动,这里主要的不同点在于引脚的初始化~
2、同时,为了使刷屏速度更快点,在39~46行将原来的循环拆成了8行命令~
3、没写的地方和基于nRF51的一样,上一篇说的很详细
#include "LCD.h" 4 void LCD_GPIO_Init()
5 {
6 GPIO_InitTypeDef GPIO_InitStructure;
7
8 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
9
10 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
11 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
12 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //口线翻转速度为50MHz
13 GPIO_Init(GPIOA, &GPIO_InitStructure);
14 }
////////////////////////////////////////////////////////////////////////////////////
//下面是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 >> ; LCD_SCK = ; LCD_SDA = bit; LCD_SCK = ;
bit = DatByte >> ; LCD_SCK = ; LCD_SDA = bit; LCD_SCK = ;
bit = DatByte >> ; LCD_SCK = ; LCD_SDA = bit; LCD_SCK = ;
bit = DatByte >> ; LCD_SCK = ; LCD_SDA = bit; LCD_SCK = ;
bit = DatByte >> ; LCD_SCK = ; LCD_SDA = bit; LCD_SCK = ;
bit = DatByte >> ; LCD_SCK = ; LCD_SDA = bit; LCD_SCK = ;
bit = DatByte >> ; LCD_SCK = ; LCD_SDA = bit; LCD_SCK = ;
bit = DatByte >> ; LCD_SCK = ; LCD_SDA = bit; LCD_SCK = ; } /*
LCD WRITE COMMAND AND DATA
*/
void WriteComm(unsigned int i)
{ }
void WriteData(unsigned int i)
{ } /*
写显示数据向屏幕(屏幕显示数据需要2字节)
*/
void WriteDispData(unsigned char DataH, unsigned char DataL)
{ }
//////////////////////////////////////////////////////////////////////////////////// /*
LCD初始化函数
*/
void LCD_Init(void)
{ } /*
LCD块写(大量数据修改,相当于擦除)
*/
void BlockWrite(unsigned int Xstart, unsigned int Xend, unsigned int Ystart, unsigned int Yend)
{ } /*
LCD显示颜色(颜色已在.h文件中定义)
*/
void DispColor(unsigned int color)
{ } /*
写一个点(带颜色)
*/
void WriteOneDot(unsigned int color)
{ } //////////////////////////////////////////////////////////////////////////////////// /*
绘制一个像素点
*/
void PutPixel(unsigned int x, unsigned int y, unsigned int color)
{ } /*
绘制一片区域(名字为线,其实可以刷一个面)
*/
void DrawLine(unsigned int Xstart, unsigned int Xend, unsigned int Ystart, unsigned int Yend, unsigned int color)
{ } void Delay_ms(u16 time)
{
u16 i=;
while(time--)
{
i=;
while(i--);
}
}
同样的为了适配stm32,.H文件中宏定义也做了相应调整:
1、蓝色部分引脚高低电平宏定义是根据stm引脚设置特性做的修改~
2、黄色部分是为了使stm32的引脚能够像51单片机一样直接给赋值,如:LCD_CS=0或LCD_CS=1
3、其他部分没变,这就说明了之前我们用宏定义的好处了~
#include "stm32f10x.h" /*
引脚高低电平宏定义
*/
8 #define CS_SET GPIO_SetBits(GPIOA, GPIO_Pin_0)//GPIO_Mode_Out_PP
9 #define CS_CLEAR GPIO_ResetBits(GPIOA, GPIO_Pin_0)//普通推挽输出
10 #define RS_SET GPIO_SetBits(GPIOA, GPIO_Pin_1)
11 #define RS_CLEAR GPIO_ResetBits(GPIOA, GPIO_Pin_1)
12 #define RET_SET GPIO_SetBits(GPIOA, GPIO_Pin_2)
13 #define RET_CLEAR GPIO_ResetBits(GPIOA, GPIO_Pin_2)
14 #define SCL_SET GPIO_SetBits(GPIOA, GPIO_Pin_3)//GPIO_Mode_AF_PP
15 #define SCL_CLEAR GPIO_ResetBits(GPIOA, GPIO_Pin_3)//复用推挽输出
16 #define SDA_SET GPIO_SetBits(GPIOA, GPIO_Pin_4)
17 #define SDA_CLEAR GPIO_ResetBits(GPIOA, GPIO_Pin_4) 19 #define BitBand(Addr, Bit) *((volatile int*)(((int)(Addr) & 0x60000000) + 0x02000000 + (int)(Addr) * 0x20 + (Bit) * 4))
20 #define LCD_CS BitBand(&GPIOA->ODR, 0)
21 #define LCD_RS BitBand(&GPIOA->ODR, 1)
22 #define LCD_SDA BitBand(&GPIOA->ODR, 4)
23 #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);
这样在main函数中只要简单调用即可:
#include "stm32f10x.h"
#include "LCD.h" void RCC_Configuration(void); int main(void)
{
RCC_Configuration(); //系统时钟配置
11 LCD_GPIO_Init();
12 // Delay_ms(5000);
13 LCD_Init();
while (>)
{
16 DispColor(RED);
Delay_ms();
DispColor(BLUE);
Delay_ms();
}
} void RCC_Configuration(void)//系统时钟配置为72MHZ
{
SystemInit();
}
小结:
从上面视频来看即使改成了STM32,驱动SPI屏幕还是不能实现肉眼分辨不出的刷屏效果
接下来试着采用并口数据传输试试~
本节工程链接:http://pan.baidu.com/s/1gdfkwoz
@beautifulzzzz
2015-11-26 持续更新中~
[stm32] 一个简单的stm32vet6驱动的天马4线SPI-1.77寸LCD彩屏DEMO的更多相关文章
- [stm32] 一个简单的stm32vet6驱动2.4寸240X320的8位并口tft屏DEMO
书接上文: 最近在研究用低速.低RAM的单片机来驱动小LCD或TFT彩屏实现动画效果 首先我用一个16MHz晶振的m0内核的8位单片机nRF51822尝试驱动一个1.77寸的4线SPI屏(128X16 ...
- [nRF51822] 1、一个简单的nRF51822驱动的天马4线SPI-1.77寸LCD彩屏DEMO
最近用nRF51822写了个天马4线SPI的1.77寸LCD彩屏驱动,效果如下: 屏幕的规格资料为:http://pan.baidu.com/s/1gdfkr5L 屏幕的驱动资料为:http://pa ...
- 如何编写一个简单的Linux驱动(二)——设备操作集file_operations
前期知识 如何编写一个简单的Linux驱动(一)--驱动的基本框架 前言 在上一篇文章中,我们学习了驱动的基本框架.这一章,我们会在上一章代码的基础上,继续对驱动的框架进行完善.要下载上一篇文章的全部 ...
- 如何编写一个简单的Linux驱动(二)——完善设备驱动
前期知识 1.如何编写一个简单的Linux驱动(一)——驱动的基本框架 2.如何编写一个简单的Linux驱动(二)——设备操作集file_operations 前言 在上一篇文章中,我们编写设备驱动遇 ...
- 如何编写一个简单的Linux驱动(一)
前言 最近在学习Linux驱动,记录下自己学习的历程. 驱动的基本框架 Linux驱动的基本框架包含两部分,“模块入口.出口的注册”和“模块入口.出口函数的实现”,如下方代码. static int ...
- Linux下GPIO驱动(一) ----一个简单的LED驱动
/******************************* * *杂项设备驱动:miscdevice *majior=10; * * *****************************/ ...
- linux设备驱动归纳总结(五):4.写个简单的LED驱动【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-84693.html linux设备驱动归纳总结(五):4.写个简单的LED驱动 xxxxxxxxxxx ...
- 【Linux开发】linux设备驱动归纳总结(五):4.写个简单的LED驱动
linux设备驱动归纳总结(五):4.写个简单的LED驱动 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...
- Shiro —— 从一个简单的例子开始
一.Shiro是用来做权限的. 二.权限 1.基本概念: (1)安全实体:要保护的数据. (2)权限:是否有能力去操作(查看.修改.删除 )保护的数据. 2.权限的两个特性 (1)权限的继承性:A 包 ...
随机推荐
- jenkins---配置邮件
如果出现以下错误: 553 mail from must equal authorized user 看看管理员邮箱是否配置: 再测试,就能够正常收到邮件了!
- Java中抽象类和接口的区别
转载自:http://dev.yesky.com/436/7581936.shtml 在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种 ...
- sql update多表联合更新
update tabA set PrintTag=c.dp_state from tabA a inner join tabB b on a.Code=b.design inner join tabC ...
- js动态时间
一.在<head></head> 之间写入下面js代码 <script type="text/javascript" language="J ...
- uml大战需求分析阅读笔记01
<<UML大战需求分析>>阅读笔记(1) 刚读了uml大战需求分析的第一二章,读了这些内容之后,令我深有感触.以前学习uml这门课的时候,并没有好好学,那时我认为这门课并没有什 ...
- 51nod 1428 活动安排问题(优先队列)
1428 活动安排问题 首先按照开始时间从小到大排序. 其实只要维护一个结束时间的最小堆,每次比较开始时间和堆中最小时间的大小,如果比它大就放入堆中并且时间就要变成当前任务的结束时间, 否则就要新开一 ...
- 解决php中json_decode的异常JSON_ERROR_CTRL_CHAR
该字符中含了ASCII码ETB控制符,即\x17导致json解析失败 (截图中显示ETB是因为用了Sublime text2) 解决方法如下:去掉0-31的控制符再进行decode $result = ...
- 用户行为数据采集核心思维(APP、web数据采集/埋点)
关于数据采集(也就是所谓的埋点),有很多中形式,或者说方法.所有的数据采集都时围绕一个核心的三个点来做区别的处理. 数据采集核心思维三个点: 1.对象: 要采集谁,一个页面.一个按钮,页面或者按钮,就 ...
- 详解在Visual Studio中使用git版本系统[转]
这篇教程的预期,是希望没有任何版本使用基础的新手也可以掌握,所以细节较多,不当之处,欢迎指正. 一 .安装 git 开发工具 如果要使用 git 进行版本管理,其实使用 git 命令行工具就完全足够了 ...
- MATLAB的crack安装小曲
MATLAB的crack安装小曲 本学期要学数学模型和数值分析,需要用MATLAB,便琢磨着装MATLAB.我同专业的同学会装MATLAB的crack,他是数学协会的理事长,平时爱吹牛,问他一个简单的 ...