49回答

1收藏

STM32F0 #16进程帖(一)----- LCD12864液晶显示

 

STMCU STMCU 22663 人阅读 | 49 人回复 | 2012-11-01

本帖最后由 Kite 于 2014-5-14 04:13 编辑


       最近各种忙啊,上课、写报告、画板子、还要准备坑爹的期中考试{:soso_e153:},最坑爹的是这分数还占期末成绩20%{:soso_e109:}。。。不过大家都在努力,我也不能闲着。今天就用Discovery调了一下12864液晶。。

       代码是以前写的,直接移植过来了。话说STM32系列的固件库规则都差不多,F0系列和F1系列的程序移植几乎只用改个头文件了。废话少说,先上个图{:soso_e144:},手机抓拍的,光线又不好,也只能拍成这样了{:soso_e143:}


       12864是采用串行双线控制的方法,
电路图如下,RS拉高,PSB拉低,R/W 和 E 在串行控制中分别作为数据线和时钟线
      


       下面是代码。(附上完整工程供下载,由于M0的SysTick与M3的一样,故直接复制粘贴了以前的延时代码,在此对原作者“正点原子”表示感谢{:soso_e121:})

STM32F0工程模板 LCD12864.rar (1.33 MB, 下载次数: 467)


main.c
  1. #include "stm32f0xx.h"
  2. #include "delay.h"
  3. #include "device_init.h"
  4. #include "LCD12864.h"

  5. int main(void)
  6. {
  7.         Device_Init();
  8.         
  9.         LCD12864_Display_Words(0, 0, "Hello, world!");
  10.         LCD12864_Display_Words(1, 0, "www.eeboard.com");
  11.         while(1);
  12. }//end main
复制代码
LCD12864.h
  1. /**
  2.   ******************************************************************************
  3.   * @file    LCD12864.h
  4.   * @author  Kite
  5.   * @version NULL
  6.   * @date    1-August-2012
  7.   * @brief          The LCD12864 header file.
  8.   ******************************************************************************
  9.   */

  10. #ifndef __LCD12864_H
  11. #define        __LCD12864_H

  12. /* Includes ------------------------------------------------------------------*/
  13.         #include "stm32f0xx.h"

  14. #if !defined u8 && !defined u16 && !defined u32
  15.         #define u8                uint8_t
  16.         #define u16                uint16_t
  17.         #define u32                uint32_t
  18. #endif

  19. /* Definitions ---------------------------------------------------------------*/
  20.         //接口输出操作(SID: PC0  SCLK: PC1)
  21.         #define LCD12864_SID_OUT(x)                (x) ? (GPIOC->BSRR |= 1<<0) : (GPIOC->BRR |= 1<<0)
  22.         #define LCD12864_SCLK_OUT(x)        (x) ? (GPIOC->BSRR |= 1<<1) : (GPIOC->BRR |= 1<<1)

  23.         /* Write command or dat select */
  24.         #define WRITE_CMD        0xF8
  25.         #define WRITE_DAT        0xFA

  26. /* Exported functions declared ---------------------------------------------- */
  27. void LCD12864_Init(void);                  //液晶初始化函数
  28. void LCD12864_Clear(void);                                        //液晶清屏
  29. void LCD12864_Display_Words(u8 x, u8 y, u8 *str);        //液晶字符显示函数
  30. void LCD12864_Display_Picture(u8 *pic);                                //液晶图片显示函数

  31. #endif
复制代码

