我這個是網(wǎng)上下載的
原本編譯通不過,我更改了一下,現(xiàn)在,單lcd1602命令是沒有問題的,我單獨顯示一個字符串是能實現(xiàn)的!編譯也沒問題
但菜單顯示沒有顯示,屏幕上量空的!void ShowMenu(void) 命令沒有顯示!
IMG_20201008_103445.jpg (1.45 MB, 下載次數(shù): 45)
下載附件
2020-10-8 10:37 上傳
直接上單片機程序
- #include<reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- unsigned char code digit[10]={"0123456789"};
- unsigned char code tab0[]={"TimeSet"};
- unsigned char code tab1[]={"DateSet"};
- unsigned char code tab2[]={"AlertSet"};
- //unsigned char code tab3[]={"TimeSet"};
- sbit RS = P2^5;
- sbit RW = P2^6;
- sbit EN = P2^7;
- #define DataPort P0
- void DelayUs2x(unsigned char t)
- {
- while(--t);
- }
- void DelayMs(unsigned char t)
- {
- while(t--)
- {
- DelayUs2x(245);
- DelayUs2x(245);
- }
- }
- unsigned char LCD_Wait(void)
- {
- RS=0;
- RW=1;
- _nop_();
- EN=1;
- _nop_();
- EN=0;
- return DataPort;
- }
- void LCD_Write_Com(unsigned char com)
- {
- RS=0;
- RW=0;
- nop_();
- EN=1;
- DataPort= com;
- _nop_();
- EN=0;
- LCD_Wait();
- }
- void LCD_Write_Data(unsigned char Data)
- {
- RS=1;
- RW=0;
- nop_();
- EN=1;
- DataPort= Data;
- _nop_();
- EN=0;
- LCD_Wait();
- }
- void LCD_Clear(void)
- {
- LCD_Write_Com(0x01);
- DelayMs(5);
- }
- void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
- {
- if (y == 0)
- {
- LCD_Write_Com(0x80 + x);
- }
- else
- {
- LCD_Write_Com(0xC0 + x);
- }
- while (*s)
- {
- LCD_Write_Data( *s);
- s ++;
- }
- }
- void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
- {
- if (y == 0)
- {
- LCD_Write_Com(0x80 + x);
- }
- else
- {
- LCD_Write_Com(0xC0 + x);
- }
- LCD_Write_Data( Data);
- }
- void LCD_Init(void)
- {
- LCD_Write_Com(0x38);
- DelayMs(5);
- LCD_Write_Com(0x38);
- DelayMs(5);
- LCD_Write_Com(0x38);
- DelayMs(5);
- LCD_Write_Com(0x38);
- LCD_Write_Com(0x08);
- DelayMs(5);
- LCD_Write_Com(0x01);
- DelayMs(5);
- LCD_Write_Com(0x06);
- DelayMs(5);
- LCD_Write_Com(0x0C);
- DelayMs(5);
- }
- #define Null 0
- //***********************
- //* oˉêyéùÃ÷ *
- //***********************/
- unsigned char KeyScan(void);
- void ShowMenu(void);
- void Menu_Change(unsigned char KeyNum);
- #define KeyPort P3
- //**********************
- //* Ŀ¼½á11ì嶨òå *
- //**********************/
- struct MenuItem
- {
- unsigned char MenuCount;
- unsigned char *DisplayString;
- void (*Subs)();
- struct MenuItem *ChildrenMenus;
- struct MenuItem *ParentMenus;
- };
- void NullSubs(void)
- {
- }
- void TimeSet(void)
- {
- uchar i;
- i=0;
- LCD_Write_Com(0x02);
- while(tab0[i]!='\0')
- {
- LCD_Write_Data(tab0[i++]);
- i++;
- }
-
- }
- void DateSet(void)
- {
- uchar i;
- i=0;
- LCD_Write_Com(0x42);
- while(tab1[i]!='\0')
- {
- LCD_Write_Data(tab1[i++]);
- i++;
- }
- }
- void AlertSet (void)
- {
- uchar i;
- i=0;
- LCD_Write_Com(0x02);
- while(tab2[i]!='\0')
- {
- LCD_Write_Data(tab2[i++]);
- i++;
- }
- }
- //------------------------------------------------------------------------------
- struct MenuItem TimeMenu[4];
- struct MenuItem FlashMenu[5];
- struct MenuItem VoiceMenu[5];
- struct MenuItem RobotMenu[5];
- struct MenuItem MainMenu[5];
- struct MenuItem TimeMenu[4]=
- { //MenuCount DisplayString Subs ChildrenMenus ParentMenus
- {4, "1.Time Set", TimeSet, Null, MainMenu},
- {4, "2.Date Set", DateSet, Null, MainMenu},
- {4, "3.AlertSet", AlertSet, Null, MainMenu},
- {4, "4.Back", NullSubs, MainMenu, MainMenu},
- };
- struct MenuItem FlashMenu[5]=
- { //MenuCount DisplayString Subs ChildrenMenus ParentMenus
- {5, "1.Flash Record", NullSubs, Null, MainMenu},
- {5, "2.Play", NullSubs, Null, MainMenu},
- {5, "3.Pause", NullSubs, Null, MainMenu},
- {5, "4.Flash Delete", NullSubs, Null, MainMenu},
- {5, "5.Back", NullSubs, MainMenu, MainMenu},
- };
- struct MenuItem VoiceMenu[5]=
- { //MenuCount DisplayString Subs ChildrenMenus ParentMenus
- {5, "1.Voice Record" , NullSubs, Null, MainMenu},
- {5, "2.Play", NullSubs, Null, MainMenu},
- {5, "3.Pause", NullSubs, Null, MainMenu},
- {5, "4.Voice Delete", NullSubs, Null, MainMenu},
- {5, "5.Back", NullSubs, MainMenu, MainMenu},
- };
- struct MenuItem RobotMenu[5]=
- { //MenuCount DisplayString Subs ChildrenMenus ParentMenus
- {5, "1.Turn Left", NullSubs, Null, MainMenu},
- {5, "2.Turn Right", NullSubs, Null, MainMenu},
- {5, "3.Go Ahead", NullSubs, Null, MainMenu},
- {5, "4.Go Back", NullSubs, Null, MainMenu},
- {5, "5.Back", NullSubs, MainMenu, MainMenu},
- };
- struct MenuItem MainMenu[5]=
- { //MenuCount DisplayString Subs ChildrenMenus ParentMenus
- {5, "1.Time Set" , NullSubs, TimeMenu, Null},
- {5, "2.Voice Center", NullSubs, VoiceMenu, Null},
- {5, "3.Robot Control", NullSubs, RobotMenu, Null},
- {5, "4.Flash Option", NullSubs, FlashMenu, Null},
- {5, "5.Back", NullSubs, MainMenu, MainMenu},
- };
- //------------------------------------------------------------------------------
- struct MenuItem (*MenuPoint) = MainMenu;
- unsigned char DisplayStart = 0;
- unsigned char UserChoose = 0;
- unsigned char DisplayPoint = 0;
- unsigned MaxItems;
- unsigned char ShowCount=2;
- /***********************
- *ÏÔê¾oˉêyÇø *
- ***********************/
- void ShowMenu(void)
- {
- unsigned char n;
- MaxItems = MenuPoint[0].MenuCount;
- DisplayPoint = DisplayStart;
- for(n=0;DisplayPoint<MaxItems&&n<ShowCount;n++)
- {
- if(DisplayPoint==UserChoose)
- LCD_Write_String(0,n,"->");
- LCD_Write_String(2,n,MenuPoint[DisplayPoint++].DisplayString);
-
- }
- }
- unsigned char KeyScan(void)
- {
- unsigned char keyvalue;
- if(KeyPort!=0xff)
- {
- DelayMs(10);
- if(KeyPort!=0xff)
- {
- keyvalue=KeyPort;
- while(KeyPort!=0xff);
- switch(keyvalue)
- {
- case 0xfe:return 1;break;
- case 0xfd:return 2;break;
- case 0xfb:return 3;break;
- case 0xf7:return 4;break;
- case 0xef:return 5;break;
- case 0xdf:return 6;break;
- case 0xbf:return 7;break;
- case 0x7f:return 8;break;
- default:return 0;break;
- }
- }
- }
- return 0;
- }
- void Menu_Change(unsigned char KeyNum)
- {
-
- KeyNum=KeyScan();
-
- if(KeyNum)
- {
- switch(KeyNum)
- {
- case 1:
- UserChoose --;
- if (UserChoose ==255)
- {
- UserChoose = 0;
- }
- break;
- case 2:
- if (MenuPoint[UserChoose].ParentMenus != Null)
- {
- MenuPoint = MenuPoint[UserChoose].ParentMenus;
- UserChoose = 0;
- DisplayStart = 0;
- }
- break;
- case 3:
- UserChoose ++;
- if (UserChoose == MaxItems)
- {
- UserChoose = MaxItems-1;
- }
- break;
- case 4:
- if (MenuPoint[UserChoose].Subs != NullSubs)
- {
- (*MenuPoint[UserChoose].Subs)();
- }
- else if (MenuPoint[UserChoose].ChildrenMenus != Null)
- {
- MenuPoint = MenuPoint[UserChoose].ChildrenMenus;
- UserChoose = 0;
- DisplayStart = 0;
- }
- break;
- case 5:
- MenuPoint = MainMenu;
- UserChoose = 0;
- DisplayStart = 0;
- break;
- default:break;
- }
- if (UserChoose%ShowCount==0)
- DisplayStart = UserChoose;
- else if(UserChoose==1||UserChoose== 3)
- DisplayStart = UserChoose-1;
- LCD_Write_Com(0x01);
- DelayMs(5);
- ShowMenu();
- }
- }
- void main(void)
- {
- LCD_Init();
- ShowMenu();
- while(1)
- {
- Menu_Change(KeyScan());
- }
- }
復制代碼 |