找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2017|回复: 7
收起左侧

单片机+LCD1602多菜单没显示求帮助!

[复制链接]
ID:61390 发表于 2020-10-8 10:37 | 显示全部楼层 |阅读模式
我这个是网上下载的
原本编译通不过,我更改了一下,现在,单lcd1602命令是没有问题的,我单独显示一个字符串是能实现的!编译也没问题
但菜单显示没有显示,屏幕上量空的!void ShowMenu(void) 命令没有显示!
IMG_20201008_103445.jpg
直接上单片机程序
  1. #include<reg52.h>   
  2. #include<intrins.h>  

  3. #define uchar unsigned char

  4. unsigned char code digit[10]={"0123456789"};   
  5. unsigned char code tab0[]={"TimeSet"};
  6. unsigned char code tab1[]={"DateSet"};
  7. unsigned char code tab2[]={"AlertSet"};
  8. //unsigned char code tab3[]={"TimeSet"};

  9. sbit RS = P2^5;   
  10. sbit RW = P2^6;
  11. sbit EN = P2^7;

  12. #define DataPort P0              



  13. void DelayUs2x(unsigned char t)
  14. {   
  15. while(--t);
  16. }

  17. void DelayMs(unsigned char t)
  18. {

  19. while(t--)
  20. {

  21.    DelayUs2x(245);
  22.          DelayUs2x(245);
  23. }
  24. }

  25. unsigned char LCD_Wait(void)
  26. {
  27.         RS=0;
  28.         RW=1;        
  29.         _nop_();
  30.         EN=1;        
  31.         _nop_();                                 
  32.         EN=0;
  33.         return DataPort;               
  34. }

  35. void LCD_Write_Com(unsigned char com)
  36. {  
  37.   RS=0;
  38.   RW=0;
  39.         nop_();
  40.   EN=1;
  41.   DataPort= com;
  42.   _nop_();
  43.   EN=0;
  44.   LCD_Wait();
  45. }

  46. void LCD_Write_Data(unsigned char Data)
  47. {
  48.   RS=1;
  49.   RW=0;
  50.          nop_();
  51.   EN=1;
  52.   DataPort= Data;
  53.   _nop_();
  54.   EN=0;
  55. LCD_Wait();
  56. }


  57. void LCD_Clear(void)
  58. {
  59.   LCD_Write_Com(0x01);
  60.   DelayMs(5);
  61. }

  62. void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
  63. {     
  64.   if (y == 0)
  65.           {     
  66.            LCD_Write_Com(0x80 + x);     
  67.           }
  68.   else
  69.           {     
  70.              LCD_Write_Com(0xC0 + x);     
  71.           }        
  72.   while (*s)
  73.           {     
  74.     LCD_Write_Data( *s);     
  75.     s ++;     
  76.           }
  77. }

  78. void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
  79. {     
  80. if (y == 0)
  81.          {     
  82.          LCD_Write_Com(0x80 + x);     
  83.          }   
  84. else
  85.          {     
  86.          LCD_Write_Com(0xC0 + x);     
  87.          }        
  88. LCD_Write_Data( Data);  
  89. }

  90. void LCD_Init(void)
  91. {

  92.    LCD_Write_Com(0x38);  
  93.    DelayMs(5);
  94.    LCD_Write_Com(0x38);
  95.    DelayMs(5);
  96.    LCD_Write_Com(0x38);
  97.    DelayMs(5);
  98.    LCD_Write_Com(0x38);  
  99.    LCD_Write_Com(0x08);   
  100.           DelayMs(5);
  101.    LCD_Write_Com(0x01);   
  102.           DelayMs(5);
  103.    LCD_Write_Com(0x06);   
  104.    DelayMs(5);
  105.    LCD_Write_Com(0x0C);   
  106.           DelayMs(5);
  107. }

  108. #define Null 0
  109. //***********************
  110. //* oˉêyéùÃ÷ *
  111. //***********************/
  112. unsigned char KeyScan(void);
  113. void ShowMenu(void);
  114. void Menu_Change(unsigned char KeyNum);

  115. #define KeyPort P3

  116. //**********************
  117. //* Ŀ¼½á11ì嶨òå *
  118. //**********************/
  119. struct MenuItem
  120. {
  121. unsigned char MenuCount;   
  122. unsigned char *DisplayString;   
  123. void (*Subs)();  
  124. struct MenuItem *ChildrenMenus;
  125. struct MenuItem *ParentMenus;  
  126. };

  127. void NullSubs(void)
  128. {                                          
  129. }                                          


  130. void TimeSet(void)
  131. {
  132.          uchar i;
  133.         i=0;
  134.         LCD_Write_Com(0x02);
  135.         while(tab0[i]!='\0')
  136.         {
  137.                 LCD_Write_Data(tab0[i++]);
  138.                 i++;
  139.         }
  140.         
  141. }

  142. void DateSet(void)
  143. {
  144.         uchar i;
  145.         i=0;
  146.         LCD_Write_Com(0x42);
  147.         while(tab1[i]!='\0')
  148.         {
  149.                 LCD_Write_Data(tab1[i++]);
  150.                 i++;
  151.         }
  152. }

  153. void AlertSet (void)
  154. {
  155.         uchar i;
  156.         i=0;
  157.         LCD_Write_Com(0x02);
  158.         while(tab2[i]!='\0')
  159.         {
  160.                 LCD_Write_Data(tab2[i++]);
  161.                 i++;
  162.         }
  163. }
  164. //------------------------------------------------------------------------------






  165. struct MenuItem TimeMenu[4];
  166. struct MenuItem FlashMenu[5];
  167. struct MenuItem VoiceMenu[5];
  168. struct MenuItem RobotMenu[5];
  169. struct MenuItem MainMenu[5];

  170. struct MenuItem TimeMenu[4]=
  171. {  //MenuCount                 DisplayString                         Subs                                ChildrenMenus                ParentMenus
  172.          {4,                          "1.Time Set",                         TimeSet,                        Null,                                MainMenu},
  173.          {4,                         "2.Date Set",                          DateSet,                        Null,                                MainMenu},
  174.          {4,                         "3.AlertSet",                          AlertSet,                        Null,                                MainMenu},
  175.          {4,                           "4.Back",                                  NullSubs,                        MainMenu,                        MainMenu},
  176. };        

  177. struct MenuItem FlashMenu[5]=
  178. {  //MenuCount                 DisplayString                         Subs                                ChildrenMenus                ParentMenus
  179.          {5,                          "1.Flash Record",                 NullSubs,                        Null,                                MainMenu},
  180.          {5,                         "2.Play",                                   NullSubs,                        Null,                                MainMenu},
  181.          {5,                         "3.Pause",                                   NullSubs,                        Null,                                MainMenu},
  182.          {5,                           "4.Flash Delete",                 NullSubs,                        Null,                                MainMenu},
  183.          {5,                         "5.Back",                                 NullSubs,                        MainMenu,                        MainMenu},
  184. };         

  185. struct MenuItem VoiceMenu[5]=
  186. {  //MenuCount                 DisplayString                         Subs                                ChildrenMenus                ParentMenus
  187.          {5,                          "1.Voice Record"        ,         NullSubs,                        Null,                                MainMenu},
  188.          {5,                         "2.Play",                                   NullSubs,                        Null,                                MainMenu},
  189.          {5,                         "3.Pause",                              NullSubs,                        Null,                                MainMenu},
  190.          {5,                           "4.Voice Delete",                 NullSubs,                        Null,                                MainMenu},
  191.           {5,                         "5.Back",                                 NullSubs,                        MainMenu,                        MainMenu},
  192. };         

  193. struct MenuItem RobotMenu[5]=
  194. {  //MenuCount                 DisplayString                         Subs                                ChildrenMenus                ParentMenus
  195.          {5,                          "1.Turn Left",                          NullSubs,                        Null,                                MainMenu},
  196.          {5,                         "2.Turn Right",                 NullSubs,                        Null,                                MainMenu},
  197.          {5,                         "3.Go Ahead",                          NullSubs,                        Null,                                MainMenu},
  198.          {5,                           "4.Go Back",                          NullSubs,                        Null,                                MainMenu},
  199.          {5,                         "5.Back",                                 NullSubs,                        MainMenu,                        MainMenu},
  200. };         


  201. struct MenuItem MainMenu[5]=
  202. {  //MenuCount                 DisplayString                         Subs                                ChildrenMenus                ParentMenus
  203.          {5,                          "1.Time Set"        ,                 NullSubs,                        TimeMenu,                        Null},
  204.          {5,                         "2.Voice Center",                 NullSubs,                        VoiceMenu,                        Null},
  205.          {5,                         "3.Robot Control",                 NullSubs,                        RobotMenu,                        Null},
  206.          {5,                           "4.Flash Option",                 NullSubs,                        FlashMenu,                        Null},
  207.           {5,                         "5.Back",                                 NullSubs,                        MainMenu,                        MainMenu},
  208. };        
  209. //------------------------------------------------------------------------------


  210. struct MenuItem (*MenuPoint) = MainMenu;
  211. unsigned char DisplayStart = 0;
  212. unsigned char UserChoose = 0;   
  213. unsigned char DisplayPoint = 0;
  214. unsigned MaxItems;     
  215. unsigned char ShowCount=2;   


  216. /***********************
  217. *ÏÔê¾oˉêyÇø *
  218. ***********************/
  219. void ShowMenu(void)
  220. {
  221.           unsigned char n;
  222.          MaxItems = MenuPoint[0].MenuCount;
  223.          DisplayPoint = DisplayStart;
  224.          for(n=0;DisplayPoint<MaxItems&&n<ShowCount;n++)
  225.                  {
  226.                                 if(DisplayPoint==UserChoose)
  227.                                  LCD_Write_String(0,n,"->");
  228.                                  LCD_Write_String(2,n,MenuPoint[DisplayPoint++].DisplayString);
  229.                  
  230.                  }

  231. }


  232. unsigned char KeyScan(void)
  233. {
  234. unsigned char keyvalue;
  235. if(KeyPort!=0xff)
  236.    {
  237.     DelayMs(10);
  238.     if(KeyPort!=0xff)
  239.            {
  240.             keyvalue=KeyPort;
  241.             while(KeyPort!=0xff);
  242.                 switch(keyvalue)
  243.                 {
  244.                  case 0xfe:return 1;break;
  245.                  case 0xfd:return 2;break;
  246.                  case 0xfb:return 3;break;
  247.                  case 0xf7:return 4;break;
  248.                  case 0xef:return 5;break;
  249.                  case 0xdf:return 6;break;
  250.                  case 0xbf:return 7;break;
  251.                  case 0x7f:return 8;break;
  252.                  default:return 0;break;
  253.                 }
  254.           }
  255.    }
  256.    return 0;
  257. }


  258. void Menu_Change(unsigned char KeyNum)
  259. {
  260.                                  
  261.     KeyNum=KeyScan();        
  262.         
  263.         if(KeyNum)
  264.                 {
  265.                    switch(KeyNum)
  266.                    {                    
  267.                                                    case 1:
  268.                                                          UserChoose --;
  269.                                                          if (UserChoose ==255)
  270.                                                          {
  271.                                                                    UserChoose = 0;
  272.                                                          }
  273.                                                          break;
  274.                                                 case 2:
  275.                                                          if (MenuPoint[UserChoose].ParentMenus != Null)
  276.                                                          {
  277.                                                                    MenuPoint = MenuPoint[UserChoose].ParentMenus;
  278.                                                                 UserChoose = 0;
  279.                                                                 DisplayStart = 0;
  280.                                                         }
  281.                                                         break;
  282.                                                 case 3:
  283.                                                          UserChoose ++;
  284.                                                          if (UserChoose == MaxItems)
  285.                                                          {
  286.                                                            UserChoose = MaxItems-1;
  287.                                                          }
  288.                                                          break;
  289.                                                 case 4:
  290.                                                          if (MenuPoint[UserChoose].Subs != NullSubs)
  291.                                                          {
  292.                                                            (*MenuPoint[UserChoose].Subs)();
  293.                                                          }
  294.                                                          else if (MenuPoint[UserChoose].ChildrenMenus != Null)
  295.                                                          {
  296.                                                            MenuPoint = MenuPoint[UserChoose].ChildrenMenus;
  297.                                                            UserChoose = 0;
  298.                                                            DisplayStart = 0;
  299.                                                          }
  300.                                                          break;
  301.                                            case 5:
  302.                                                            MenuPoint = MainMenu;
  303.                                                         UserChoose = 0;
  304.                                                         DisplayStart = 0;
  305.                                                         break;
  306.                                            default:break;
  307.                         }
  308.                         if (UserChoose%ShowCount==0)   
  309.                           DisplayStart = UserChoose;
  310.                         else if(UserChoose==1||UserChoose== 3)
  311.                                         DisplayStart = UserChoose-1;                              
  312.                         LCD_Write_Com(0x01);   
  313.                         DelayMs(5);   
  314.                         ShowMenu();
  315.                 }
  316. }


  317. void main(void)
  318. {  
  319.   LCD_Init();
  320. ShowMenu();
  321. while(1)
  322.    {
  323.                    Menu_Change(KeyScan());
  324.                         }
  325. }
