OpenVINOTM,给你看得见的未来!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » [一起来编程,分享我的硬件]12864液晶屏

共19条 1/2 1 2 跳转至

[一起来编程,分享我的硬件]12864液晶屏

专家
2014-11-24 20:49:10    评分

一起来编程,分享我的硬件”活动开始啦~~

活动详情参见:http://forum.eepw.com.cn/thread/264486/1

第一期:常用12864液晶屏驱动的编写

本次版主依据自身情况选取了 主控芯片为FG12864A的黄底液晶屏。

其数据手册见附件1

现在版主对底层驱动做了以下简单的架构,欢迎大家来认领自己的函数,一起来编程,分享我的硬件,分享你的作品。

版主的LCD12864.C的文件还有若干个函数没有编写完成,各位亲爱的网友,有木有人想一起将其编写完成。最终此文件能应用于嵌入式系统整体的工程里。当然,项目完结的时候,肯定会嵌入大家的昵称的~~



/**
  ******************************************************************************
  * @file    lcd12864.h
  * @author  Jobs Zheng jobszheng@eepw.com.cn
  * @version 
  * @date    2014-11-23   11:25
  * @brief   本文件为LCD12864.c的头文件
  * @note    fg12864a的驱动文件
  ******************************************************************************
  * @attention
  *
  *

	© COPYRIGHT 2014 jobszheng@eepw.com.cn

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



/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __lcd12864_H
#define __lcd12864_H

#ifdef __cplusplus
 extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include 
#include 

/** @addtogroup STM32_EEPW
  * @{
  */

/** @addtogroup LCD12864
  * @{
  */ 

/** @defgroup LCD12864_Exported_Types
  * @{
  */ 

/**
  * @}
  */ 

/** @defgroup LCD12864_Exported_Constants
  * @{
  */ 
  
#ifndef _ERRORNO_

typedef uint8_t ErrorNo;
#endif
  
/**
  * @brief  LCD12864引脚定义
  *  
  */
  
#define LCD_PIN_DATA          GPIO_Pin_8
#define LCD_PIN_INSTRUCT      GPIO_Pin_8
#define LCD_PIN_READ          GPIO_Pin_9
#define LCD_PIN_WRITE         GPIO_Pin_9
#define LCD_PIN_ENABLE        GPIO_Pin_10
#define LCD_PIN_CS1           GPIO_Pin_11
#define LCD_PIN_CS2           GPIO_Pin_12
#define LCD_PIN_RST           GPIO_Pin_13

#define LCD_PIN_BUSY          GPIO_Pin_7
#define LCD_PIN_DISPLAY       GPIO_Pin_5


//LCD数据位8位并行 PD0..8
#define LCD_PIN_DATABUS       (0x00FF)             

#define LCD_PIN_ALL           (0x1FFF) 
#define LCD_GPIO_PORT         GPIOD
#define LCD_GPIO_CLK          RCC_APB2Periph_GPIOD

/**
  * @}
  */ 

/** @defgroup LCD12864_Exported_Macros
  * @{
  */ 

/**
  * @brief  发送时序宏定义
  *  
  */

#define LCD_DATA_SELECT()     GPIO_SetBits(LCD_GPIO_PORT, LCD_PIN_DATA)
#define LCD_INST_SELECT()     GPIO_ResetBits(LCD_GPIO_PORT, LCD_PIN_INSTRUCT)
#define LCD_READ_SELECT()     GPIO_SetBits(LCD_GPIO_PORT, LCD_PIN_READ)
#define LCD_WRITE_SELECT()    GPIO_ResetBits(LCD_GPIO_PORT, LCD_PIN_WRITE)
#define LCD_ENABLE()          GPIO_SetBits(LCD_GPIO_PORT, LCD_PIN_ENABLE)
#define LCD_DISABLE()         GPIO_ResetBits(LCD_GPIO_PORT, LCD_PIN_ENABLE)
#define LCD_SET_RST()         GPIO_ResetBits(LCD_GPIO_PORT, LCD_PIN_RST)
#define LCD_CLR_RST()         GPIO_SetBits(LCD_GPIO_PORT, LCD_PIN_RST)



/**
  * @brief  LCD12864使用命令字
  *  
  */

#define LCD_CMD_FIRST_LINE    (0xC0)
#define LCD_CMD_PAGE_NUM      (0xB8)
#define LCD_CMD_ROW_NUM       (0x40)
#define LCD_CMD_LCM_ON        (0x3F)
#define LCD_CMD_LCM_OFF       (0x3E)

