找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4729|回复: 1
收起左侧

LCD12864简单菜单程序,八个按键带proteus仿真和程序

[复制链接]
ID:137190 发表于 2016-9-9 02:04 | 显示全部楼层 |阅读模式
0.png 0.png
  1. /****************************************************************************************
  2. 简单菜单程序,八个按键.使用AVR单片机.2008/3/24--2008/3/29
  3. 编译器为ICCAVR7.14.晶振7.3728M,单片机为ATmega16(用ATmega32在proteus中仿真不成功!)
  4. *****************************************************************************************/

  5. #include <iom16v.h>
  6. #include <macros.h>
  7. #include <stdio.h>
  8. #include "menu.h"                //所有变量定义以及函数声明均放在这个头文件里.
  9. #include "delay.h"
  10. #include "lcd_12864.h"
  11. #include "get_key.h"

  12. #define blueon PORTB|=(1<<PORTB5)
  13. #define blueoff PORTB&=~(1<<PORTB5)
  14. #define greenon PORTB|=(1<<PORTB6)
  15. #define greenoff PORTB&=~(1<<PORTB6)
  16. #define redon PORTB|=(1<<PORTB7)
  17. #define redoff PORTB&=~(1<<PORTB7)

  18. //SFR初始化.
  19. void main_init(void)
  20. {
  21.         DDRA=0xff;                        //A口设置为输出.
  22.         PORTA=0x00;
  23.         DDRB=0xff;                        //B口设置为输出.
  24.         PORTB=0x00;
  25. //        ASSR&=~(1<<AS2);
  26.         DDRC=0x00;                        //C口设置为输入.
  27.         PORTC=0xff;                        //AVR没有上拉寄存器,在PORTC中写1即表示打开上拉了.
  28.         DDRD=0x00;                        //D口设置为输入.                                                                                                 
  29.         PORTD=0xff;                        //打开D口上拉.               
  30. }

  31. void main_menu_initial(void)        //LED主菜单初始化.
  32. {
  33.         main_menu[0].menu_count=3;        //有三个菜单项.
  34.         main_menu[0].display=blue;
  35.         main_menu[0].subs=NULL;                //点亮兰灯
  36.         main_menu[0].children_menus=blue_menu;
  37.         main_menu[0].parent_menus=NULL;
  38.        
  39.         main_menu[1].menu_count=3;
  40.         main_menu[1].display=green;                //点亮绿灯
  41.         main_menu[1].subs=NULL;
  42.         main_menu[1].children_menus=green_menu;
  43.         main_menu[1].parent_menus=NULL;
  44.        
  45.         main_menu[2].menu_count=3;
  46.         main_menu[2].display=red;                //点亮红灯.
  47.         main_menu[2].subs=openred;
  48.         main_menu[2].children_menus=NULL;
  49.         main_menu[2].parent_menus=NULL;
  50. }

  51. void blue_menu_initial(void)
  52. {
  53.         blue_menu[0].menu_count=2;
  54.         blue_menu[0].display=qr;                        //点亮兰灯,确认.
  55.         blue_menu[0].subs=openblue;
  56.         blue_menu[0].children_menus=NULL;
  57.         blue_menu[0].parent_menus=main_menu;
  58.        
  59.         blue_menu[1].menu_count=2;
  60.         blue_menu[1].display=qx;                        //取消.
  61.         blue_menu[1].subs=closeblue;
  62.         blue_menu[1].children_menus=NULL;
  63.         blue_menu[1].parent_menus=main_menu;       
  64. }

  65. void green_menu_initial(void)
  66. {
  67.         green_menu[0].menu_count=2;
  68.         green_menu[0].display=qr;                        //点亮绿灯---确认.
  69.         green_menu[0].subs=opengreen;
  70.         green_menu[0].children_menus=NULL;
  71.         green_menu[0].parent_menus=main_menu;
  72.        
  73.         green_menu[1].menu_count=2;
  74.         green_menu[1].display=qx;                        //----取消.
  75.         green_menu[1].subs=closegreen;
  76.         green_menu[1].children_menus=NULL;
  77.         green_menu[1].parent_menus=main_menu;
  78. }


  79. void led_menu_pro(void)
  80. {
  81.         max_item=menu_led->menu_count;
  82.         switch(keyval)
  83.         {
  84.                 case 0: break;
  85.                 case 1:                                //向上键.
  86.                         if(user_choosen==0)
  87.                         {                       
  88.                                 user_choosen=max_item;
  89.                         }
  90.                         refresh=1;
  91.                         user_choosen--;
  92.                         break;
  93.                 case 2:                                //向下键.
  94.                         user_choosen++;
  95.                         if(user_choosen==max_item)
  96.                         {
  97.                                 user_choosen=0;
  98.                         }
  99.                         refresh=1;
  100.                         break;
  101.                 case 3:                                //确认键.                       
  102.                         if(menu_led[user_choosen].subs!=NULL)
  103.                         {
  104.                                 (*menu_led[user_choosen].subs)();        //执行函数.
  105.                         }
  106.                         if(menu_led[user_choosen].children_menus!=NULL)
  107.                         {
  108.                                 temp_choosen=user_choosen;
  109.                                 menu_led=menu_led[user_choosen].children_menus;
  110.                                 user_choosen=0;
  111.                         }
  112.                         refresh=1;
  113.                         break;
  114.                 case 4:                                //返回键.
  115.                         if(menu_led[user_choosen].parent_menus!=NULL)
  116.                         {
  117.                                 menu_led=menu_led[user_choosen].parent_menus;
  118.                         }       
  119.                         refresh=1;
  120.                         break;
  121.                 default:
  122.                         break;                       
  123.         }
  124.         if(refresh)                                        //是否需要刷新LCD标志位.
  125.         {
  126.                 lcd_clr();
  127.                 refresh=0;
  128.         }
  129.         led_menu_show();       
  130. }

  131. void led_menu_show(void)       
  132. {
  133.         uchar n;
  134.         max_item=menu_led->menu_count;
  135.         if (max_item>=3)                                //菜单项为3则表示为主菜单.
  136.         {                               
  137.                 for(n=0;n<3;n++)
  138.                 {
  139. /*使同一数组元素图形宽度相同,即取最大的图形宽度,这里取96,在数组赋值时也要注意*/               
  140.                         draw_bmp(n*2,20,96,0,menu_led[n].display);
  141.                 }
  142.                 select_item(user_choosen);                //标记出当前菜单项.
  143.         }
  144.         else
  145.         {
  146.                 switch(temp_choosen)
  147.                 {
  148.                         case 0:
  149.                                 draw_bmp(0,20,96,0,blue);
  150.                                 break;
  151.                         case 1:
  152.                                 draw_bmp(0,20,96,0,green);
  153.                                 break;
  154.                         case 2:
  155.                                 draw_bmp(0,20,96,0,red);
  156.                                 break;
  157.                         default:
  158.                                 break;
  159.                 }
  160.                 for(n=0;n<max_item;n++)
  161.                 {
  162.                         draw_bmp((n+1)*2,20,32,0,menu_led[n].display);
  163.                 }
  164.                 select_item(user_choosen+1);                                       
  165.         }               
  166. }

  167. void select_item(uchar n)
  168. {
  169.         draw_bmp(n*2,2,16,0,curflag);
  170. }

  171. void openblue(void)
  172. {
  173.         blueon;
  174.         greenoff;
  175.         redoff;
  176. }

  177. void opengreen(void)
  178. {
  179.         blueoff;
  180.         greenon;
  181.         redoff;
  182. }

  183. void openred(void)
  184. {
  185.         blueoff;
  186.         greenoff;
  187.         redon;
  188. }

  189. void closeblue(void)
  190. {
  191.         blueoff;
  192. }

  193. void closegreen(void)
  194. {
  195.         greenoff;
  196. }
  197.        



  198. /*************************************************
  199. 主程序.
  200. **************************************************/

  201. void main(void)
  202. {
  203.         main_init();
  204.         lcd_init();
  205.         lcd_clr();
  206.         draw_bmp(0,0,128,0,xtcsh);                //函数调用形式为页,列,宽度,数据指针.
  207.         draw_bmp(2,8,72,0,writeby);
  208.         draw_bmp(4,56,32,1,jiangping);

  209.         blueon;
  210.         greenon;
  211.         redon;
  212.                
  213.         delay_ms(3000);                                //延时3秒.
  214.         lcd_clr();
  215.        
  216.         blueoff;
  217.         greenoff;
  218.         redoff;
  219.        
  220.         main_menu_initial();
  221.         blue_menu_initial();
  222.         green_menu_initial();

  223.         while(1)
  224.         {
  225.                 keyval=get_key();                                   //读键.
  226.                 led_menu_pro();
  227.         }
  228. }       
复制代码


回复

使用道具 举报

ID:149266 发表于 2016-11-22 11:22 | 显示全部楼层
文件呢,怎么下载
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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