标题: LCD12864液晶菜单界面小系统 代码开源+效果视频 [打印本页]

作者: daoyou    时间: 2013-8-7 01:16
标题: LCD12864液晶菜单界面小系统 代码开源+效果视频
效果视频
http://player.youku.com/player.php/sid/XNTA2NDUyODg0/v.swf



这个是主界面

这个是主菜单界面

这个是设置时间的子界面

这个是设置日期


设置背景光

这是设置了按键音和闹铃以后,主界面出现状态标志


闹铃的界面,喇叭出现铃声。

生日倒计时提醒功能。




今天晚上刚刚写完代码,第一次写这个超过2天,以前都在学习过程中。有点小开心。赶紧上论坛来和大家分享下。绝对原创。因为,我根本看不懂别人太复杂的代码,代码量大了看起来就累,然后就不想看。。。不知道大家有没有这样的感觉,每次帖子看写方法的比较舒服。

代码献上,我这里用的是STC90C516RD+,代码量大了点

还有 希望有高手能看到,提点建议给我,感觉写这个非常要命,我每次处理冗长的条件的时候,我只会加很多bit flag标志去判断,然后节省时间,代码量特别大,,,挺摸不着头脑的,希望有志同道合的朋友经常一起交流。我经常登这个论坛,有兴趣的可以回复我。先自我介绍下,我今年大三,刚学完开发板现有的模块,然后准备这个寒假多实践下,买了很多串口通信的器件,希望能找到个交流的伴,每次在学校就我一个人在捣鼓这东西,觉得时间久了有点没有激情了。。。

数字菜单系统开发者YuMin_Dong-1.7z (71.22 KB, 下载次数: 5012)