LCD12864.c
  1. /**
  2.   ******************************************************************************
  3.   * @file    LCD12864.c
  4.   * @author  Kite
  5.   * @version NULL
  6.   * @date    1-August-2012
  7.   * @brief          The LCD12864 C file.
  8.   ******************************************************************************
  9.   */

  10. /* Includes ------------------------------------------------------------------*/
  11. #include "LCD12864.h"
  12. #include "delay.h"               

  13. /* Private variables ---------------------------------------------------------*/
  14.         /* 字符显示RAM地址 */
  15.         u8 LCD12864_DDRAM_ADDR[4][8]={
  16.         {0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87},                  //第一行
  17.         {0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97},                //第二行
  18.         {0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F},                //第三行
  19.         {0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F}                //第四行
  20.         };

  21. //delay functions
  22. void delay_12864_ms(u16 xms)
  23. {
  24.         delay_ms(xms);
  25. }

  26. void delay_12864_us(u16 xus)
  27. {
  28.         delay_us(xus);
  29. }

  30. /* Private functions declared ------------------------------------------------*/
  31.         void LCD12864_SendByte(u8 Byte);
  32.         void LCD12864_Write(u8 writeSelect, u8 cmdOrDat);

  33. /* Exported functions ------------------------------------------------------- */
  34.         /**
  35.           * @brief  Initialize the LCD12864.
  36.           * @param  None
  37.           * @retval None
  38.           */
  39.         void LCD12864_Init(void)
  40.         {
  41.                 delay_12864_ms(50);                //等待液晶自检(延时>40ms)
  42.         
  43.                 LCD12864_Write(WRITE_CMD, 0x30);                //功能设定
  44.                 delay_12864_us(150);                //延时>100us
  45.         
  46.                 LCD12864_Write(WRITE_CMD, 0x30);                //功能设定
  47.                 delay_12864_us(40);                //延时>37us
  48.         
  49.                 LCD12864_Write(WRITE_CMD, 0x0C);                //开显示
  50.                 delay_12864_us(150);                //延时>100us
  51.         
  52.                 LCD12864_Write(WRITE_CMD, 0x01);                //清屏
  53.                 delay_12864_ms(15);                //延时>10ms
  54.         
  55.                 LCD12864_Write(WRITE_CMD, 0x06);                //进入设定点,初始化完成
  56.         }

  57.         /**
  58.           * @brief  Clear the screen.
  59.           * @param  None
  60.           * @retval None
  61.           */
  62.         void LCD12864_Clear(void)
  63.         {
  64.                 LCD12864_Write(WRITE_CMD, 0x01);                        //清屏指令
  65.                 delay_12864_ms(2);                                //延时以待液晶稳定【至少1.6ms】
  66.         }

  67.         /**
  68.           * @brief  LCD12864 display words.
  69.           * @param  x: row(0~3)  y: line(0~7)  str: the pointer to words
  70.           * @retval None
  71.           */
  72.         void LCD12864_Display_Words(u8 x, u8 y, u8 *str)
  73.         {
  74.                 LCD12864_Write(WRITE_CMD, LCD12864_DDRAM_ADDR[x][y]);
  75.                 while(*str)
  76.                 {
  77.                         LCD12864_Write(WRITE_DAT, *str);
  78.                         str++;
  79.                 }
  80.         }

  81.         /**
  82.           * @brief  LCD12864 display picture.
  83.           * @param  pic: The pointer to the picture array.
  84.           * @retval None
  85.           */
  86.         void LCD12864_Display_Picture(u8 *pic)
  87.         {
  88.                 u8 x,y,i;
  89.                 LCD12864_Write(WRITE_CMD, 0x34);                //切换到扩充指令
  90.                 LCD12864_Write(WRITE_CMD, 0x34);                //关闭图形显示
  91.                 for(i = 0; i < 9; i = i+8)
  92.                 {
  93.                         for(y=0;y<32;y++)
  94.                         {
  95.                                 for(x=0;x<8;x++)
  96.                                 {
  97.                                         LCD12864_Write(WRITE_CMD, 0x80 + y);                //行地址
  98.                                         LCD12864_Write(WRITE_CMD, 0x80 + x+i);                //列地址
  99.                                         LCD12864_Write(WRITE_DAT, *pic ++);                //写数据 D15-D8
  100.                                         LCD12864_Write(WRITE_DAT, *pic ++);                //写数据 D7-D0
  101.                                 }
  102.                         }
  103.                 }
  104.                 LCD12864_Write(WRITE_CMD, 0x36);//打开图形显示               
  105.                 LCD12864_Write(WRITE_CMD, 0x30);        //切换回基本指令
  106.         }                 


  107. /* Private functions -------------------------------------------------------- */
  108.         /**
  109.           * @brief        Transmit single byte in TWO_WIRE_SERIAL_CONTROL.  
  110.           * @param  Byte: The byte to be written.
  111.           * @retval None
  112.           */  
  113.         void LCD12864_SendByte(u8 Byte)
  114.         {
  115.                 u8 i;
  116.                 for(i = 0; i < 8; i++)
  117.                 {
  118.                         LCD12864_SCLK_OUT(0);                        //时钟线置低
  119.                         LCD12864_SID_OUT(Byte & (0x80>>i));        //将一字节数据送到数据总线
  120.                         LCD12864_SCLK_OUT(1);                        //装载数据
  121.                         LCD12864_SCLK_OUT(0);
  122.                 }
  123.         }

  124.         /**
  125.           * @brief  LCD12864 write command or data.
  126.           * @param  writeSelect: Select to write command or data.
  127.           *   This parameter can be one of the following values:
  128.           *     @arg WRITE_CMD: Select to write command
  129.           *     @arg WRITE_DAT: Select to write data
  130.           * @param  cmdOrDat: The command or data to be written.
  131.           * @retval None
  132.           */  
  133.         void LCD12864_Write(u8 writeSelect, u8 cmdOrDat)
  134.         {
  135.                 delay_12864_ms(1);
  136.                 LCD12864_SendByte(writeSelect);                                //写指令【RW=0,RS=0】
  137.                 LCD12864_SendByte(0xF0 & cmdOrDat);                //写高4位
  138.                 LCD12864_SendByte(0xF0 & cmdOrDat << 4);        //写低4位
  139.         }

