c - 将自定义字符打印到 LCD

标签 c microcontroller avr lcd

我正在尝试为 20x2 LCD 制作一些自定义字符。我正在使用 Atmega µController 来控制具有 4 位接口(interface)的 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 个字符,用作进度条。 但它只打印出一个“||”标志和一个“|”签名?

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

顺便说一下,可以找到我编写的完整源代码here . 我添加了一张“我得到的错误字符”的图片 IMGUR LCD DISP

最佳答案

您应该查看您的初始化例程,并验证那里以及正常代码中是否满足所有时序约束。

这些显示可能需要使用相当长的延迟。微 Controller 可以立即执行一条指令,因此您需要精心设计延迟。

显示器很有趣,但您必须善待它们才能正常运行!

关于c - 将自定义字符打印到 LCD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24391150/

相关文章:

c - 为什么 fwrite 写的比我告诉它的要多?

c - "? :"发生了什么?我不知道返回类型

linux - 使用 UART 进行流量控制

c - 嵌入式 C : Converting from uint16_t to float?

C - alignas 没有给出预期的结果

c - 不懂ATmega32定时器延时程序

c - 为什么 avr-gcc 在调用 main() 时费心保存寄存器状态?

c - 具有 & 操作的 uint64_t 变量

c - AVR 按位 C 运算

c++ - C/C++ 中的 C 字符串定义