收藏 分享(赏)

STM32串行驱动12864液晶.doc

上传人:scg750829 文档编号:7233139 上传时间:2019-05-10 格式:DOC 页数:4 大小:113.50KB
下载 相关 举报
STM32串行驱动12864液晶.doc_第1页
第1页 / 共4页
STM32串行驱动12864液晶.doc_第2页
第2页 / 共4页
STM32串行驱动12864液晶.doc_第3页
第3页 / 共4页
STM32串行驱动12864液晶.doc_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

1、自己参考大神们的程序改写的液晶驱动,希望对有需要的人能有帮助#include “stm32f10x.h“static _IO uint32_t TimingDelay;void RCC_Configuration(void);void Delay(_IO uint32_t nTime);#define Line1 0x80/液晶第一行#define Line2 0x90/液晶第二行#define Line3 0x88/液晶第三行#define Line4 0x98/液晶第四行#define LCD_IO GPIOE /我用的是 E.2 E.3 E.4 E.5 E.6#define CS GPI

2、O_Pin_2#define RW GPIO_Pin_3#define CLK GPIO_Pin_4#define PSB GPIO_Pin_5#define RST GPIO_Pin_6#define SET(n) GPIO_SetBits(GPIOE,n) /将对应管脚输出高电平#define RESET(n) GPIO_ResetBits(GPIOE,n)/输出低电平#define CMD (uint32_t)0xf8000000 /串行 写入的是命令要先写入 0xf8#define DATE (uint32_t)0xfa000000 / 串行 写入数据要先写入 0xfavoid LCD

3、_IOinit_OUT() /推挽输出模式 ,管脚配置,不多解释,库函数有GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin =CS|RW|CLK|PSB|RST; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(LCD_IO, void LCD_Write(uint32_t cmd,uint8_t ddata)/LCD 写函数uint32_t tem

4、p=cmd;uint32_t i;RESET(CS); /片选拉低temp|=(uint32_t)(ddataSET(CS); /片选拉高,开始传输数据for(i=0;i24;i+)if(temp /取出最高位,如果是 1,那么 RW 就写 1else RESET(RW); /如果是 0 RW 就写 0SET(CLK);/向液晶写数据 是在下降沿写入的Delay(2);/稍作延时RESET(CLK);/拉低产生下降沿,写入数据temp=temp1;/左移一位 ,写入下一位RESET(CS); /拉低片选,写入数据完毕void Display(uint8_t addr,uint8_t *hz)L

5、CD_Write(CMD,addr);Delay(3);while(*hz!=0)LCD_Write(DATE,*hz);hz+;Delay(3);void LCD_init()/液晶初始化RESET(CS); /拉低片选RESET(PSB);/PSB 拉低,表示是串行,拉高则是并行RESET(RST);/拉低 RSTDelay(100);SET(RST);Delay(40);LCD_Write(CMD,0x30);/8 位数据传输 Delay(40);LCD_Write(CMD,0x0c);/显示开,游标开 Delay(40);LCD_Write(CMD,0x01);/清屏 Delay(40

6、);LCD_Write(CMD,0x06);/进入点设定 AC+1 Delay(40); int main()RCC_Configuration();SysTick_Config(72000); /配置 SYSTICK 时钟节拍为 1ms 一次LCD_IOinit_OUT();LCD_init();while(1)Display(Line1,“你妹“);Display(Line2,“你妹“);Display(Line3,“你妹妹“);Display(Line4,“完事了,哈哈哈哈哈“);void RCC_Configuration(void)SystemInit(); RCC_APB2Peri

7、phClockCmd(RCC_APB2Periph_GPIOE , ENABLE);void Delay(_IO uint32_t nTime) TimingDelay = nTime;while(TimingDelay != 0);void TimingDelay_Decrement(void)if (TimingDelay != 0x00) TimingDelay-;/*temp|=(uint32_t)(ddata重点解释一下这里,从串行时序图中可以看出,发送一个指令需要三个字节,第一个是0xf8 或者 0xfa 这个根据你要发送的是命令还是数据而定,然后发送下一个数据的高四位和第四位,但

8、是数据都是在高四位上面,用 51 的话我们要分三次发送,但是 32 的话一个字节可以是 32 位的/所以我们一次就能完成,这也是为什么下面的 i24 的原因因为最后的 8位没有用,例如:我们发送指令 0x35,则应该是这样 0xf8 然后 0x30 然后 0x50,这个应该很好理解所以看一下上面的语句首先我们 cmd 的值应该为 0xf8000000,这个宏定义有的,这是发送命令然后我们让 cmd=temp;在把 temp 和后面的计算结果做按位或运算.首先看这个(uint32_t)(ddata&(uint8_t)0xf0)16)我们的 ddtate 是 0x35 他和 0xf0 按位与之后/

9、变为 0x30然后左移 16 位变成 0x30 0000;再强制转换为 32 位,就把高位补零变为 0x00 30 0000 再看这句话(uint32_t)(ddata&(uint8_t)0x0f)12)我们的 ddtate 是 0x35 他和 0x0f 按位与/之后变为0x05,左移 12 位 0x05 000 强制转换为 32 位 高位补零 0x000 05 000 /在和前面的相加就是 0x00 30 0000+0x000 05 000=0x0030 5000 然后在和前面的 0xf8000000 按位或变为0xf830 5000 液晶读这个数据的时候是 八位八位的读取 所以在液晶看来 是分四次的0xf8 0x30 0x50 0x00 显然后八位没用 所以我们只取前面的 24 位/应该能看懂了把 结合时序图 还有延时一定要精确大家有看不懂的可以给我留言*/

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报