首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

12864液晶用STM32驱动成功 附程序

12864液晶用STM32驱动成功 附程序

试了两天终于成功了。

我写的这个程序,如果大家要参考移植的话,12864.c这个文件一个字也不用动,所有需要移植的部分我全部写到12864.h文件来了。方便大家查看。

这两天发现几个问题特别需要注意一下。

一。要开启功能复用IO口时钟,我用的是PB口。STM32F10x系列的MCU复位后,PA13/14/15 & PB3/4默认配置为JTAG功能。有时我们为了充分利用MCU I/O口的资源,会把这些端口设置为普通I/O口。所以要关闭
JTAG



二。写液晶指令或者数据的时候要注意,出错的话也是不能显示的。我用宏定义来写。
#define  LCD_WriteData(x)     {LCD12864_GPIO->BSRR = x<<8 & 0xff00;LCD12864_GPIO->BRR = ((~x)<<8) & 0xff00;}
//高8位的数据


三。PB2是BOOT1,这个脚不要用,不然USB线下载不进去。


四。因为液晶要检测忙状态,所以控制的5个引脚我设置成推挽输出模式,但是8个数据引脚PB8~PB15我设置成开漏输出模式。在开漏模式状态下,对输入寄存器的读访问可获得I/O端口状态。PB15为忙状态检测位。


耐心做。没做出来的话之前的付出都白费了。

  • #include "lcd.h"
  • #include "stdlib.h"
  • #include "font.h"
  • #include "delay.h"
  • //画笔颜色,背景颜色
  • u16 POINT_COLOR = 0x0000,BACK_COLOR = 0xFFFF;
  • u16 DeviceCode;
  • #if LCD_FAST_IO==1 //快速IO
  • //写寄存器函数
  • void LCD_WR_REG(u8 data)
  • {
  •         LCD_RS_CLR;//写地址
  •         LCD_CS_CLR;
  •         DATAOUT(data);
  •         LCD_WR_CLR;
  •         LCD_WR_SET;
  •         LCD_CS_SET;
  • }
  • #else//正常IO
  • //写寄存器函数
  • void LCD_WR_REG(u8 data)
  • {
  •         LCD_RS=0;//写地址
  •         LCD_CS=0;
  •         DATAOUT(data);
  •         LCD_WR=0;
  •         LCD_WR=1;
  •         LCD_CS=1;
  • }
  • #endif
  • //写寄存器
  • void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue)
  • {
  •         LCD_WR_REG(LCD_Reg);
  •         LCD_WR_DATA(LCD_RegValue);
  • }
  • //读寄存器
  • u16 LCD_ReadReg(u8 LCD_Reg)
  • {
  •         u16 t;
  •         LCD_WR_REG(LCD_Reg);  //写入要读的寄存器号
  •         GPIOB->CRL=0X88888888; //PB0-7  上拉输入
  •         GPIOB->CRH=0X88888888; //PB8-15 上拉输入
  •         GPIOB->ODR=0XFFFF;    //全部输出高
  • #if LCD_FAST_IO==1 //快速IO
  •         LCD_RS_SET;
  •         LCD_CS_CLR;
  •         //读取数据(读寄存器时,并不需要读2次)
  •         LCD_RD_CLR;
  •         delay_us(5);//FOR 8989,延时5us
  •         LCD_RD_SET;
  •         t=DATAIN;
  •         LCD_CS_SET;
  • #else
  •         LCD_RS=1;
  •         LCD_CS=0;
  •         //读取数据(读寄存器时,并不需要读2次)
  •         LCD_RD=0;
  •         LCD_RD=1;
  •         t=DATAIN;
  •         LCD_CS=1;
  • #endif


返回列表