/**
  * @brief  硬件操作时,右值限定
  *  
  */

#define ROW_MAX         (64)
#define LOOP_MAX        (20)

#define LCD_SELECT_CS_1       (0x01)
#define LCD_SELECT_CS_2       (0x02)
#define LCD_SELECT_CS_ALL     (0x03)

/**
  * @}
  */ 

/** @defgroup LCD12864_Exported_Functions
  * @{
  */



#ifdef __cplusplus
}
#endif

#endif /* __lcd12864 */
/**
  * @}
  */ 

/**
  * @}
  */ 

/**
  * @}
  */ 

/******************* (C) COPYRIGHT 2013 EEPW.com.cn *****END OF FILE****/




/**
  ******************************************************************************
  * @file    lcd12864.c
  * @author  Jobs Zheng jobszheng@eepw.com.cn
  * @version v1.0
  * @date    2014-11-23   12:07
  * @brief   fg12864a的驱动文件
  * @note    
  ******************************************************************************
  * @attention
  *
  *

	© COPYRIGHT 2014 jobszheng@eepw.com.cn

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


/* Includes ------------------------------------------------------------------*/
#include "lcd12864.h"

/** @addtogroup STM32_EEPW
  * @{
  */

/** @defgroup LCD12864 
  * @brief 
  * @{
  */

/** @defgroup LCD12864_Private_TypesDefinitions
  * @{
  */

/**
  * @}
  */

/** @defgroup LCD12864_Private_Defines
  * @{
  */
//#define XXXX    ()  /*!<  */
/**
  * @}
  */

/** @defgroup LCD12864_Private_Macros
  * @{
  */

/**
  * @}
  */

/** @defgroup LCD12864_Private_Variables
  * @{
  */

/**
  * @}
  */

/** @defgroup LCD12864_Private_FunctionPrototypes
  * @{
  */

/**
  * @}
  */

/** @defgroup LCD12864_Private_Functions
  * @{
  */

/**
  * @brief  检查LCD12864现在是否处于空闲状态
  * @param  none
  * @retval true:处于空闲状态
  *         false:处于busy状态
  * @date   2014-11-23
  * @note   
  */

static bool LcdIsIdle(void)
{
  
}

/**
  * @brief  写LCD指令
  * @param  cmd:命令字
  *         cs:半屏芯片片选,cs = 0x01为右半屏;cs = 0x02为左半屏
  * @retval ErrorNo:返回错误代码,没有错误为 0x00
  * @date   2014-11-23
  * @note   
  */

static ErrorNo LCD_WriteCmd(uint8_t cmd, uint8_t cs)
{
  
}

/**
  * @brief  写LCD数据
  * @param  data:8位并行数据
  *         cs:半屏芯片片选,cs = 0x01为右半屏;cs = 0x02为左半屏
  * @retval ErrorNo:返回错误代码,没有错误为 0x00
  * @date   2014-11-23
  * @note   
  */
  
static ErrorNo LCD_WriteData(uint8_t data, uint8_t cs)
{
  
}

/**
  * @brief  设置显示起始行寄存器的内容
  * @param  lineNum:起始行号 0-63
  * @retval ErrorNo:返回错误代码,没有错误为 0x00
  * @date   2014-11-23
  * @note   
  */


ErrorNo LCD_SetFirstLine(uint8_t lineNum)
{
  
}

/**
  * @brief  设置显示指针X方向,即页地址(0-7)
  * @param  page:页地址(0-7)
  * @retval ErrorNo:返回错误代码,没有错误为 0x00
  * @date   2014-11-23
  * @note   
  */

static ErrorNo LCD_SetXDirect(uint8_t page)
{
  
}

/**
  * @brief  设置显示指针Y方向,即列号(0-63)
  * @param  row:列号(0-63)
  * @retval ErrorNo:返回错误代码,没有错误为 0x00
  * @date   2014-11-23
  * @note   
  */

static ErrorNo LCD_SetYDirect(uint8_t row)
{
  
}

/**
  * @brief  设置起始点的X、Y值。当y > 63时,cs2选通,否则cs1选通
  * @param  
  * @retval ErrorNo:返回错误代码,没有错误为 0x00
  * @date   2014-11-23
  * @note   
  */

ErrorNo LCD_SetStartPoint(uint8_t point_x, uint8_t point_y)
{
  
}

