独立按键控制 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);
}

浙公网安备 33010602011771号