作者: daoyou    时间: 2013-8-7 01:17
这个是main.c文件
  1. /*------------------------------------
  2. 名称:多级菜单数字电子钟
  3. 编写:YuMin_Dong
  4. 时间:2013.01.24
  5. ------------------------------------*/
  6. #include <reg52.h>
  7. //#include<intrins.h>
  8. #include<stdio.h>
  9. #include"zm.h"
  10. #include"delay.h"
  11. #include"lcd12864.h"
  12. #include"ds18b20.h"
  13. #include"ds1302.h"
  14. #include"process.h"

  15. /*------------------------------------
  16.                         全局变量定义
  17. ------------------------------------*/

  18. bit Temperature_Flag;                        //读取并显示温度标签,使温度刷新频率低些
  19. //bit Re_Time_Flag;
  20. //bit Flag1;        //进入子菜单后置标志,中断一次Menu_Count自加一次
  21. bit Bell_Work;

  22. /*------------------------------------
  23.                         转换表
  24. ------------------------------------*/
  25. //code UINT8 *WEEK_TAB[]={"一","二","三","四","五","六","日",};                //星期中文字库表

  26. /*------------------------------------
  27.                         函数声明部分
  28. ------------------------------------*/
  29. //void Display_Time();
  30. //void System_BootScreen();
  31. //void Timer0_Init();
  32. //void Int0_Init();
  33. //void Display_Temperature();
  34. //UINT8 Conver_Week(bit c,UINT8 year,UINT8 month,UINT8 date);

  35. /*------------------------------------
  36.                         启动画面
  37. ------------------------------------*/
  38. void System_BootScreen()
  39. {
  40. UINT8 i;
  41. LCD_SendImg128x64(User0_128x64);        //欢迎画面
  42. for(i=0;i<10;i++)
  43. DelayMs(255);                                                //画面延时

  44. LCD_SendImg128x64(User1_128x64);        //照片显示
  45. for(i=0;i<10;i++)
  46. DelayMs(255);
  47. }

  48. /*------------------------------------
  49.                         初始化定时器
  50. ------------------------------------*/
  51. void Timer_Init()                                       
  52. {
  53. TMOD|=0x11;                                        //两个定时器置方式一
  54. IE|=0X8a;                                        //开总中断开关和两个定时器中断开关
  55. PT1=1;                                                //按键音产生中断T1权拉高,使之能在INT0下产生声响
  56. TR0=1;                                                //开启定时器0,刷新用
  57. //PX0=1;
  58. //TR1=1;
  59. }

  60. /*------------------------------------
  61.                         初始化INT0
  62. ------------------------------------*/
  63. void Int0_Init()
  64. {
  65. EX0=1;                //打开外中断0,中断允许
  66. IT0=1;                //设置下降沿触发
  67. }

  68. /*------------------------------------
  69.                         INT0中断处理函数
  70. ------------------------------------*/
  71. void Int0_IRQ() interrupt 0
  72. {
  73.         Menu_Flag=1;                                //进入主菜单标签
  74.         TR1=1;                                                //开启TR1有按键音       
  75.         while(!KEY_MENU)                        //等待按键结束,使用中断做按键,能让它实时性比较好
  76.         ;
  77.         TR1=0;                                        //按键结束,按键音结束
  78.                
  79.         if(Menu0)                                        //子菜单0(设置时间进入后)
  80.         {
  81.         Set_Hour=~Set_Hour;                        //因为只有时钟和分钟个设置,0和1两种状态能区分了
  82.         }
  83.         else if(Menu1)                                //子菜单1(设置日期进入后)
  84.                 Menu1_Flag=1;                        //为减少中断代码长度,事实证明,用个标志更好
  85.         else if(Menu2)
  86.                 Menu2_Flag=1;
  87.         else if(Menu3) Set_Bright=~Set_Bright;                //子菜单3(背景光开关)
  88.         else if(Menu4) Set_Speaker=~Set_Speaker;        //子菜单4(按键音开关)
  89. Refresh_SetTime=1;                                //在子状态中任何状态按一下都会使产生刷新显示标签。       
  90. }       

  91. /*------------------------------------
  92.                         T0中断处理函数
  93. ------------------------------------*/
  94. void Timer0_IRQ() interrupt 1
  95. {
  96. static UINT8 i;
  97. TH0=-50000/256;
  98. TL0=-50000%256;
  99. i++;
  100. if(i==80)        Temperature_Flag=1;        //2.5s中产生一次(读取并刷新温度的标签)
  101. }

  102. /*------------------------------------
  103.                         T1中断处理函数
  104. ------------------------------------*/
  105. void Timer1_IRQ() interrupt 3
  106. {
  107. TH1=-600/256;                                        //产生某种频率的按键音
  108. TL1=-600%256;                                        //经测试,2000HZ~4000HZ左右的比较适合做按键音
  109. SPEAKER=~SPEAKER;                                //产生方波 提供某种频率的按键音
  110. }

  111. /*------------------------------------
  112.                         主函数
  113. ------------------------------------*/
  114. void main()
  115. {
  116. LCD_ClearGDRAM();                //清除DDRAM和GDRAM的显示
  117. System_BootScreen();        //启动画面
  118. DS1302_Init();                        //初始化DS1302
  119. Int0_Init();                        //初始化外中断0
  120. LCD_Init();                                //初始化12864
  121. Timer_Init();                        //初始化定时器
  122. LCD_ClearGDRAM();                //清屏DDRAM和GDRAM
  123. LCD_SetCGRAM(1,User1_16x16);//写入CGRAM自定义字符 主菜单指向箭头
  124. LCD_SetCGRAM(0,User0_16x16);//闹钟标志
  125. LCD_SetCGRAM(2,User2_16x16);//℃
  126. LCD_SetCGRAM(3,User4_16x16);//温度计
  127. Display_Temperature();                //开始的时候先显示下温度,使界面比较完整不会空缺
  128. SPEAKER=0;                                        //断开喇叭,使之不会长时间导通烧坏
  129. BRIGHT=1;                                        //打开背景光
  130. while(1)
  131. {
  132. SPEAKER=0;                                        //断开喇叭,使之不会长时间导通烧坏
  133.         if(Temperature_Flag)        //大循环下,温度标签置位后刷新显示温度
  134.         {
  135.         Temperature_Flag=0;                //清零标签
  136.         Display_Temperature();
  137.         }
  138.        
  139.        
  140.         if(!Menu_Flag)                        //没有菜单标签则显示主时钟界面
  141.         {
  142.         DS1302_ReadDate();                //读取日期
  143.                 if(Bell_Flag)                //Bell标志被置位,表明在设置菜单里,开始定时了,开始往下执行,等待定时到
  144.                 {
  145.                         if(Hour==Bell_Hour&&Minute==Bell_Minute)
  146.                         {
  147.                         LCD_ClearGDRAM();
  148.                         LCD_SendImg128x64(User2_128x64);
  149.                         Bell_Work=1;
  150.                         ET1=1;
  151.                         TR1=1;
  152.                                 while(1)
  153.                                 {
  154.                                         if(!KEY_ENTER)
  155.                                         {
  156.                                         DelayMs(10);
  157.                                                 if(!KEY_ENTER)
  158.                                                 {
  159.                                                 while(!KEY_ENTER);
  160.                                                 Bell_Flag=0;
  161.                                                 Temperature_Flag=1;
  162.                                                 Bell_Work=0;
  163.                                                 TR1=0;
  164.                                                 Menu_Flag=0;
  165.                                                 LCD_ClearGDRAM();
  166.                                                 LCD_Init();
  167.                                                 break;
  168.                                                 }
  169.                                         }
  170.                                 }
  171.                         }
  172.                 }
  173.         Display_Date();                        //填充显示日期
  174.         Display_Week();                        //填充显示星期
  175.         DS1302_ReadTime();                //读取时间
  176.         Display_Time();                        //填充显示时间
  177.         }
  178.        
  179.         else if(Menu_Flag)                //显示控制界面
  180.         {
  181.         LCD_ClearGDRAM();                //清屏之前的主时钟界面
  182.         LCD_RefreshMenu();                //菜单显示
  183.         FanHui1=0;                                //清零FanHui1标签,使之每一次进入菜单后都能停在下面那个while菜单循环中
  184.         //guide_old++;                        //
  185.         while(!FanHui1)                        //FanHui没有被置1,死循环,当主菜单下按了返回则置1,跳出循环
  186.         {       
  187.         MainMenu_Pro();                        //主菜单处理函数
  188.         SPEAKER=0;                                //断开喇叭,使之不会长时间导通烧坏
  189.                 while(Enter_Menu)        //进入子菜单标签
  190.                 {
  191.                                 if(Menu0) Menu0_Pro();                //子菜单0处理函数
  192.                                 else if(Menu1) Menu1_Pro();       
  193.                                 else if(Menu2) Menu2_Pro();
  194.                                 else if(Menu3) Menu3_Pro();
  195.                                 else if(Menu4) Menu4_Pro();
  196.                                 else if(Menu5) Menu5_Pro();
  197.                 SPEAKER=0;                                //断开喇叭,使之不会长时间导通烧坏
  198.                 }
  199.         }//一级菜单while()
  200.         Temperature_Flag=1;                //每当退出主菜单,重新显示温度
  201.         }//显示界面块
  202. }
  203. }