/**
  * @brief  将LCD复位
  * @param  
  * @retval None
  * @date   2014-11-23
  * @note   
  */

void LCD_Rst(void)
{
  
}

/**
  * @brief  开启LCD屏幕显示
  * @param  none
  * @retval ErrorNo:返回错误代码,没有错误为 0x00
  * @date   2014-11-23
  * @note   
  */

ErrorNo LCD_On(void)
{
  
}

/**
  * @brief  关闭LCD屏幕显示
  * @param  none
  * @retval ErrorNo:返回错误代码,没有错误为 0x00
  * @date   2014-11-23
  * @note   
  */

ErrorNo LCD_Off(void)
{
  
}

/**
  * @brief  清屏
  * @param  none
  * @retval ErrorNo:返回错误代码,没有错误为 0x00
  * @date   2014-11-23
  * @note   
  */

ErrorNo LCD_ClrScreen(void)
{
  
}

/**
  * @brief  初始化FG12864A液晶屏
  * @param  None
  * @retval None
  * @date   2014-11-23
  * @note   
  */

void LcdInit(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  RCC_APB2PeriphClockCmd(LCD_GPIO_CLK, ENABLE);
  
  GPIO_InitStructure.GPIO_Pin = LCD_PIN_ALL;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(LCD_GPIO_PORT, &GPIO_InitStructure);
  
  LCD_DISABLE();
  LCD_READ_SELECT();
  LCD_DATA_SELECT();
  
  LCD_SET_RST();
  LCD_CLR_RST();
  
}

/**
  * @brief  显示图片,128 x 64 点阵大小
  * @param  *content: 图形数组的首地址
  * @retval ErrorNo:返回错误代码,没有错误为 0x00
  * @date   2014-11-23
  * @note   
  */

ErrorNo DispBmp(uint8_t *content)
{
  
}

/**
  * @}
  */

/**
  * @}
  */

/**
  * @}
  */

/******************* (C) jobszheng@eepw.com.cn*****END OF FILE****/



液晶屏说明书,详见附件

fg12864a.pdf






关键词: 液晶屏     分享     编程     12864    

专家
2014-11-24 20:52:23    评分
2楼

回帖认领函数编写哟~~

认领即送10个论坛积分,编写通过后,再送50积分~~


工程师
2014-11-24 21:11:37    评分
3楼
12864这个函数 我来写吧。虽然以前用的是8051驱动的,这次刚好练练手。

高工
2014-11-24 21:20:04    评分
4楼
51单片机的我有一大堆啊。。。stm32的我这个电脑上不太多,家里电脑不少

专家
2014-11-24 21:24:21    评分
5楼

这个还有另外一个非常重要的特点。

团队配合。


我的基础架构与底层驱动要与我的配件配合。您的硬件驱动可不一定适合我的硬件哟


高工
2014-11-24 21:36:21    评分
6楼
static bool LcdIsIdle(void)
static ErrorNo LCD_WriteCmd(uint8_t cmd, uint8_t cs)
static ErrorNo LCD_WriteData(uint8_t data, uint8_t cs)

 一点一点的来,先领这三个


专家
2014-11-24 22:34:15    评分
7楼

牛呗!~

有水平,这两个函数是其它函数的基础。而其它函数是建立在这三个函数的基础上的。


高工
2014-11-24 23:10:23    评分
8楼
集思广益,共同练就优秀的代码设计风格

工程师
2014-11-24 23:10:38    评分
9楼

先认领这四个函数吧,虽然从来没这样在整体架构下写过,不过我会请教其他人的。

ErrorNo LCD_SetFirstLine(uint8_t lineNum)
static ErrorNo LCD_SetXDirect(uint8_t page)
static ErrorNo LCD_SetYDirect(uint8_t row) 
ErrorNo LCD_SetStartPoint(uint8_t point_x, uint8_t point_y)

 


高工
2014-11-25 12:41:59    评分
10楼


/**
  * @brief  LCD12864数据引脚模式切换
  * @param  m_Input  输入状态
	    m_Output 输出状态
  * @retval ErrorNo:返回错误代码,没有错误为 0x00
  *         
  * @date   2014-11-25
  * @note   
  */
static ErrorNo LcdSelectPinMode(PinModeTypeDef PinMode){
    GPIO_InitTypeDef GPIO_InitStructure;  
    if(PinMode != m_Input && PinMode != m_Output){
	return 1;   
    }
    GPIO_InitStructure.GPIO_Pin = LCD_PIN_DATABUS;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    if(PinMode == m_Input){
       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;     
    }
    else if(PinMode == m_Output){
       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    }	 
    GPIO_Init(LCD_GPIO_PORT, &GPIO_InitStructure);
    return 0;
}


