这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » [一起来编程,分享我的硬件]12864液晶屏

共19条 2/2 1 2 跳转至
院士
2014-11-25 14:01:44     打赏
11楼
想法很好!编写速度也很快! 不过目测是不通过的。

专家
2014-11-25 14:26:43     打赏
12楼
这个想法很好啊,跟着一起学习。

高工
2014-11-26 14:55:02     打赏
13楼

修改了之后的代码:

1、将之前增加的数据脚输入输出模式选择的函数去掉了,换成了宏定义


#define LCD_PIN_DATBUS_OUT()  (LCD_GPIO_PORT->CRL = 0X33333333)         
#define LCD_PIN_DATBUS_IN()   (LCD_GPIO_PORT->CRL = 0X88888888)                  


2、写数据到液晶数据8个管脚



#define LCD_DATBUS_WRITE(DAT) (LCD_GPIO_PORT->BSRR = (0X00FF0000 | ((DAT) & 0X00FF)))


3、读忙函数:

static bool LcdIsIdle(void)
{
          LCD_PIN_DATBUS_IN();
          LCD_READ_SELECT();
          LCD_INST_SELECT();
          LCD_ENABLE();
          if(1 == LCD_READ_BUSY())
          {
                    LCD_DISABLE();
                    return false;
           }
           
           LCD_DISABLE();
           return true;
}

 


4、写指令函数

static ErrorNo LCD_WriteCmd(uint8_t cmd, uint8_t cs)
{
          uint8_t  BusyDelay = 255;
          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;
         }

        do
        {
                   if(0 == BusyDelay)
                   {
                          return 0x01;
                   }
                   BusyDelay--;
        }while(!(LcdIsIdle()));

        LCD_PIN_DATBUS_OUT();
        LCD_INST_SELECT();
        LCD_WRITE_SELECT();
        LCD_ENABLE();
        LCD_DATBUS_WRITE(cmd);
        LCD_DISABLE();
        return 0X00;	
}

 


5、写数据函数

static ErrorNo LCD_WriteData(uint8_t data, uint8_t cs)
{
          uint8_t  BusyDelay = 255;
          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;
         }

        do
        {
                   if(0 == BusyDelay)
                   {
                          return 0x01;
                   }
                   BusyDelay--;
        }while(!(LcdIsIdle()));

        LCD_PIN_DATBUS_OUT();
        LCD_DATA_SELECT();
        LCD_WRITE_SELECT();
        LCD_ENABLE();
        LCD_DATBUS_WRITE(data);
        LCD_DISABLE();
        return 0X00;	
}

 



工程师
2014-11-26 23:45:57     打赏
14楼
liklon第一步积淀任务完成,下来就是我的了。

工程师
2014-11-27 23:14:23     打赏
15楼

实际我真心不熟悉这种编程,看了一遍又一遍,数据手册也能看懂,让我按照数据手册上的步骤时序写,我可以写出来,但是合作大家一块写的话,我就不行了,还是比较生疏,只能在jobs的程序中改改,实际也没改什么,读的让我能看懂,幸好我接的这四个函数中只调用了liklon一个函数(LCD_WriteCmd),还是比较简单的。虽然最终完成效果可能达不到预期,但是我的收获是读懂了这种写程序的方法,和其他人合作等,希望我继续进步吧。

/*********************************************************************************************************
** Function name:     ErrorNo LCD_SetFirstLine(uint8_t lineNum)
** Descriptions:      设置显示起始行寄存器的内容          
** Input parameters:  lineNum:0-63
** Returned value:    err,无错返回:0x00
*********************************************************************************************************/

ErrorNo LCD_SetFirstLine(uint8_t lineNum)
{
  ErrorNo err;
  lineNum |= CMD_FIRST_LINE;
  err = LCD_WriteCmd(lineNum, CS1 | CS2);
  return err;
}

/*********************************************************************************************************
** Function name:     static ErrorNo LCD_SetXDirect(uint8_t page)
** Descriptions:      设置页地址(X方向),8行一页,模块共64行即8页(0-7)                  
** Input parameters:  uint8_t page 页地址
** Returned value:    无
*********************************************************************************************************/

static ErrorNo LCD_SetXDirect(uint8_t page)
{
  page |= CMD_PAGE_NUM;
  LCD_WriteCmd(page, CS1 | CS2);
}

/*********************************************************************************************************
** Function name:     static ErrorNo LCD_SetYDirect(uint8_t row)
** Descriptions:      设置Y地址(Y方向),即列号(0-63)。
**                    
** Input parameters:  uint8_t row Y地址
** Returned value:    None 无
*********************************************************************************************************/
static ErrorNo LCD_SetYDirect(uint8_t row)
{
  row |= CMD_ROW_NUM;
  LCD_WriteCmd(row, CS1 | CS2);
}

/*********************************************************************************************************
** Function name:     ErrorNo LCD_SetStartPoint(uint8_t point_x, uint8_t point_y)
** Descriptions:      设置起始点的X、Y值。当y > 63时,cs2选通,否则cs1选通                 
** Input parameters:  uint8_t point_x, uint8_t point_y
** Returned value:    None 无
*********************************************************************************************************/

ErrorNo LCD_SetStartPoint(uint8_t point_x, uint8_t point_y)
{
  if(point_y > ROW_MAX)
  {
    point_y = point_y - ROW_MAX - 1;
    LCD_SetXDirect(point_x);
    LCD_SetYDirect(point_y);
  }
  else
  {
    LCD_SetXDirect(point_x);
    LCD_SetYDirect(point_y);
  }
}

 


工程师
2014-11-27 23:15:34     打赏
16楼
接下来去参加学长的婚礼,回来继续。。。

工程师
2014-11-28 08:30:23     打赏
17楼
昨晚做梦竟然都梦见这个程序了。

助工
2014-11-28 17:50:44     打赏
18楼
看来是STM32的高手啊

菜鸟
2016-12-17 15:49:03     打赏
19楼

共19条 2/2 1 2 跳转至

回复

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