复制代码

作者: 冷清___若水    时间: 2013-8-13 14:36
能不能把完整的程序和电路图发来啊?!感激不尽

作者: qq324042093    时间: 2013-8-13 22:54
haoyang de !!!!51黑有你更精彩!!
作者: 游侠(单片机开    时间: 2013-10-21 15:43
很好  学习 谢谢
作者: fxping163    时间: 2013-10-25 09:31
这网站上下载怎么这么慢呢?
作者: bglhf    时间: 2013-10-29 13:50
收藏了
作者: EGO配支架    时间: 2013-10-30 11:03
128*64点阵,欢迎用RAIO的RA6963
作者: jiashengqiang    时间: 2013-10-31 21:41
完整的程序和电路图发一下吧,楼主
作者: jldqc    时间: 2013-11-1 10:46
顶,谢谢
作者: 469396824    时间: 2013-11-4 00:08
受教了,学习中
作者: じ☆ve諟菈眯蘇    时间: 2014-1-2 15:58
完整的程序和电路图发一下吧,楼主

作者: xjxhsjl    时间: 2014-2-12 14:22
我下载编译怎么这么多的错误啊?
作者: yamglang    时间: 2014-2-21 01:11
完整的程序和电路图发一下吧,楼主 谢谢!
作者: xysgjxy    时间: 2014-2-28 12:24
赞一个!!!
作者: 异旅青丝    时间: 2014-3-8 08:35
看着很吊的样子
作者: yixiaow810c    时间: 2014-4-4 14:02
楼主厉害啊,感谢分享
作者: zenghl    时间: 2014-4-6 14:06
楼主真强呀!
作者: 930417801    时间: 2014-4-14 17:34
支持楼主~~
作者: zhoudehua    时间: 2014-4-14 20:07
好东西,收藏学习
作者: a651738901    时间: 2014-4-28 22:03
谢谢楼主慷慨,谢谢了
作者: 涟漪    时间: 2014-4-28 22:25
楼主厉害啊。功能完善的万年历了。感谢分享
作者: 稻草人‘mirror    时间: 2014-5-2 02:30
谢谢楼主分享
作者: lyMarvin    时间: 2014-5-2 07:30
倒计时功能不错,学习学习。
作者: Guo.Ke    时间: 2014-5-16 09:33
xie谢分享,学习一下
作者: 153956635    时间: 2014-5-26 21:13
楼主在吗,怎么我的有错误?请教

ZM.H(11): 错误 C129: missing ';' before 'User16x32',,,
作者: 周安松    时间: 2014-6-1 23:57
不错的东西
作者: 蒲林森    时间: 2014-6-3 10:29
能发下原理图吗
作者: JIUSHI    时间: 2014-7-7 21:19
漂亮    这就是我想要的
作者: radiance    时间: 2014-7-14 17:52
先看看了。
作者: 921555172    时间: 2014-7-17 21:32
可不可以把完整的程序发给我
作者: WKK001    时间: 2014-7-18 17:37
正在学习菜单,感觉挺麻烦的
作者: coolzoom    时间: 2014-7-19 23:20
支持支持
作者: yamglang    时间: 2014-8-16 22:41
可不可以把完整的程序和原理图发给我,楼主  
作者: relationyao    时间: 2014-9-3 09:51
你好,我看了你的图片了,第一次做的挺好的,就你说的,我也是想一直找个志同道合的朋友经常一起交流交流,有时间方便聊一聊!
作者: ladeng0303    时间: 2014-9-5 15:37
好东西啊,谢谢楼主分享!
作者: heam    时间: 2014-9-15 12:25
谢谢分享
作者: mcaeg    时间: 2014-9-15 23:14
郁闷.我的12864不显示了.可能屏坏了.那天在找一块试试
作者: qzsulin    时间: 2014-9-30 10:03
不错。。。。
作者: zhang289444124    时间: 2014-10-3 19:55
很不错
作者: snailgg    时间: 2014-10-4 11:02
楼主,挺你,成功的人是孤独的。
作者: yc21    时间: 2014-10-5 20:33
必须顶,思路很清晰啊
作者: tjj163    时间: 2014-10-11 15:13
很好  学习 谢谢
作者: jst    时间: 2014-10-11 22:40
楼主在吗,怎么我的有错误?请教

ZM.H(11): 错误 C129: missing ';' before 'User16x32',,,
作者: xs888    时间: 2014-10-12 06:58
不错的东西,下载学习学习。
作者: 4258036    时间: 2014-10-20 18:52
谢谢分享
作者: 南开强子    时间: 2014-11-9 21:39
多谢了,学习。
作者: nsj21n    时间: 2014-11-10 08:54
GOOD,NICE MEMU!
作者: nojiya88    时间: 2014-11-11 19:27
我改了一下接口,然后编译为什么不通过啊?  ZM.H(9): error C129: missing ';' before 'User_16x32'
  帮看一下怎么改一下。。。
作者: zhao58    时间: 2014-11-12 11:43
daoyou 发表于 2013-8-7 01:17
这个是main.c文件

下来学习一下 谢谢分享
作者: zhao58    时间: 2014-11-12 11:45
daoyou 发表于 2013-8-7 01:17
这个是main.c文件

就是没有电路图啊
作者: zhao58    时间: 2014-11-12 11:50
怎么下载不了呢
作者: maxtor686    时间: 2014-11-16 12:30
完整的程序和电路图发一下吧  191277770@qq.com 谢谢
作者: 12345-----    时间: 2014-11-24 08:45
你这个12864的管脚怎么接的呀
作者: zjf110    时间: 2014-11-25 01:01
#在这里快速回复#不错 顶顶顶顶
作者: zjf110    时间: 2014-11-25 01:50
daoyou 发表于 2013-8-7 01:17
这个是main.c文件


感谢楼主分享
作者: zjf110    时间: 2014-11-25 02:03
daoyou 发表于 2013-8-7 01:17
这个是main.c文件

很好  学习 谢谢
作者: 77408187    时间: 2014-11-25 19:54
楼主太强了。
作者: 77408187    时间: 2014-11-25 19:55
佩服啊
作者: 游戏机123456    时间: 2014-11-25 22:17
daoyou 发表于 2013-8-7 01:17
这个是main.c文件


完整的程序和电路图发一下吧我非常喜欢谢谢。JZRCL88@163.COM
作者: 周安松    时间: 2014-11-28 03:31
学习学习,谢谢
作者: njdada    时间: 2014-12-6 10:17
再支持一下就可以了。
作者: njdada    时间: 2014-12-6 10:18
再支持一下就可以了。
作者: 517120074    时间: 2014-12-6 11:02
下载了,ZM的H文件不能通过编译。
作者: xiejiaxiao    时间: 2014-12-6 16:11
下载了,谢谢分享
作者: swq123    时间: 2014-12-6 21:51
153956635 发表于 2014-5-26 21:13
楼主在吗,怎么我的有错误?请教

ZM.H(11): 错误 C129: missing ';' before 'User16x32',,,

我运行也是,宏定义一下,还是让看楼主解答吧
作者: hawkfyj    时间: 2014-12-7 10:37
大神啊!我照你的程序调了,温度显示95.9度啊?怎么回事啊?
作者: mycookie    时间: 2014-12-9 10:41
这个东西听潮的
作者: 来自火星的蜗牛    时间: 2014-12-17 21:27
下载下来,学习一下。
作者: 来自火星的蜗牛    时间: 2014-12-17 21:28
楼主代码写的相当细致,值得学习。谢谢
作者: 星星一眨眼    时间: 2014-12-18 02:17
多谢分享
作者: 1250455243    时间: 2014-12-21 21:44
很好。。。。
作者: 1250455243    时间: 2014-12-21 21:44
支持  力顶。。
作者: touren    时间: 2015-1-2 15:03
谢谢分享,楼主厉害
作者: lxl2255    时间: 2015-1-7 10:44
good  想看看
作者: mcs51    时间: 2015-2-3 15:11
不错,支持
作者: mcs51    时间: 2015-2-3 15:13
转了,不错
作者: wamgweix    时间: 2015-2-18 03:02
好东西,下载了
作者: 吴宇    时间: 2015-3-5 18:07
用不了
作者: wangzm521    时间: 2015-3-13 15:09
好东西呀
作者: wangzm521    时间: 2015-3-13 15:09
怎么还是不够数据呢?
作者: csx140118    时间: 2015-3-13 19:22
路过。学习了……
作者: 钓鱼臺    时间: 2015-3-15 22:02
程序不完整?本莱鸟木有办法喽。
作者: 飞蓬    时间: 2015-3-16 11:38
谢谢分享
作者: 周安松    时间: 2015-3-18 14:14
支持一下
作者: brantsun    时间: 2015-3-29 18:24
niumhzxb,jhzxv.ZXZXcZXZX
作者: brantsun    时间: 2015-3-29 18:24
希望有志同道合的朋友经常一
作者: delay    时间: 2015-3-29 20:46
谢谢分享
作者: delay    时间: 2015-3-29 20:53
很厉害
作者: 黎默-lymoo    时间: 2015-3-30 13:59
学习

作者: 酸葡萄爱好者2    时间: 2015-3-30 15:08
楼主您好,现大二,也想开始学这个东西个,能发下您的PCB 图吗,想参考学习一下!    谢谢啦!邮箱:guoleixuan@163.com
作者: 浆糊    时间: 2015-3-30 19:50
还可以呀
作者: hai861017    时间: 2015-4-1 13:22
楼主用的好像是DOFLY的学习板。我也有一块一样的。
作者: 新洛克    时间: 2015-4-5 18:15
太感动了,高手在民间。
作者: 诗人的眼YI    时间: 2015-4-8 17:25
新手表示高大上,学习下。
作者: Cynthia    时间: 2015-4-28 15:17
占两行的大数字,用的是绘图方式吗?问个傻瓜的问题,绘图和字符可以同时出现在同一屏幕上么?
作者: JY脚印    时间: 2015-5-1 15:13
观摩!!!!!!!!
作者: 小天爱小葱    时间: 2015-5-4 15:36
学习学习
作者: 嘉辉先生    时间: 2015-5-8 20:16
楼主能把代码和电路图发一下吗,感激万分。787327686@qq.com
作者: 文梃沣55    时间: 2015-5-8 22:54
求完整的程序和电路图发一下吧,楼主发到18722820554@163.com谢谢




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1