将自定义字符打印到LCD

将自定义字符打印到LCD,c,microcontroller,avr,lcd,C,Microcontroller,Avr,Lcd,我正在尝试为20x2的LCD制作一些自定义字符。我使用一个Atmegaµ控制器来控制带有4位接口的LCD。 我对LCD的所有命令似乎都正常工作(除了自定义字符) 我创建角色的代码如下所示: /***********************/ // Custom Characters /***********************/ void LCD_CreateCustomCharacters (void) { // make CGRAM data available from

我正在尝试为20x2的LCD制作一些自定义字符。我使用一个Atmegaµ控制器来控制带有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个字符,用作进度条。 但它只打印出一个“| |”符号和一个“|”符号

你知道我做错了什么吗?如果您需要更多代码或信息,请随时询问!:)

顺便说一句,我写的完整源代码可以找到。
我已经添加了一张“我得到的字符错误”的图片。

您应该查看您的初始化例程,并验证在那里以及在正常代码中是否满足所有计时限制

这些显示可能需要使用相当长的延迟。微控制器可以在短时间内执行一条指令,因此需要仔细设计延迟


展示很有趣,但你必须善待它们才能正确表演

另一种方法是创建二进制字符。这是非常容易的,你也可以在编码之前用手画出来

字节示例CustomCharacter[8]={
B10000,
B10000,
B10000,
B10000,
B10000,
B10000,
B10000,
B10000,
};
上面的代码只会在LCD上使用一个像素块(因此它有8行高和5行宽),并且会为进度条打印一个1列宽的部分。1为通电像素,0为关闭像素。LCD上的每一列都将是此屏幕上的1列。

希望这能有所帮助。

@abelenky Yep很抱歉,我现在已经修复了,希望能更好。我删除了我最后的评论。。。。很抱歉您发送了要将自定义字符存储到的地址,但是否发送了所有告诉显示器您要写入自定义字符位置的命令?您使用的显示模型是什么?在我使用的方法中,您发送一个写命令,后跟地址,然后是自定义数据。我只看到函数调用的地址和数据。可能您的显示不同。@Radioactived-我不是100%,但调用LCD_cmd(0x40)告诉LCD我们正在进行CGRAM,因此设置LCD_cmd(0x40+8*地址)应该将LCD设置为CGRAM并转到地址的位置?这是8像素宽吗?或者更少。。。如果是8,我们做一个街区。将所有值设置为0xFF,然后查看是否得到块。或者,如果将5像素宽设置为0x1F,等等……当我打印完整块时,它是5像素宽,它会显示所有像素为黑色。唯一的问题似乎是0x10*7,实际上它显示0x10*8是唯一的问题。所有其他角色的底线都是空的。谢谢你的时间,你帮了我很大的忙!