将自定义字符打印到LCD

时间:2014-06-24 15:53:16

标签: c microcontroller avr electronics lcd

我正在尝试为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的初始化问题

2 个答案:

答案 0 :(得分:2)

您应该查看初始化例程并验证是否满足所有时序约束以及普通代码。

这些显示可能需要使用相当长的延迟。微控制器可以立即执行单个指令,因此需要精心设计延迟。

显示很有趣,但你必须好好对待它们才能正常运作!

答案 1 :(得分:1)

另一种方法是创建二进制字符。这非常简单,您可以在编码之前手动绘制它;

byte exampleCustomCharacter[8] = { B10000, B10000, B10000, B10000, B10000, B10000, B10000, B10000, }; 上面的代码在LCD上只使用一个像素块(因此它是8行高和5行宽),并且将为进度条打印1列宽的部分。 1是电源像素,0是像素关闭。液晶显示屏上的每一列都是一列1。 希望这有点帮助。