复制代码
回复

使用道具 举报

ID:451718 发表于 2020-10-8 12:54 | 显示全部楼层
直接给一个固定的键盘值试一下。  或者把键盘值在空白位置屏显出来,看看键盘响应对不对。
回复

使用道具 举报

ID:114156 发表于 2020-10-8 14:31 | 显示全部楼层
坐看回复  同样可以学到东西
回复

使用道具 举报

ID:61390 发表于 2020-10-8 15:49 | 显示全部楼层
robinsonlin 发表于 2020-10-8 12:54
直接给一个固定的键盘值试一下。  或者把键盘值在空白位置屏显出来,看看键盘响应对不对。

我试了,键盘是能响应的,但键盘响应显示函数ShowMenu();还是没有反应!屏幕显示空白!
回复

使用道具 举报

ID:641629 发表于 2020-10-8 21:48 | 显示全部楼层
量引脚 看看波形   如果没有示波器   D0-D7用万用表   正常不会是0V或者5V的   
回复

使用道具 举报

ID:61390 发表于 2020-10-8 22:12 来自手机 | 显示全部楼层
liuxuhe 发表于 2020-10-8 21:48
量引脚 看看波形   如果没有示波器   D0-D7用万用表   正常不会是0V或者5V的

D0-D7有输出,因单独写个字符串输出命令是可以显示出来!可能指针数组关系!
回复

使用道具 举报

ID:584814 发表于 2020-10-13 15:39 | 显示全部楼层
一般接线没错的话就是时序不对或指令写误。
先调出显示再调试其他程序。
回复

使用道具 举报

ID:311846 发表于 2020-10-13 16:21 | 显示全部楼层
你不会仿真的话,单独拿出来调试。,while直接空循环,你觉得函数ShowMenu()有问题就调试这个,只初始化相关的,放在while之前或者里面都可以看看有什么效果,参数之类的直接给给定值,如果有问题再进入调试,函数里面看看哪里执行有问题,比如在判断里面放个可以用的显示字符之类的作为提示
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表