复制代码
分享到:
回复

使用道具 举报

回答|共 49 个

倒序浏览

沙发

fengye5340-272571

发表于 2012-11-1 20:24:44 | 只看该作者

顶你一下,以前用并口做的,呵呵,你用串口,这下全家福了
板凳

陈克雄

发表于 2012-11-1 22:42:16 | 只看该作者

fengye5340 发表于 2012-11-1 20:24
顶你一下,以前用并口做的,呵呵,你用串口,这下全家福了

我以前也用过并口,不过串口比较省IO{:soso_e113:}
地板

ming1006

发表于 2012-11-2 00:17:39 | 只看该作者

最坑爹的是这分数还占期末成绩20%
你考的是自控?
5#

陈克雄

发表于 2012-11-2 11:56:58 | 只看该作者

ming1006 发表于 2012-11-2 00:17
你考的是自控?

大学物理{:soso_e136:}
6#

ming1006

发表于 2012-11-2 13:04:14 | 只看该作者

RE: STM32F0 #16进程帖(一)----- LCD12864液晶显示

Kite 发表于 2012-11-2 11:56
大学物理

我当你是我们学校的,最近也要考自控,占20%
7#

噗噗熊

发表于 2012-11-2 13:31:58 | 只看该作者

顶下,人家都快期末考了,你们还要期中考啊
8#

zhanglinOpenHW

发表于 2012-11-2 17:03:30 | 只看该作者

我也想试一下串口液晶!
9#

陈克雄

发表于 2012-11-2 17:11:35 | 只看该作者

ming1006 发表于 2012-11-2 13:04
我当你是我们学校的,最近也要考自控,占20%

哈哈,最近考试比较多啊
10#

陈克雄

发表于 2012-11-2 17:12:39 | 只看该作者

tina 发表于 2012-11-2 13:31
顶下,人家都快期末考了,你们还要期中考啊

没办法,我们学校一向都比较慢热{:soso_e153:}
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条