【问题标题】:How to increment the count in different screens in LCD?如何在 LCD 的不同屏幕中增加计数?
【发布时间】: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,有限状态机。在最简单的形式中,它只不过是一个存储程序“状态”的变量,而一些switchif 在这个状态上决定要做什么。您可以存储显示器的索引和/或显示器上的位置等。
  • 您的 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] 地址为 DDRAM 0x40h
  • 是的,看起来不错。你的lcd_dout() 显然是在写unsigned char。不清楚的是您告诉它要写入的 DDRAM 地址。您可能希望在每次写入之前调用 set_cursor_position() 以将光标移动到要输出字符的位置。否则,如果它一次写入一个以地址开头的全屏,您将需要,例如&amp;temp[0]。请注意您的set_cursor_position() 如何使用col |= 0x40;0x40 添加到位置,如果它是第二行(例如line[1]
  • 您的 lcd_cout() 函数是您的 commond-out 函数,而您的 lcd_dout() 是您的 data-out 函数。 (那些在液晶源本身)。您可以将单个字符写入 DDRAM 地址,或写入指定的编号。字符(只是循环多次调用单字符输出函数增加缓冲区中的位置)或者你可以写一个字符串(只是循环直到字符是'\0' 字符。这一切都是一样的。设置光标位置,然后开始写。你的代码看起来和我的库很像。

标签: c microcontroller


【解决方案1】:

第一

您应该需要一个变量来记录当前使用的 LCD。

否则,8051 无法增加正确 LCD 上的计数。

所以你可能会尝试在void change_screen(void) 中添加一个变量。

第二

在增加计数之前,8051 需要判断您使用的是哪个 LCD。

所以需要在void increment(void)中添加判断

概念如下:

enum{
    LCD1,
    LCD2
}LCD_NUM;

bool SwitchLCD_flag=false;

void change_screen(void)
{
    if (ChangeLCD_button == 1)
    {
        ....
       // When pressed the button, switch the LCD_NUM.
       SwitchLCD_flag = !SwitchLCD_flag;

       switch(SwitchLCD_flag) {
           case 0:  
                  LCD_NUM = LCD1;
                  ...
                  break;
           case 1:
                  LCD_NUM = LCD2;
                  ...
                  break;       
        }
   }
}

第三

目前,8051 知道正在使用哪个 LCD。

所以你可以在判断函数中写增加函数。

概念如下:

void increment(void)
{
    if (Increase_button == 1)           
    {
        switch(LCD_NUM){
            case LCD1:
                LCD1_count++;
                break;
            case LCD2:
                LCD2_count++;
            break;
            ...
        }
    }
    ...
}

并且建议你在编程之前,可以画一个简单的流程图来清晰你的代码结构和各个函数之间的关系。

【讨论】:

  • 如你所建议的方式,我已经尝试如上实现,是否正确?
  • 您的代码不能只是复制我的示例,您应该更改变量名称以适合您的代码,例如:LCD_NUM 尚未在您的代码中定义。你的count 是什么意思?如果要判断使用的是哪个LCD,应该使用count 转换成increment() 来判断。对于increment(),概念是正确的,但是判断LCD部分的代码需要修改。在验证8051 之前,您需要仔细考虑您的代码将如何工作。如果结果不符合您的期望,请找出根本原因。
  • 判断LCD部分代码需要修改。如何使用计数来做出判断?我没听懂。
  • 我已经更新了我的答案,LCD判断概念如上,也许你可以试试,想想流程是否和你的预期一样。
  • 很抱歉,但它没有按预期工作,因为它正在处理 temp 的值和从 temp 值开始递增的值,当屏幕改变并且按下按钮以增加 temp1 时。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多