/**
  * @brief  检查LCD12864现在是否处于空闲状态
  * @param  none
  * @retval true:处于空闲状态
  *         false:处于busy状态
  * @date   2014-11-23
  * @note   
  */

static bool LcdIsIdle(void)
{
    uint8_t  BusyCount = 255;
    LCD_READ_SELECT();
    LCD_INST_SELECT();
    LcdSelectPinMode(m_Input);
    LCD_ENABLE();
    while((0 != LCD_READ_BUSY) && (--BusyCount));
    LCD_DISABLE();
    if(0 < BusyCount){
	return true;
    }
    else{
	return false;
    }
}

/**
  * @brief  写LCD指令
  * @param  cmd:命令字
  *         cs:半屏芯片片选,cs = 0x01为右半屏;cs = 0x02为左半屏
  * @retval ErrorNo:返回错误代码,没有错误为 0x00
  * @date   2014-11-23
  * @note   
  */

static ErrorNo LCD_WriteCmd(uint8_t cmd, uint8_t cs)
{
    switch(cs){
      case LCD_SELECT_CS_1: LCD_CS1_SELECT(); LCD_CS2_N_SELECT(); break;
	case LCD_SELECT_CS_2: LCD_CS2_SELECT(); LCD_CS1_N_SELECT(); break;
	case LCD_SELECT_CS_ALL: LCD_CS1_SELECT(); LCD_CS2_SELECT(); break;
	default: break;
    }
    if(false == LcdIsIdle()){
       return 1;
    }
    else if(true == LcdIsIdle()){
       LcdSelectPinMode(m_Output);
       GPIO_ResetBits (LCD_GPIO_PORT,LCD_PIN_DATABUS);
       GPIO_SetBits(LCD_GPIO_PORT,cmd);
       LCD_INST_SELECT();
       LCD_WRITE_SELECT();
       LCD_ENABLE();
       LCD_DISABLE();
       return 0;
    }	
    return 1;			
}

/**
  * @brief  写LCD数据
  * @param  data:8位并行数据
  *         cs:半屏芯片片选,cs = 0x01为右半屏;cs = 0x02为左半屏
  * @retval ErrorNo:返回错误代码,没有错误为 0x00
  * @date   2014-11-23
  * @note   
  */
  
static ErrorNo LCD_WriteData(uint8_t data, uint8_t cs)
{
    switch(cs){
      case LCD_SELECT_CS_1: LCD_CS1_SELECT(); LCD_CS2_N_SELECT(); break;
	case LCD_SELECT_CS_2: LCD_CS2_SELECT(); LCD_CS1_N_SELECT(); break;
	case LCD_SELECT_CS_ALL: LCD_CS1_SELECT(); LCD_CS2_SELECT(); break;
	default: break;
    }
   if(false == LcdIsIdle()){
       return 1;
    }
    else if(true == LcdIsIdle()){
       LcdSelectPinMode(m_Output);
       GPIO_ResetBits (LCD_GPIO_PORT,LCD_PIN_DATABUS);
       GPIO_SetBits(LCD_GPIO_PORT,data);
       LCD_DATA_SELECT();
       LCD_WRITE_SELECT();
       LCD_ENABLE();
       LCD_DISABLE();
       return 0;
    }	 
    return 1;		
}



自己添加了一个数据脚输入输出模式选择的函数。在h文件里添加了下面这些东西


#ifndef _PinModeTypeDef

typedef enum{  
		m_Input,
		m_Output
}PinModeTypeDef;

#endif

#define LCD_CS1_SELECT()      GPIO_SetBits(LCD_GPIO_PORT, LCD_PIN_CS1)
#define LCD_CS1_N_SELECT()    GPIO_ResetBits(LCD_GPIO_PORT, LCD_PIN_CS1)

#define LCD_CS2_SELECT()      GPIO_SetBits(LCD_GPIO_PORT, LCD_PIN_CS2)
#define LCD_CS2_N_SELECT()    GPIO_ResetBits(LCD_GPIO_PORT, LCD_PIN_CS2)

#define LCD_READ_BUSY         GPIO_ReadInputDataBit(LCD_GPIO_PORT,LCD_PIN_BUSY)



程序没有调试!!!


共19条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]