LCD12864多級菜單仿真, 帶實(shí)例源程序和hex文件, 轉(zhuǎn)載分享給需要的人學(xué)習(xí)。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif (148.21 KB, 下載次數(shù): 56)
下載附件
2021-11-16 04:50 上傳
單片機(jī)源程序如下:
- #include <reg52.h>
- #include <asc.h>
- #include <12864.h>
- #include <imag.h>
- #define uchar unsigned char
- #define uint unsigned int
- //菜單的實(shí)現(xiàn)
- /*-------------------------------------------------------------*/
- #define MENU_SIZE 18 //菜單長度
- unsigned char KeyFuncIndex=0; //存放當(dāng)前的菜單索引
- void (*KeyFuncPtr)(); //定義按鍵功能指針
- //定義類型
- typedef struct
- {
- unsigned char KeyStateIndex; //當(dāng)前的狀態(tài)索引號
- unsigned char KeyDownState; //按下向下鍵時(shí)的狀態(tài)索引號
- unsigned char KeyUpState; //按下向上鍵時(shí)的狀態(tài)索引號
- unsigned char KeyEnterState; //按下回車鍵時(shí)的狀態(tài)索引號
- void (*CurrentOperate)(); //當(dāng)前狀態(tài)應(yīng)該執(zhí)行的功能操作
- } StateTab;
- //
- //
- unsigned char code s0[]="MenuTest ";
- unsigned char code s1[]="Contact ";
- unsigned char code s2[]="LineTest ";
- unsigned char code s3[]="RectTest ";
- unsigned char code s4[]="ImagTest ";
- unsigned char code s5[]="Cancel ";
- unsigned char code s6[]="Univercity ";
- unsigned char code s7[]="E-Mail ";
- unsigned char code s8[]="QQ Number ";
- unsigned char code s9[]="Cancel ";
- unsigned char code s10[]=" ";
- /*-------------------------------------------------------------*/
- void Stat0(void)
- {
- en_disp(0,0,16,Asc,s0,0);
- en_disp(2,0,16,Asc,s1,1);
- en_disp(4,0,16,Asc,s10,1);
- en_disp(6,0,16,Asc,s10,1);
- }
- /*-------------------------------------------------------------*/
- void Stat1(void)
- {
- en_disp(0,0,16,Asc,s0,1);
- en_disp(2,0,16,Asc,s1,0);
- en_disp(4,0,16,Asc,s10,1);
- en_disp(6,0,16,Asc,s10,1);
- }
- /*-------------------------------------------------------------*/
- void Stat2(void)
- {
- en_disp(0,0,16,Asc,s2,0);
- en_disp(2,0,16,Asc,s3,1);
- en_disp(4,0,16,Asc,s4,1);
- en_disp(6,0,16,Asc,s5,1);
- }
- /*-------------------------------------------------------------*/
- void Stat3(void)
- {
- en_disp(0,0,16,Asc,s2,1);
- en_disp(2,0,16,Asc,s3,0);
- en_disp(4,0,16,Asc,s4,1);
- en_disp(6,0,16,Asc,s5,1);
- }
- /*-------------------------------------------------------------*/
- void Stat4(void)
- {
- en_disp(0,0,16,Asc,s2,1);
- en_disp(2,0,16,Asc,s3,1);
- en_disp(4,0,16,Asc,s4,0);
- en_disp(6,0,16,Asc,s5,1);
- }
- /*-------------------------------------------------------------*/
- void Stat5(void)
- {
- en_disp(0,0,16,Asc,s2,1);
- en_disp(2,0,16,Asc,s3,1);
- en_disp(4,0,16,Asc,s4,1);
- en_disp(6,0,16,Asc,s5,0);
- }
- /*-------------------------------------------------------------*/
- void Stat6(void)
- {
- en_disp(0,0,16,Asc,s6,0);
- en_disp(2,0,16,Asc,s7,1);
- en_disp(4,0,16,Asc,s8,1);
- en_disp(6,0,16,Asc,s9,1);
- }
- /*-------------------------------------------------------------*/
- void Stat7(void)
- {
- en_disp(0,0,16,Asc,s6,1);
- en_disp(2,0,16,Asc,s7,0);
- en_disp(4,0,16,Asc,s8,1);
- en_disp(6,0,16,Asc,s9,1);
- }
- /*-------------------------------------------------------------*/
- void Stat8(void)
- {
- en_disp(0,0,16,Asc,s6,1);
- en_disp(2,0,16,Asc,s7,1);
- en_disp(4,0,16,Asc,s8,0);
- en_disp(6,0,10,Asc,s9,1);
- }
- /*-------------------------------------------------------------*/
- void Stat9(void)
- {
- en_disp(0,0,16,Asc,s6,1);
- en_disp(2,0,16,Asc,s7,1);
- en_disp(4,0,16,Asc,s8,1);
- en_disp(6,0,16,Asc,s9,0);
- }
- /*-------------------------------------------------------------*/
- void Stat10(void)
- {
- ClearLCD();
- Line(10,10,100,48,1);
- }
- /*-------------------------------------------------------------*/
- void Stat11(void)
- {
- ClearLCD();
- Rect(0,0,127,63,1);
- Rect(10,10,67,43,1);
- }
- /*-------------------------------------------------------------*/
- void Stat12(void)
- {
- // ClearLCD();
- img_disp(1,10,70,56,img2);
- }
- /*-------------------------------------------------------------*/
- void Stat13(void)
- {
- img12864_disp(img);
- }
- /*-------------------------------------------------------------*/
- void Stat14(void)
- {
- en_disp(0,0,16,Asc,s10,1);
- en_disp(2,0,16,Asc,"E-Mail: ",1);
- en_disp(4,0,16,Asc," 111111111 ",1);
- en_disp(6,0,16,Asc," @ ",1);
- }
- /*-------------------------------------------------------------*/
- void Stat15(void)
- {
- en_disp(0,0,16,Asc,s10,1);
- en_disp(2,0,16,Asc,"QQ Number: ",1);
- en_disp(4,0,16,Asc," 1111111 ",1);
- en_disp(6,0,16,Asc,s10,1);
- }
- /*-------------------------------------------------------------*/
- //數(shù)據(jù)結(jié)構(gòu)數(shù)組
- StateTab code KeyTab[MENU_SIZE]=
- {
- {0,1,1,2, (*Stat0)}, //頂層
- {1,0,0,6, (*Stat1)}, //頂層
- {2,3,5,10, (*Stat2)}, //二層
- {3,4,2,11, (*Stat3)}, //二層
- {4,5,3,12, (*Stat4)}, //二層
- {5,2,4,0, (*Stat5)}, //二層
- {6,7,9,13, (*Stat6)}, //二層
- {7,8,6,14, (*Stat7)}, //
- {8,9,7,15, (*Stat8)},
- {9,6,8,1 , (*Stat9)}, //二層
- {10,2,2,2,(*Stat10)}, //三 LineTest
- {11,3,3,3,(*Stat11)}, // RectTest
- {12,4,4,4,(*Stat12)}, // ImgTest
- {13,6,6,6,(*Stat13)}, //三 Univercity
- {14,7,7,7,(*Stat14)}, // E-Mail
- {15,8,8,8,(*Stat15)} // QQ Numeber
- };
- /*-------------------------------------------------------------*/
- void MenuOperate(unsigned char key)
- {
- switch(key)
- {
- case 0x30: //向上的鍵
- {
- KeyFuncIndex=KeyTab[KeyFuncIndex].KeyUpState;
- break;
- }
- case 0x28: //回車鍵
- {
- KeyFuncIndex=KeyTab[KeyFuncIndex].KeyEnterState;
- break;
- }
- case 0x18: //向下的鍵
- {
- KeyFuncIndex=KeyTab[KeyFuncIndex].KeyDownState;
- break;
- }
- //此處添加按鍵錯(cuò)誤代碼
- }
- //下面是執(zhí)行按鍵的操作
- KeyFuncPtr=KeyTab[KeyFuncIndex].CurrentOperate;
- (*KeyFuncPtr)(); //執(zhí)行當(dāng)前的按鍵操作
- } //*/
- /*-------------------------------------------------------------*/
- unsigned char keyscan()
- {
- unsigned char key;
- P2=0xFF;
- key=P2&0x38;
- delayms(8);
- //在這里加去抖動(dòng)
- return key;
- }
- /*--------------------------------------------------------------*/
- void int_0(void) interrupt 0 using 0
- {
- unsigned char key;
- key=keyscan();
- MenuOperate(key);
- }
- /*-------------------------------------------------------------*/
- void main (void)
- {
- LCD12864_init();
- ClearLCD();
- //開中斷
- EX0=1;
- //設(shè)置電平觸發(fā)方式
- IT0=1;
- //開所有中斷
- EA=1;
- //
- MenuOperate(0);
- while(1)
- {
- }
- }
復(fù)制代碼
51hei.png (9.31 KB, 下載次數(shù): 72)
下載附件
2021-11-16 04:52 上傳
注意dsn文件是仿真工程,是用Proteus7.5版本畫的,所以只能用7.5才能正常運(yùn)行,其他版本都不行
LCD12864多級菜單仿真.7z
(49.3 KB, 下載次數(shù): 232)
2021-11-16 04:48 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|