我正在尝试为20x2 LCD制作一些自定义字符。我正在使用AtmegaμController来控制4位接口的LCD。 我对LCD的所有命令似乎都运行正常(自定义字符除外)?
我创建角色的代码如下:
/***********************/
// Custom Characters
/***********************/
void LCD_CreateCustomCharacters (void)
{
// make CGRAM data available from MPU and set custom characters in CGRAM 1-5
// make CGRAM data available from MPU and set custom characters in CGRAM 1-5
LCD_cmd (0x40); //starts customization at first CGRAM place
// 0 bar character
LCD_prt (0x00);
LCD_prt (0x00);
LCD_prt (0x00);
LCD_prt (0x00);
LCD_prt (0x00);
LCD_prt (0x00);
LCD_prt (0x00);
LCD_prt (0x00);
// 1 bar character
LCD_prt (0x10);
LCD_prt (0x10);
LCD_prt (0x10);
LCD_prt (0x10);
LCD_prt (0x10);
LCD_prt (0x10);
LCD_prt (0x10);
LCD_prt (0x00);
// 2 bar character
LCD_prt (0x18);
LCD_prt (0x18);
LCD_prt (0x18);
LCD_prt (0x18);
LCD_prt (0x18);
LCD_prt (0x18);
LCD_prt (0x18);
LCD_prt (0x00);
// 3 bar character
LCD_prt (0x1C);
LCD_prt (0x1C);
LCD_prt (0x1C);
LCD_prt (0x1C);
LCD_prt (0x1C);
LCD_prt (0x1C);
LCD_prt (0x1C);
LCD_prt (0x00);
// 4 bar character
LCD_prt (0x1E);
LCD_prt (0x1E);
LCD_prt (0x1E);
LCD_prt (0x1E);
LCD_prt (0x1E);
LCD_prt (0x1E);
LCD_prt (0x1E);
LCD_prt (0x00);
//5 bar character
LCD_prt (0x1F);
LCD_prt (0x1F);
LCD_prt (0x1F);
LCD_prt (0x1F);
LCD_prt (0x1F);
LCD_prt (0x1F);
LCD_prt (0x1F);
LCD_prt (0x00);
LCD_cmd (0x80); //returns to DDRAM
}
^该代码似乎几乎完成了这项工作,但在输出一些字符时仍然出现了问题。在我的显示器上,当我尝试打印0x1时应该是“|”成为“| |”。 其余的角色工作正常。
我尝试使用此命令打印构造的字符:
char customs[6] = {0x5, 0x4, 0x3,0x2,0x1,'\0'};
LCD_string(customs);
代码应该构造5个字符,这些字符应该用作进度条。 但它只打印出一个“||”标志和“|”登录?
你知道我做错了什么吗?如果您需要更多代码或信息,请随时询问! :)
顺便说一句,我写的完整源代码可以在这里找到full source code 我添加了“我得到的错误字符”IMGUR LCD DISP
的图片=============================================== ================================== 编辑:
毕竟,似乎是LCD的初始化问题
答案 0 :(得分:2)
您应该查看初始化例程并验证是否满足所有时序约束以及普通代码。
这些显示可能需要使用相当长的延迟。微控制器可以立即执行单个指令,因此需要精心设计延迟。
显示很有趣,但你必须好好对待它们才能正常运作!
答案 1 :(得分:1)
另一种方法是创建二进制字符。这非常简单,您可以在编码之前手动绘制它;
byte exampleCustomCharacter[8] = {
B10000,
B10000,
B10000,
B10000,
B10000,
B10000,
B10000,
B10000,
};
上面的代码在LCD上只使用一个像素块(因此它是8行高和5行宽),并且将为进度条打印1列宽的部分。 1是电源像素,0是像素关闭。液晶显示屏上的每一列都是一列1。
希望这有点帮助。