修改了之后的代码:
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网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图四被打赏50分 | |
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 |