这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 嵌入式开发» 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 跳转至

回复

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