【发布时间】:2021-11-02 02:32:42
【问题描述】:
我在 LCD 上有 2 个不同的屏幕,与单个 8051 微控制器相连。当按下按钮时,我想增加 LCD 上相同位置 (1,0) 的两个屏幕上的计数。三个按钮用于将光标移动到该位置,另一个用于增加计数,另一个用于更改屏幕。但是当我按下第二个屏幕上的按钮时,它会增加 temp 的值,但我希望增加 temp1 的值。
如何使用同一个按钮增加第二个屏幕计数?
在这里,我将第一个屏幕计数增加为:
#include <stdio.h>
#include <string.h>
#include <stdint.h>
void display_screen1(void);
void display_screen2(void);
void change_screen(void);
void move_cursor(void);
void increment(void);
int set_cursor_position(uint_fast8_t row, uint_fast8_t col);
int temp = '2';
int temp1 = '5';
int first = 1;
int second = 0;
int count = 0;
unsigned char button0 = 0;
unsigned char button1 = 0;
unsigned char button2 = 0;
int set_cursor_position(uint_fast8_t row, uint_fast8_t col)
{
if (row)
{
col |= 0x40;
}
col |= 0x80;
lcd_cout(col);
return 0;
}
void display_screen1(void)
{
lcd_l2(0x80); //position on LCD (1,0)
lcd_dout(temp); //displaying on LCD
}
void display_screen2(void)
{
lcd_l2(0x80);
lcd_dout(temp1);
}
void change_screen(void)
{
if (button0 == 1)
{
if(count == 0) {
count++;
delay_msec(100);
display_screen1();
button0 = 0;
}
else if (count == 1) {
display_screen2();
count = 0;
button0 = 0;
}
}
void move_cursor(void)
{
if (button1 == 1)
{
if (second > 1 && second <= 6)
{
first = 1;
second = second + 1;
if (second > 6)
second = 2;
set_cursor_position(first, second);
}
button1 = 0;
}
}
void increment(void)
{
if (button2 == 1) //if button is pressed
{
temp++;
if (temp > 0x39)
temp = 0x30;
lcd_dout(temp);
}
set_cursor_position(1, 0);
button2 = 0;
}
【问题讨论】:
-
1st,您的源代码不可编译,因为未定义多个函数和变量。 -- 第二,你迫切需要选择一种代码风格并坚持下去,最重要的是缩进。 (我已经为您格式化了您的源代码。)保持源代码格式有助于您查看逻辑错误。 -- 3、了解FSM,有限状态机。在最简单的形式中,它只不过是一个存储程序“状态”的变量,而一些
switch或if在这个状态上决定要做什么。您可以存储显示器的索引和/或显示器上的位置等。 -
您的 LCD 可能使用日立 HD44780 控制器。如果是这样,您将拥有一个 80 字符的 DRAM 缓冲区,用于定义显示的字符。 16x2 或 20x4 显示器的索引有点不同,但缓冲区是相同的。最简单的方法是简单地保留一个
char[80]数组并根据需要更新与屏幕1 和屏幕2 上的位置相对应的索引。您更新的角色当时不必可见。然后您可以简单地将更新后的字符写入屏幕的可见部分,当您移动 LCD 时,第二个屏幕上的更新将绘制。 -
是的,没关系。但这取决于您使用的是 16x2 还是 20x4 显示器。对于 16x2,您的 80 字符缓冲区被拆分
line[0][0-15][16-32][33-40]其中每个[...]是一行的屏幕数据。您的line[1]是相同的,但line[1]的DDRAM 地址以0x40h开头。对于 20x4 显示,您的第一个 80 字符缓冲区执行line[0][0-19]和line[2][20-40]其余部分执行line[1]和line[4]与line[1]地址为 DDRAM0x40h。 -
是的,看起来不错。你的
lcd_dout()显然是在写unsigned char。不清楚的是您告诉它要写入的 DDRAM 地址。您可能希望在每次写入之前调用set_cursor_position()以将光标移动到要输出字符的位置。否则,如果它一次写入一个以地址开头的全屏,您将需要,例如&temp[0]。请注意您的set_cursor_position()如何使用col |= 0x40;将0x40添加到位置,如果它是第二行(例如line[1]) -
您的
lcd_cout()函数是您的commond-out函数,而您的lcd_dout()是您的data-out函数。 (那些在液晶源本身)。您可以将单个字符写入 DDRAM 地址,或写入指定的编号。字符(只是循环多次调用单字符输出函数增加缓冲区中的位置)或者你可以写一个字符串(只是循环直到字符是'\0'字符。这一切都是一样的。设置光标位置,然后开始写。你的代码看起来和我的库很像。
标签: c microcontroller