独立按键控制 LCD1602 显示不同的谚语

前言

今天我又学到了一句话 “好的开始是成功的一半”

英语就是 “Well Begun Is Half Done”

所以希望能够通过独立按键,来控制LCD1602显示不同的谚语

演示

函数数组的使用

错误用法

void (*sayings)(void)[MAX_SAYING] = {attitude,well_begun};

报错

正确用法

void (*sayings[MAX_SAYING])(void) = {attitude,well_begun};

问题

残留字符

可以看到第二行 “Doneg”

这是因为前面的 “Attitude Is Everything” 的最后一个 g 没有被覆盖掉

原因&解决方法

残留字符是由于 LCD_ShowString 并不会清理前面的字符串

因此我手动添加了一个函数 LCD_Clear

/**
  * @brief  LCD1602清屏函数
  * @param  无
  * @retval 无
  */
void LCD_Clear()
{
	LCD_WriteCommand(0x01);//光标复位,清屏
}

今后每次调用

诡异的index

这两行代码是用于调试的,显示 index 的值

        /*for debug*/
        //LCD_ShowString(1,1,"saying_index=");
         
        LCD_ShowNum(2,15,saying_index,2);

我发现如果把上面的一行注释掉,index 就变成了35 ,很奇怪

如果加上上面的一行,index就是个正常的在 0-SYAING_MAX 之间变化的数

我发现,如果把全局函数指针数组,放到main函数内部,问题就消失了,但是我并不理解原因。希望有人能告诉我。

#include <REGX52.H>
#include <INTRINS.H>
#include "LCD1602.h"

void attitude()
{
    LCD_ShowString(1,1,"Attitude");
    LCD_ShowString(2,3,"Is Everything");
}

void well_begun()
{
    LCD_ShowString(1,1,"Well Begun");
    LCD_ShowString(2,3,"Is Half Done");
}

#define MAX_SAYING 2

void (*sayings[MAX_SAYING])(void) = {attitude, well_begun};

void Delay(unsigned int ms);

void main()
{
    unsigned int saying_index = 0;
    char changed = 0;
    LCD_Init();
    sayings[saying_index]();
    while (1)
    {
           if(0 == P3_1){

            Delay(10);

            while(0 == P3_1){
                //nop
            }
            Delay(10);  
            
            if(saying_index<MAX_SAYING-1)
            {
                saying_index++;
            }else{
                saying_index = 0;
            }
            
            changed = 1;
        }
        else if(0 == P3_0){
            Delay(10);

            while(0 == P3_0){
                //nop
            }
            Delay(10);  
            
            if(saying_index>0)
            {
                saying_index--;
            }else{
                saying_index = MAX_SAYING-1;
            }
            changed = 1;
        }

        if(changed){
            LCD_Clear();
            sayings[saying_index]();
            changed = 0;
        }
        
        /*for debug*/
        LCD_ShowNum(2,1,saying_index,16);
        //LCD_ShowString(1,1,"saying_index=");
        
        //Delay(10);
    }
    

}

完整代码

#include <REGX52.H>
#include <INTRINS.H>
#include "LCD1602.h"

void attitude()
{
    LCD_ShowString(1,1,"Attitude        ");
    LCD_ShowString(2,1,"   Is Everything");
}

void well_begun()
{
    LCD_ShowString(1,1,"Well Begun      ");
    LCD_ShowString(2,1,"    Is Half Done");
}

void nike()
{
    LCD_ShowString(1,1, "   Just Do It   ");
}

void apple()
{
    LCD_ShowString(1,1, "Think           ");
    LCD_ShowString(2,1, "       Different");
}

void kiss()
{
    LCD_ShowString(1,1,"Keep It         ");
    LCD_ShowString(2,1,"  Simple, Stupid");
}

void believe()
{
    LCD_ShowString(1,1,"Believe In      ");
    LCD_ShowString(2,1,"     Your Dreams");
}

#define MAX_SAYING 6


void Delay(unsigned int ms);
 
void main()
{
    unsigned int saying_index = 0;
    char changed = 0;
    void (*sayings[MAX_SAYING])(void) = {attitude, well_begun,nike,apple,kiss,believe};
    LCD_Init();
    sayings[saying_index]();
    Delay(100);
    while (1)
    {
           if(0 == P3_1){

            Delay(10);

            while(0 == P3_1){
                //nop
            }
            Delay(10);  
            
            if(saying_index<MAX_SAYING-1)
            {
                saying_index++;
            }else{
                saying_index = 0;
            }
            
            changed = 1;
        }
        else if(0 == P3_0){
            Delay(10);

            while(0 == P3_0){
                //nop
            }
            Delay(10);  
            
            if(saying_index>0)
            {
                saying_index--;
            }else{
                saying_index = MAX_SAYING-1;
            }
            changed = 1;
        }

        if(changed){
            LCD_Clear();
            sayings[saying_index]();
            changed = 0;
        }
        
        /*for debug
        LCD_ShowNum(2,1,saying_index,16);
        LCD_ShowString(1,1,"saying_index=");
        */
       
    }
    

}

void Delay(unsigned int ms)		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	i = ms*2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
}


posted @ 2025-03-31 00:05  lucky_doog  阅读(45)  评论(0)    收藏  举报