
修改了之后的代码:
1、将之前增加的数据脚输入输出模式选择的函数去掉了,换成了宏定义
#define LCD_PIN_DATBUS_OUT() (LCD_GPIO_PORT->CRL = 0X33333333) #define LCD_PIN_DATBUS_IN() (LCD_GPIO_PORT->CRL = 0X88888888)
#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;
}

实际我真心不熟悉这种编程,看了一遍又一遍,数据手册也能看懂,让我按照数据手册上的步骤时序写,我可以写出来,但是合作大家一块写的话,我就不行了,还是比较生疏,只能在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); } }
回复
有奖活动 | |
---|---|
【EEPW电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【我踩过的那些坑】STM32的硬件通讯调试过程的“坑”被打赏50分 | |
【我踩过的那些坑】晶振使用的问题被打赏100分 | |
【我踩过的那些坑】电感选型错误导致的处理器连接不上被打赏50分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏10分 | |
【我踩过的那些坑】DRC使用位置错误导致的问题被打赏100分 | |
我踩过的那些坑之混合OTL功放与落地音箱被打赏50分 | |
汽车电子中巡航控制系统的使用被打赏10分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏100分 | |
分享汽车电子中巡航控制系统知识被打赏10分 | |
分享安全气囊系统的检修注意事项被打赏10分 |