找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5454|回复: 1
打印 上一主题 下一主题
收起左侧

LCD多级菜单的实现 单片机源程序

[复制链接]
跳转到指定楼层
楼主
多级菜单:

单片机源程序如下:
  1. //ReadMe
  2. //屏宽:112
  3. //屏高:64
  4. #i nclude <reg51.h>
  5. #i nclude <intrins.h>
  6. #i nclude <absacc.h>
  7. //
  8. typedef struct
  9. {
  10. unsigned int KeyTab_MenuIndex;     //当前状态索引号
  11. unsigned int KeyTab_MaxItems;      //本级菜单最大条目数
  12.     unsigned int KeyTab_PressOk;     //按下"回车"键时转向的状态索引号
  13.     unsigned int KeyTab_PressEsc;    //按下"返回"键时转向的状态索引号
  14.     unsigned int KeyTab_PressDown;     //按下"向下"键时转向的状态索引号
  15.     unsigned int KeyTab_PressUp;     //按下"向上"键时转向的状态索引号
  16. void    (*CurrentOperate)();     //当前状态应该执行的功能操作
  17. }KeyTabStruct;
  18. void    (*KeyFuncPtr)();    //按键功能指针
  19. //
  20. #define S_S   0x80//上      =1000,0000=0x80,
  21. #define S_X   0x40//下      =0100,0000=0x40,
  22. #define S_Z   0x20//左      =0010,0000=0x20,
  23. #define S_Y   0x10//右      =0001,0000=0x10,
  24. #define S_ZS  0xa0//左上    =1010,0000=0xa0,
  25. #define S_ZX  0x60//左下    =0110,0000=0x60,
  26. #define S_YS  0x90//右上    =1001,0000=0x90,
  27. #define S_YX  0x50//右下    =0101,0000=0x50,
  28. #define S_SXZY  0xf0//上下左右=1111,0000=0xf0
  29.   
  30. //
  31. #define KEY_OK 0x11
  32. #define KEY_UP 0x12
  33. #define KEY_ESC 0x13
  34. //
  35. #define KEY_LEFT 0x21
  36. #define KEY_DOWN 0x22
  37. #define KEY_RIGHT 0x23
  38. //
  39. #define KEY_1  0x31
  40. #define KEY_2  0x32
  41. #define KEY_3  0x33
  42. //
  43. #define KEY_4  0x41
  44. #define KEY_5  0x42
  45. #define KEY_6  0x43
  46. //
  47. #define KEY_7  0x51
  48. #define KEY_8  0x52
  49. #define KEY_9  0x53
  50. //
  51. #define KEY_XING 0x61
  52. #define KEY_0  0x62
  53. #define KEY_JING 0x63
  54. //
  55. #define KEY_POWER 0x71
  56. #define KEY_NULL 0x00
  57. //
  58. //
  59. #define MAX_KEYTABSTRUCT_NUM      19
  60. #define MENU_FACE         0
  61. #define MENU_ROOT         1
  62. #define  MENU_VIEW        2
  63. #define   MENU_VIEW_ABOUTRECORDE    3
  64. #define   MENU_VIEW_HANDSETCLOCK    4
  65. #define  MENU_OPERATION       5
  66. #define   MENU_OPERATION_SETPOSITION   6
  67. #define   MENU_OPERATION_READZJTOFLASH  7
  68. #define   MENU_OPERATION_RDZJTORAM   8
  69. #define   MENU_OPERATION_DELGIVENZL   9
  70. #define   MENU_OPERATION_DELALLZJ    10
  71. #define  MENU_TEST        11
  72. #define   MENU_TEST_RAMTEST     12
  73. #define   MENU_TEST_FLASHTEST     13
  74. #define  MENU_SYSTEMSET       14
  75. #define   MENU_SYSTEMSET_DEBUG    15
  76. #define    MENU_SYSTEMSET_DEBUG_PASSWORD 16
  77. #define    MENU_SYSTEMSET_DEBUG_SEEPICTURE 17
  78. #define   MENU_SYSTEMSET_SETHANDCLK   18
  79. //
  80. #define Addr_Key    0xc000 //1100,0000,0000,0000
  81. #define Addr_XRamBegin1  0x0000 //0000,0000,0000,0000//共32K
  82. #define Addr_XRamEnd1    0x3fff //0011,1111,1111,1111
  83. #define Addr_XRamBegin2  0x4000 //0100,0000,0000,0000
  84. #define Addr_XRamEnd2    0x7fff //0111,1111,1111,1111
  85. #define Addr_XFlashBegin 0x9000//1000,0000,0000,0000 16K/每自然扇区
  86. #define Addr_XFlashEnd  0xbfff//1011,1111,1111,1111
  87. #define Addr_XFlashSector 0xc001//1100,0000,0000,0001 4个自然扇区(把FLASH的地址线移到这个口内容的低位)
  88. //Flash可用容量=4*16K=64K
  89. //自然扇区的内容字节范围(0->3)(0000,0000~0000,0011)共4块=64K,硬件上把A18,A17,A16锁住了,不能写)
  90. //能读不能写的扇区号为4-31为(0000,0100~0001,1111)共28块=448K,可以作为菜单位置
  91. //#define Addr_XFlashBegin     0x9000//1000,0000,0000,0000 16K/每自然扇区
  92. //#define Addr_XFlashEnd  0xbfff//1011,1111,1111,1111
  93. //能读能写的FLASH的连续地址如下:
  94. //#define Addr_XFlashBegin 0x0000//共64K
  95. //#define Addr_XFlashEnd   0xffff
  96. //
  97. //操作FLASH地址时,
  98. //1.算出页地址
  99. //2. 对扇区解锁(读扇区不用解锁):(0x5555)=0xaa,(0x2aaa)=0x55,(0x5555)=0xa0;
  100. //3。把高2位移入[Addr_XFlashSector]=0的低2位,
  101. //4。把原来的高2位置0,再或上10B
  102. //5. 然后整个扇区读/写256字节
  103. //片外数组0x0000~0x1fff;
  104. unsigned char xdata Rev232Buffer[256]    _at_  0x0000; //->0x00ff
  105. unsigned char xdata Send232Buffer[256]    _at_  0x0100; //->0x1ff
  106. #define Addr_FlashWriteBuffer1        0x0200 //->0x2ff
  107. #define Addr_FlashWriteBuffer2       0x0300 //->0x3ff
  108. #define Addr_FlashReadBuffer1         0x0400 //->0x4ff
  109. #define Addr_FlashReadBuffer2       0x0500 //->0x5ff
  110. #define Addr_ZjWrRdBuffer          0x0800 //->0xfff
  111. unsigned char xdata clock[12]     _at_  0x1000; //->0x100b
  112. //
  113. unsigned char xdata cGraphByte[8]    _at_  0x100e; //->0x1015
  114. unsigned char xdata * xdata cpGraph    _at_  0x1016; //->0x1017
  115. signed   char xdata cMenuHLight[0x10]   _at_ 0x1018;
  116. KeyTabStruct xdata KeyTab[MAX_KEYTABSTRUCT_NUM] _at_ 0x1028;
  117. unsigned char xdata CxTestByte1     _at_ 0x1145;
  118. //片外单变量0x2000~0x2fff;
  119. //通讯专用
  120. unsigned char xdata cUartTemp1   _at_ 0x2000;
  121. unsigned char xdata cUartTemp2   _at_ 0x2001;
  122. unsigned char xdata cUartTemp3   _at_ 0x2002;
  123. unsigned char xdata cUartFunSn   _at_ 0x2003;
  124. unsigned char xdata cUartDataLenght _at_ 0x2004;
  125. unsigned char xdata cUartAddSum  _at_ 0x2005;
  126. unsigned char xdata cUartXorSum  _at_ 0x2006;
  127. unsigned char xdata iUartTemp1  _at_ 0x2007;
  128. unsigned char xdata iUartTemp2  _at_ 0x2008;
  129. unsigned char xdata iUartTemp3  _at_ 0x2009;
  130. //Flash专用
  131. unsigned char xdata cPageAddr  _at_ 0x2010;
  132. unsigned int  xdata iSectorAddr  _at_ 0x2011;
  133. unsigned int  xdata iFlashToRamAddr _at_ 0x2013;
  134. unsigned int  xdata iRamToFlashAddr _at_ 0x2015;
  135. unsigned char xdata iFlashAddrH  _at_ 0x2017;
  136. unsigned char xdata iFlashAddrM  _at_ 0x2018;
  137. unsigned char xdata iFlashAddrL  _at_ 0x2019;
  138. unsigned char xdata iFlashRdWrNum _at_ 0x201a;
  139. //菜单专用
  140. unsigned char xdata cMenuTemp1  _at_ 0x2020;
  141. unsigned char xdata cMenuTemp2  _at_ 0x2021;
  142. unsigned char xdata cMenuTemp3  _at_ 0x2022;
  143. //
  144. unsigned int  xdata iMenuID   _at_ 0x2023;
  145. unsigned int  xdata iMenuNextID  _at_ 0x2025;
  146. //
  147. //画线专用
  148. unsigned char xdata cLineTemp1  _at_ 0x2030;
  149. unsigned char xdata cLineTemp2  _at_ 0x2031;
  150. unsigned char xdata cLineTemp3  _at_ 0x2032;
  151. unsigned char xdata cLineTemp4  _at_ 0x2033;
  152. unsigned char xdata cLineTemp5  _at_ 0x2034;
  153. unsigned char xdata cLineTemp6  _at_ 0x2035;
  154. unsigned char xdata cLineTemp7  _at_ 0x2036;
  155. unsigned char xdata cLineTemp8  _at_ 0x2037;
  156. unsigned char xdata cLineTemp9  _at_ 0x2038;
  157. unsigned char xdata cLineTemp10  _at_ 0x2039;
  158. unsigned char xdata cLineTemp11  _at_ 0x203a;
  159. unsigned char xdata cLineTemp12  _at_ 0x203b;
  160. unsigned char xdata cLineTemp13  _at_ 0x203c;
  161. //DispTextLine
  162. unsigned char xdata cTextLineTemp1 _at_ 0x203d;
  163. unsigned char xdata cTextLineTemp2 _at_ 0x203e;
  164. unsigned char xdata cTextLineTemp3 _at_ 0x203f;
  165. //图形字符专用
  166. unsigned char xdata cGraphTemp1  _at_ 0x2040;
  167. unsigned char xdata cGraphTemp2  _at_ 0x2041;
  168. unsigned char xdata cGraphTemp3  _at_ 0x2042;
  169. unsigned char xdata cGraphTemp4  _at_ 0x2043;
  170. //主程序用
  171. unsigned char xdata NowKey   _at_ 0x2044;
  172. unsigned char xdata RxPos   _at_ 0x2045;
  173. unsigned char xdata RxStep   _at_ 0x2046;
  174. unsigned char xdata RxPrev   _at_ 0x2047;
  175. unsigned char xdata RxNow   _at_ 0x2048;
  176. unsigned char xdata RxDataLenght _at_ 0x2049;
  177. unsigned char xdata TxPos   _at_ 0x204a;
  178. unsigned char xdata TxNum   _at_ 0x204b;
  179. //中断0用
  180. unsigned char xdata cTemp_ex0  _at_ 0x204c;
  181. //通讯中断用
  182. unsigned int  xdata i_uart   _at_ 0x204d;
  183. //写Flash用
  184. unsigned int  xdata i_FlashWr  _at_ 0x204f;
  185. unsigned char xdata c1_FlashWr  _at_ 0x2051;
  186. //读Flash用
  187. unsigned int  xdata i_FlashRd  _at_ 0x2052;
  188. unsigned char xdata c1_FlashRd  _at_ 0x2054;
  189. //Make05Answe专用
  190. unsigned int  xdata i_Make05Answer   _at_ 0x2055;
  191. unsigned char xdata cAdd_Make05Answer _at_ 0x2057;
  192. unsigned char xdata cXor_Make05Answer _at_ 0x2058;
  193. //读时间用
  194. unsigned char xdata i_RdTime   _at_ 0x2059;
  195. //显示文本行用
  196.     unsigned char xdata col_DispTextLine _at_ 0x205a;
  197. unsigned char code * xdata p_DispTextLine _at_ 0x205b;
  198. //显示开机画面
  199. unsigned char xdata i_FaceBmp   _at_ 0x205d;
  200. unsigned char xdata j_FaceBmp   _at_ 0x205e;
  201. unsigned char xdata k_FaceBmp   _at_ 0x205f;
  202. unsigned char xdata c1_FaceBmp   _at_ 0x2060;
  203. //DisponeTextChar
  204. unsigned char xdata i_DisponeTextChar _at_ 0x2061;
  205. unsigned char xdata j_DisponeTextChar _at_ 0x2062;
  206. unsigned char xdata k_DisponeTextChar _at_ 0x2063;
  207.     unsigned char xdata cTemp_DisponeTextChar _at_ 0x2064;
  208. //键处理程序专用
  209.     unsigned char xdata cKeyTemp1 _at_ 0x2065;
  210. //定时器0专用
  211. unsigned int  xdata iT0_1S   _at_ 0x2066;
  212. unsigned char xdata cClock_Year  _at_ 0x2068;
  213. unsigned char xdata cClock_Month _at_ 0x2069;
  214. unsigned char xdata cClock_Day  _at_ 0x206a;
  215. unsigned char xdata cClock_Hour  _at_ 0x206b;
  216. unsigned char xdata cClock_Minute _at_ 0x206c;
  217. unsigned char xdata cClock_Second _at_ 0x206d;

  218. //cx


  219. //Timer
  220. #define TH0data 0xb8//20ms=0xb800,1ms=0xfc66
  221. #define TL0data 0x00//
  222. //
  223. sbit LCD_CS=P1^0;
  224. sbit LCD_RESET=P1^1;
  225. sbit LCD_A0=P1^5;
  226. sbit LCD_WR=P1^6;
  227. sbit KEYINT=P3^2;
  228. sbit I2C_SCK=P3^4;
  229. sbit I2C_SDA=P3^5;
  230. //
  231. sbit KEYROW1=P1^5;
  232. sbit KEYROW2=P1^6;
  233. sbit KEYROW3=P1^7;
  234. //
  235. unsigned char bdata BitByte0;
  236. sbit bOldOnline=BitByte0^7;
  237. sbit b_ReceiveOver=BitByte0^6;
  238. sbit b_KeyInt=BitByte0^5;
  239. sbit b_Arrive1S=BitByte0^4;
  240. unsigned char bdata BitByte1;
  241. unsigned char bdata BitByte2;
  242. unsigned char bdata BitValue;
  243. sbit bOnline=BitValue^7;
  244. sbit bPowerOff=BitValue^6;
  245. unsigned char bdata BitValue1;
  246. sbit bBit7=BitValue1^7;
  247. sbit bBit6=BitValue1^6;
  248. sbit bBit5=BitValue1^5;
  249. sbit bBit4=BitValue1^4;
  250. sbit bBit3=BitValue1^3;
  251. sbit bBit2=BitValue1^2;
  252. sbit bBit1=BitValue1^1;
  253. sbit bBit0=BitValue1^0;

  254. //
  255. //
  256. void lcd_write_d(unsigned char c1);
  257. void lcd_write_c(unsigned char c1);
  258. void LcdInit();
  259. void MyInit();
  260. //
  261. void DispOneBoxTextChar(unsigned char Row,unsigned char Col,unsigned char c1,unsigned char DispAttrib);
  262. void DispTwoBoxHexChar(unsigned char Row,unsigned char Col,unsigned char c1,unsigned char DispAttrib);
  263. void DispGraphChar(unsigned char Row,unsigned char Col,unsigned char xdata *cArray,unsigned char DispAttrib);
  264. void DispTextLine(unsigned char Row,unsigned char code *MenuText,unsigned char DispAttrib);
  265. //
  266. void ReadyForKey();
  267. void DelayMs(unsigned int iMs);
  268. void UartProcess();
  269. void IAmZj();
  270. void IAmOk();
  271. void IAmUnKnow();
  272. void FlashSectorWr(unsigned int SourceXRamAddr,unsigned int TargetFlashAddr);
  273. void FlashSectorRd(unsigned int SourceFlashAddr,unsigned int TargetXRamAddr);
  274. void Make05Answer();
  275. void Make06Answer();
  276. void I2Cstart(void);
  277. void I2Csend(unsigned char);
  278. unsigned char I2Csuback(void);
  279. void I2Cmastack(void);
  280. unsigned char I2Cread(void);
  281. void I2Cnoack(void);
  282. void I2Cstop(void);
  283. void Make07Answer();
  284. unsigned char set_time();
  285. void Make08Answer();
  286. void MakeBox(unsigned char row1,unsigned char col1,unsigned char row2,unsigned char col2);
  287. void MenuFunctionNull();
  288. void MenuFunctionDemo1();
  289. void MenuFunctionDemo2();
  290. void MenuFunctionDemo3();
  291. void MenuFunctionDemo4();
  292. void MenuFunctionDemo5();
  293. void MenuFunctionDemo6();
  294. void MenuFunctionDemo7();
  295. void MenuFunctionDemo8();
  296. void MenuFunctionDemo9();
  297. void MenuFunctionDemo10();
  298. void MenuFunctionDemo11();
  299. void MenuFunctionDemo12();
  300. void MenuFunctionDemo13();
  301. void MenuFunctionDemo14();
  302. void MenuFunctionDemo15();
  303. void MenuFunctionDemo16();
  304. void MenuFunctionDemo17();
  305. void MenuFunctionDemo18();
  306. void MenuFunctionDemo19();
  307. //
  308. void DispFaceBmp();
  309. void DispMenu_Root();
  310. void DispMenu_View();
  311. void DispMenu_Operation();
  312. void DispMenu_Test();
  313. void DispMenu_SystemSet();
  314. void DispMenu_Debug();
  315. //
  316. void JudgeHLight();
  317. //
  318. unsigned char ReadTime();
  319. void ShowDesktopTime();
  320. //
  321. unsigned char code Echar[96][8];
  322. unsigned char code FaceBmp[112][8];
  323. //
  324. unsigned char code *Menu_Root[4]=
  325. {
  326. " View         ",
  327. " Operation    ",
  328. " Test         ",
  329. " System Set   "
  330. };
  331. unsigned int code Menu_RootID[4]=
  332. {
  333. MENU_VIEW,
  334. MENU_OPERATION,
  335. MENU_TEST,
  336. MENU_SYSTEMSET
  337. };
  338. //
  339. unsigned char code *Menu_View[2]=
  340. {
  341. " About ZL     ",
  342. " HandSet CLK  "
  343. };
  344. unsigned int code Menu_ViewID[2]=
  345. {
  346. MENU_VIEW_ABOUTRECORDE,
  347. MENU_VIEW_HANDSETCLOCK
  348. };
  349. //
  350. unsigned char code *Menu_Operation[5]=
  351. {
  352. " Set Position ",
  353. " Rd Zj To ROM ",
  354. " Rd ZL To Ram ",
  355. " Del Given ZL ",
  356. " Del All ZL   "
  357. };
  358. unsigned int code Menu_OperationID[5]=
  359. {
  360. MENU_OPERATION_SETPOSITION,
  361. MENU_OPERATION_READZJTOFLASH,
  362. MENU_OPERATION_RDZJTORAM,
  363. MENU_OPERATION_DELGIVENZL,
  364. MENU_OPERATION_DELALLZJ
  365. };
  366. //
  367. unsigned char code *Menu_Test[2]=
  368. {
  369. " Ram Test     ",
  370. " Flash Test   "
  371. };
  372. unsigned int code Menu_TestID[2]=
  373. {
  374. MENU_TEST_RAMTEST,
  375. MENU_TEST_FLASHTEST
  376. };
  377. //
  378. unsigned char code *Menu_SystemSet[2]=
  379. {
  380. " Debug        ",
  381. " Set Hand Clk "
  382. };
  383. unsigned int code Menu_SystemSetID[2]=
  384. {
  385. MENU_SYSTEMSET_DEBUG,
  386. MENU_SYSTEMSET_SETHANDCLK
  387. };
  388. //
  389. unsigned char code *Menu_Debug[2]=
  390. {
  391. " PassWord     ",
  392. " See Picture  "
  393. };
  394. unsigned int code Menu_DebugID[2]=
  395. {
  396. MENU_SYSTEMSET_DEBUG_PASSWORD,
  397. MENU_SYSTEMSET_DEBUG_SEEPICTURE
  398. };
  399. //
  400. unsigned char code MenuNULL[]={"              "};
  401. //
  402. main()
  403. {
  404. MyInit();
  405.     LcdInit();
  406. //
  407. cMenuHLight[0x00]=0x00;
  408. cMenuHLight[0x01]=0x00;
  409. cMenuHLight[0x02]=0x00;
  410. cMenuHLight[0x03]=0x00;
  411. cMenuHLight[0x04]=0x00;
  412. cMenuHLight[0x05]=0x00;
  413. cMenuHLight[0x06]=0x00;
  414. cMenuHLight[0x07]=0x00;
  415. cMenuHLight[0x08]=0x00;
  416. cMenuHLight[0x09]=0x00;
  417. cMenuHLight[0x0a]=0x00;
  418. cMenuHLight[0x0b]=0x00;
  419. cMenuHLight[0x0c]=0x00;
  420. cMenuHLight[0x0d]=0x00;
  421. cMenuHLight[0x0e]=0x00;
  422. cMenuHLight[0x0f]=0x00;
  423. //
  424. DelayMs(20);
  425. //调试用
  426. MenuFunctionNull();
  427. //
  428. Bitvalue="/oblog3/XBYTE[Addr_Key];
  429. bOldOnline=(~bOnline);
  430. b_KeyInt=0;
  431. b_ReceiveOver=0;
  432. b_Arrive1S=0;
  433. //
  434. DispFaceBmp();
  435. //
  436. iMenuID=MENU_FACE;
  437. //
  438. while(1)
  439. {
  440. ReadyForKey();
  441. //
  442. BitValue=XBYTE[Addr_Key];
  443. if(bOldOnline!=bOnline)
  444.   {
  445.   bOldOnline=bOnline;
  446.   if(!bOldOnline)
  447.    {//Line=1
  448.    }
  449.   else
  450.    {//Line=0;
  451.    }
  452.   }
  453. if(b_ReceiveOver)
  454.   {
  455.   //
  456.   UartProcess();
  457.   //
  458.   b_ReceiveOver=0;
  459.   RxStep=0;
  460.   RxPos=0;
  461.   REN=1;
  462.   }
  463. //
  464. if(b_KeyInt)
  465.   {
  466.   switch(NowKey)
  467.    {
  468.    case KEY_OK://KEY_OK,  KEY_UP,  KEY_ESC,
  469.      if(KeyTab[iMenuID].KeyTab_PressOk!=999)
  470.       {
  471.       iMenuID=KeyTab[iMenuID].KeyTab_PressOk;
  472.       iMenuNextID=KeyTab[iMenuID].KeyTab_PressOk;
  473.       JudgeHLight();
  474.       }
  475.      KeyFuncPtr=KeyTab[iMenuID].CurrentOperate;
  476.    "     (*KeyFuncPtr)();    //执行当前按键的操作
  477.      break;
  478.    case KEY_UP:
  479.      if((KeyTab[iMenuID].KeyTab_PressUp!=999)&&(iMenuNextID!=999))
  480.       {
  481.       KeyTab[iMenuID].KeyTab_PressOk=KeyTab[iMenuNextID].KeyTab_PressUp;
  482.       iMenuNextID=KeyTab[iMenuNextID].KeyTab_PressUp;
  483.       JudgeHLight();
  484.       }
  485.      break;
  486.    case KEY_ESC:
  487.      //
  488.      if(KeyTab[iMenuID].KeyTab_PressEsc!=999)
  489.       {
  490.       iMenuID=KeyTab[iMenuID].KeyTab_PressEsc;
  491.       iMenuNextID=KeyTab[iMenuID].KeyTab_PressOk;
  492.       JudgeHLight();
  493.       KeyFuncPtr=KeyTab[iMenuID].CurrentOperate;
  494.          (*KeyFuncPtr)();    //执行当前按键的操作
  495.       }
  496.      break;
  497.      //
  498.    case KEY_LEFT://KEY_LEFT, KEY_DOWN, KEY_RIGHT,
  499.      if((KeyTab[iMenuID].KeyTab_PressUp!=999)&&(iMenuNextID!=999))
  500.       {
  501.       KeyTab[iMenuID].KeyTab_PressOk=KeyTab[iMenuNextID].KeyTab_PressUp;
  502.       iMenuNextID=KeyTab[iMenuNextID].KeyTab_PressUp;
  503.       JudgeHLight();
  504.       }
  505.      break;
  506.    case KEY_DOWN:
  507.      if((KeyTab[iMenuID].KeyTab_PressDown!=999)&&(iMenuNextID!=999))
  508.       {
  509.       KeyTab[iMenuID].KeyTab_PressOk=KeyTab[iMenuNextID].KeyTab_PressDown;
  510.       iMenuNextID=KeyTab[iMenuNextID].KeyTab_PressDown;
  511.       JudgeHLight();
  512.       }
  513.      break;
  514.    case KEY_RIGHT:
  515.      if((KeyTab[iMenuID].KeyTab_PressDown!=999)&&(iMenuNextID!=999))
  516.       {
  517.       KeyTab[iMenuID].KeyTab_PressOk=KeyTab[iMenuNextID].KeyTab_PressDown;
  518.       iMenuNextID=KeyTab[iMenuNextID].KeyTab_PressDown;
  519.       JudgeHLight();
  520.       }
  521.      break;
  522.      //
  523.    case KEY_1://KEY_1,  KEY_2,  KEY_3,
  524.      break;
  525.    case KEY_2:
  526.      break;
  527.    case KEY_3:
  528.      break;
  529.    case KEY_4://KEY_4,  KEY_5,  KEY_6,
  530.      break;
  531.    case KEY_5:
  532.      break;
  533.    case KEY_6:
  534.      break;
  535.    case KEY_7://KEY_7,  KEY_8,  KEY_9,
  536.      break;
  537.    case KEY_8:
  538.      break;
  539.    case KEY_9:
  540.      break;
  541.    case KEY_XING://KEY_XING, KEY_0,  KEY_JING,
  542.      break;
  543.    case KEY_0:
  544.      break;
  545.    case KEY_JING:
  546.      break;
  547.    case KEY_POWER://KEY_POWER, KEY_NULL
  548.      break;
  549.    case KEY_NULL:
  550.      MakeBox(3,3,5,12);
  551.      break;
  552.      //
  553.    default:
  554.      break;
  555.    }
  556.   b_KeyInt=0;
  557.   }
  558. if((b_Arrive1S==1)&&(iMenuID==MENU_FACE))
  559.   {
  560.   ReadTime();
  561.   //
  562.   ShowDesktopTime();
  563.   //
  564.   b_Arrive1S=0;
  565.   }
  566. }
  567. }
  568. void isr_ex0(void)  interrupt 0 using 1
  569. {
  570. b_KeyInt=1;
  571. //
  572. cTemp_ex0=0xff;
  573. //
  574. DelayMs(20);
  575. ReadyForKey();
  576. cTemp_ex0=XBYTE[Addr_Key];
  577. //
  578.     cTemp_ex0=cTemp_ex0&0x3f;
  579.     switch(cTemp_ex0)
  580.      {
  581.      case        0x3e://第一行
  582.          NowKey=0x10;
  583.          break;
  584.      case        0x3d://第二行
  585.          NowKey=0x20;
  586.          break;
  587.      case        0x3b://第三行
  588.          NowKey=0x30;
  589.          break;
  590.      case        0x37://第四行
  591.          NowKey=0x40;
  592.          break;
  593.      case        0x2f://第五行
  594.          NowKey=0x50;
  595.          break;
  596.      case        0x1f://第六行
  597.          NowKey=0x60;
  598.          break;
  599.      default:
  600.    NowKey=0x00;
  601.          break;
  602.      }
  603. //
  604. KEYROW1=0;
  605. KEYROW2=1;
  606. KEYROW3=1;
  607. cTemp_ex0=XBYTE[Addr_Key];
  608.     //
  609. cTemp_ex0&=0x3f;
  610. if(cTemp_ex0!=0x3f)
  611.   {
  612.   NowKey=NowKey|0x01;
  613.   }
  614. else
  615.   {
  616.   KEYROW1=1;
  617.   KEYROW2=0;
  618.   KEYROW3=1;
  619.   cTemp_ex0=XBYTE[Addr_Key];
  620.      //
  621.    cTemp_ex0&=0x3f;
  622.    if(cTemp_ex0!=0x3f)
  623.     {
  624.     NowKey=NowKey|0x02;
  625.     }
  626.    else
  627.     {
  628.     KEYROW1=1;
  629.     KEYROW2=1;
  630.     KEYROW3=0;
  631.     cTemp_ex0=XBYTE[Addr_Key];
  632.        cTemp_ex0&=0x3f;
  633.     if(cTemp_ex0!=0x3f)
  634.      {
  635.      NowKey=NowKey|0x03;
  636.      }
  637.     else
  638.      {
  639.      BitValue=XBYTE[Addr_Key];
  640.      if(!bPowerOff)
  641.       {
  642.       NowKey=0x71;
  643.       }
  644.      else
  645.       {
  646.       NowKey=0x00;
  647.       }
  648.      }
  649.     }
  650.   }
  651. //
  652. do
  653.         {
  654.   DelayMs(100);
  655.         }while(!KEYINT);
  656. //
  657.   IE0=0;//清外中断0请求
  658. }
  659. //
  660. void isr_t0(void)   interrupt 1 using 2
  661. {
  662. TL0=TL0data;
  663. TH0=TH0data;
  664. iT0_1S+=20;//因为定时器的定时为20Ms一次
  665. if(iT0_1S>=1000)
  666.   {
  667.   iT0_1S=0;
  668.   b_Arrive1S=1;
  669.   }
  670. }
  671. //
  672. void isr_ex1(void)  interrupt 2 using 1
  673. {
  674.     _nop_();
  675. }
  676. //
  677. void isr_t1(void)   interrupt 3 using 2
  678. {
  679.     _nop_();
  680. }
  681. //
  682. void isr_ser(void)  interrupt 4 using 3
  683. {
  684. if(TI)
  685. {
  686. if((TxNum--)>0)
  687.   {
  688.   SBUF=Send232Buffer[TxPos++];
  689.   }
  690. else
  691.   {
  692.   TxNum=0;
  693.   TxPos=0;
  694.   }
  695. //
  696. TI=0;
  697. }
  698. else
  699. {
  700. RI=0;
  701. RxNow=SBUF;
  702. Rev232Buffer[RxPos++]=RxNow;
  703. if(RxPos>=255)
  704.   {
  705.   RxPos=0;
  706.   }
  707. //
  708. if(!b_ReceiveOver)
  709.   {
  710.   switch(RxStep)
  711.    {
  712.    case 0://帧头:55 55
  713.     if(RxNow==0x55)
  714.      {
  715.      if(RxPrev==0x55)
  716.       {
  717.       RxStep=1;
  718.       }
  719.      else
  720.       {
  721.       RxPrev=RxNow;
  722.       RxPos=0;
  723.       Rev232Buffer[RxPos++]=RxNow;
  724.       RxStep=0;
  725.       }
  726.      }
  727.     else
  728.      {
  729.      RxStep=0;
  730.      RxPos=0;
  731.      REN=1;
  732.      }
  733.     break;
  734.    case 1://命令帧和数据帧的判断
  735.     if((RxNow&0x80)==0)
  736.      {
  737.      RxStep=3;
  738.      }
  739.     else
  740.      {
  741.      RxPrev=RxNow;
  742.      RxStep=2;
  743.      }
  744.     break;
  745.    case 2://命令帧,第二个命令字(和第一个命令字相同)
  746.     if(RxNow==RxPrev)
  747.      {
  748.      RxStep=7;
  749.      }
  750.     else
  751.      {
  752.      RxStep=0;
  753.      RxPos=0;
  754.      REN=1;
  755.      }
  756.     break;
  757.    case 3://数据帧,帧长度
  758.     RxDataLenght=RxNow;
  759.     RxStep=4;
  760.     break;
  761.    case 4://数据帧,数据段
  762.     RxDataLenght--;
  763.     if(RxDataLenght==0)
  764.      {
  765.      RxStep=5;
  766.      }
  767.     break;
  768.    case 5://数据帧,累加和
  769.     RxStep=6;
  770.     break;
  771.    case 6://数据帧,异或和
  772.     RxStep=8;
  773.     break;
  774.    case 7://命令帧,累加和
  775.     RxStep=8;
  776.     break;
  777.    case 8://帧尾:aa aa
  778.     if(RxNow==0xaa)
  779.      {
  780.      if(RxPrev==0xaa)
  781.       {
  782.       b_ReceiveOver=1;
  783.       REN=0;
  784.       }
  785.      else
  786.       {
  787.       RxPrev=RxNow;
  788.       }
  789.      }
  790.     else
  791.      {
  792.      RxStep=0;
  793.      RxPos=0;
  794.      REN=1;
  795.      }
  796.     break;
  797.    default:
  798.     RxStep=0;
  799.     RxPos=0;
  800.     REN=1;
  801.     break;
  802.    }
  803.   }
  804. }
  805. }
  806. //
  807. void UartProcess()
  808. {
  809. //
  810. cUartTemp1=0;
  811. cUartTemp2=0;
  812. cUartTemp3=0;
  813. cUartFunSn=0xff;
  814. //
  815. cUartTemp1=Rev232Buffer[0];
  816. cUartTemp2=Rev232Buffer[1];
  817. if((cUartTemp1==0x55)&(cUartTemp2==0x55))
  818. {
  819. cUartTemp1=Rev232Buffer[2];
  820. cUartTemp1&=0x80;
  821. if(cUartTemp1!=0)
  822.   {//命令帧
  823.   cUartTemp1=Rev232Buffer[2];
  824.   cUartTemp2=Rev232Buffer[3];
  825.   if(cUartTemp1==cUartTemp2)
  826.    {
  827.    cUartTemp3=cUartTemp1+cUartTemp2;
  828.    cUartTemp1=Rev232Buffer[4];
  829.    if(cUartTemp1==cUartTemp3)
  830.     {
  831.     cUartTemp1=Rev232Buffer[5];
  832.     cUartTemp2=Rev232Buffer[6];
  833.     if((cUartTemp1==0xaa)&&(cUartTemp2=0xaa))
  834.      {
  835.      cUartFunSn=Rev232Buffer[2];
  836.      }
  837.     }
  838.    }
  839.   }
  840. else
  841.   {//数据帧
  842.   cUartAddSum=Rev232Buffer[2]+Rev232Buffer[3];
  843.   cUartXorSum=Rev232Buffer[2]^Rev232Buffer[3];
  844.   cUartDataLenght=Rev232Buffer[3];
  845.   for(i_uart=4;i_uart<(cUartDataLenght+4);i_uart++)
  846.    {
  847.    cUartTemp1=Rev232Buffer[i_uart];
  848.    cUartAddSum+=cUartTemp1;
  849.    cUartXorSum^=cUartTemp1;
  850.    }
  851.   cUartTemp1=Rev232Buffer[cUartDataLenght+4];
  852.   cUartDataLenght++;
  853.   cUartTemp2=Rev232Buffer[cUartDataLenght+4];
  854.   cUartDataLenght++;
  855.   if((cUartTemp1==cUartAddSum)&&(cUartTemp2==cUartXorSum))
  856.    {
  857.    cUartTemp1=Rev232Buffer[cUartDataLenght+4];
  858.    cUartDataLenght++;
  859.    cUartTemp2=Rev232Buffer[cUartDataLenght+4];
  860.    cUartDataLenght++;
  861.    if((cUartTemp1==0xaa)&&(cUartTemp2==0xaa))
  862.     {
  863.     cUartFunSn=Rev232Buffer[6];
  864.     }
  865.    }
  866.   }
  867. }
  868. switch(cUartFunSn)
  869. {
  870. case 0xa5:
  871. case 0xa6://我要伪装成座机0xa7
  872.   IAmZj();
  873.   break;
  874. case 0xac:
  875. case 0xad:
  876. case 0xae:
  877.   IAmOk();
  878.   break;
  879. case 5:
  880.   iFlashAddrH=Rev232Buffer[7];
  881.   iFlashAddrM=Rev232Buffer[8];
  882.   iFlashAddrL=Rev232Buffer[9];
  883.   iFlashRdWrNum=Rev232Buffer[10];
  884.   //
  885.   i_uart=iFlashAddrM;
  886.   i_uart=(i_uart<<8)&0xff00;
  887.   FlashSectorRd(i_uart,Addr_FlashReadBuffer1);
  888.   //
  889.   i_uart=iFlashAddrM+1;
  890.   i_uart=(i_uart<<8)&0xff00;
  891.   FlashSectorRd(i_uart,Addr_FlashReadBuffer2);
  892.   //
  893.   Make05Answer();
  894.   //
  895.   break;
  896. case 6:
  897.   iFlashAddrH=Rev232Buffer[7];
  898.   iFlashAddrM=Rev232Buffer[8];
  899.   iFlashAddrL=Rev232Buffer[9];
  900.   iFlashRdWrNum=Rev232Buffer[10];
  901.   //
  902.   i_uart=iFlashAddrM;
  903.   i_uart=(i_uart<<8)&0xff00;
  904.   FlashSectorRd(i_uart,Addr_FlashWriteBuffer1);
  905.   //
  906.   i_uart=iFlashAddrM+1;
  907.   i_uart=(i_uart<<8)&0xff00;
  908.   FlashSectorRd(i_uart,Addr_FlashWriteBuffer2);
  909.   //
  910.   cUartTemp1=iFlashRdWrNum;
  911.   iUartTemp1=iFlashAddrL;
  912.   cUartTemp2=0;
  913.   while(cUartTemp1>0)
  914.    {
  915.    XBYTE[Addr_FlashWriteBuffer1+iUartTemp1]=Rev232Buffer[11+cUartTemp2];
  916.    cUartTemp1--;
  917.    iUartTemp1++;
  918.    cUartTemp2++;
  919.    }
  920.   //
  921.   i_uart=iFlashAddrM;
  922.   i_uart=(i_uart<<8)&0xff00;
  923.   FlashSectorWr(Addr_FlashWriteBuffer1,i_uart);
  924.   //
  925.   i_uart=iFlashAddrM+1;
  926.   i_uart=(i_uart<<8)&0xff00;
  927.   FlashSectorWr(Addr_FlashWriteBuffer2,i_uart);
  928.   //
  929.   Make06Answer();
  930.   break;
  931. case 7:
  932.   ReadTime();
  933.   Make07Answer();
  934.   break;
  935. case 8:
  936.   //               5     7  8  9  10 11 12
  937.   //55 55 03 09 00 CF 08 03 11 11 19 39 15 6F FB AA AA
  938.   clock[0]=0xa2;//I2C address
  939.   clock[1]=0x02;//address
  940.   clock[8]=Rev232Buffer[7];//year
  941.   clock[7]=Rev232Buffer[8];//month
  942.   clock[5]=Rev232Buffer[9];//date
  943.   clock[4]=Rev232Buffer[10];//hours
  944.   clock[3]=Rev232Buffer[11];//minutes
  945.   clock[2]=Rev232Buffer[12];//seconds
  946.   set_time();
  947.         Make08Answer();
  948.   break;
  949. default:
  950.   IAmUnKnow();
  951.   RxStep=0;
  952. ……………………

  953. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
多级菜单.rar (76.02 KB, 下载次数: 104)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:96552 发表于 2019-8-15 09:26 | 只看该作者
大家验证过吗?LCD12864串行的还是并行 接法呢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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