⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcdmenu.c

📁 南方老树的C51 实现两层LCD菜单的源代码
💻 C
字号:
/****************************************************************************/
/*                                                                          */
/*                Copyright (c) 2005, 老树工作室                            */
/*                     All rights reserved.                                 */
/*                                                                          */
/*      Email:laoshu0902@163.com                                            */
/*      www.laoshu0902.bokee.com                                            */
/*                                                                          */
/****************************************************************************/
/****************************************************************************/
/* 文件名:lcdmenu.c                                                        */
/* 版  本:Version 1.0                                                      */
/* 描  述:液晶菜单的设计,通过按键设置温度、湿度、光强的报警阈值           */
/*         及开关量与模拟量的输出                                           */
/* 作  者:spot                                                             */
/* 函  数:                                                                 */
/*                                                                          */
/* 历史记录:                                                               */
/*  spot          2005-08-20     Creat Inital version. (Version 1.0)        */
/****************************************************************************/
#include <reg52.h>
#include <stdio.h>
#include <intrins.h>
#include "../includes/types.h"
#include "../includes/lcd.h"
#include "../includes/com.h"
#include "keyboard.h"

void key_setmenu_lcd(void);
extern void dac_5615(u_int data_in); /* 写入DAC的10bit输入数据 */

extern ALARM_DATA_INFO alarm_limit;  /* 报警阈值 */

u_char set_menu_flag = 0;
u_char set_limit_flag = 0;

bit temp_layer  = 0;
bit hum_layer   = 0;
bit light_layer = 0;
u_char key_code;

extern u_int analog_out_data;           /* DAC 输出 */

sbit CTRL_RELAY = P3^4;        /* 控制继电器开关 */

/* 液晶上显示键盘设置的温湿度光强报警阈值,及模拟量和开关量输出状态 */
void key_setmenu_lcd(void)
{

    key_code = scan_key();
    switch(key_code)
    {
        case BUTTON_16://功能选择
            if (set_menu_flag == 0)
            {
                show_setmenu_a();//按一下是菜单初始化为停在TEMP选项上
                set_menu_flag  = 1;
                set_limit_flag = 0;
            }
            else if (set_menu_flag == 1)//再次按下编辑当前选中栏
            {
                if (!temp_layer)//温度分两半:0、1层,0是上限在左边,1是下限在右边
                {/*按一下为上阀值,再按一下为下阀值*/
                    temp_layer = 1;
                    show_temp_limit_high(alarm_limit.temp_othreshold, alarm_limit.temp_uthreshold);
                    /* 显示温度阈值设置菜单, 显示上限设置结果*/
                }
                else
                {
                    temp_layer = 0;//temp_layer就是个乒乓键
                    show_temp_limit_low(alarm_limit.temp_othreshold, alarm_limit.temp_uthreshold);
                }/* 显示温度阈值设置菜单, 显示下限设置结果*/
                set_limit_flag = 1;
            }
            else if (set_menu_flag == 2)
            {
                if (!hum_layer)
                {
                    hum_layer = 1;
                    show_analog_limit_high(alarm_limit.analog_othreshold, alarm_limit.analog_uthreshold);
                    /* 显示模入阈值设置菜单 */
                }
                else
                {
                    hum_layer = 0;
                    show_analog_limit_low(alarm_limit.analog_othreshold, alarm_limit.analog_uthreshold);
                }
                set_limit_flag = 2;
            }
            else if (set_menu_flag == 3)
            {
                if (!light_layer)
                {
                    light_layer = 1;
                    show_light_limit_high(alarm_limit.lumin_othreshold, alarm_limit.lumin_uthreshold);
                    /* 显示光强阈值设置菜单 */
                }
                else
                {
                    light_layer = 0;
                    show_light_limit_low(alarm_limit.lumin_othreshold, alarm_limit.lumin_uthreshold);
                }
                set_limit_flag = 3;
            }
            else
            {
                set_menu_flag = 0;
                set_limit_flag = 0;
            }
            break;

        case BUTTON_12://向下键
            if (set_limit_flag == 0)    /* 向下键选择下一菜单时 */
            {
                if (set_menu_flag == 1)
                {
                    show_setmenu_b();//换菜单
                    set_menu_flag = 2;/*设置完本项再设置下一项*/
                }
                else if (set_menu_flag == 2)
                {
                    show_setmenu_c();
                    set_menu_flag = 3;
                }
                else if (set_menu_flag == 3)
                {
                    set_menu_flag = 3;
                }
                else
                {
                    set_menu_flag = 0;
                }
            }
            else if (set_limit_flag == 1)   /* 设置温度阈值时,按向下键减少设定值 */
            {
                if (temp_layer)
                {
                    alarm_limit.temp_othreshold++;//值

                    if (alarm_limit.temp_othreshold >= 99)
                        alarm_limit.temp_othreshold = 99;

                    show_temp_limit_high(alarm_limit.temp_othreshold, alarm_limit.temp_uthreshold);
                    //显示上、下限设置结果
                }
                else
                {
                    alarm_limit.temp_uthreshold++;

                    if (alarm_limit.temp_uthreshold >= 99)
                        alarm_limit.temp_uthreshold = 99;

                    show_temp_limit_low(alarm_limit.temp_othreshold, alarm_limit.temp_uthreshold);
                }
            }
            else if (set_limit_flag == 2)   /* 设置模入阈值,增加 */
            {
                if (hum_layer)
                {
                    alarm_limit.analog_othreshold++;

                    if (alarm_limit.analog_othreshold >= 1023)
                        alarm_limit.analog_othreshold = 1023;

                    show_analog_limit_high(alarm_limit.analog_othreshold, alarm_limit.analog_uthreshold);
                }
                else
                {
                    alarm_limit.analog_uthreshold++;

                    if (alarm_limit.analog_uthreshold >= 99)
                        alarm_limit.analog_uthreshold = 99;

                    show_analog_limit_low(alarm_limit.analog_othreshold, alarm_limit.analog_uthreshold);
                }
            }
            else if (set_limit_flag == 3)   /* 设置光强阈值,增加 */
            {
                if (light_layer)
                {
                    alarm_limit.lumin_othreshold++;

                    if (alarm_limit.lumin_othreshold >= 99)
                        alarm_limit.lumin_othreshold = 99;

                    show_light_limit_high(alarm_limit.lumin_othreshold, alarm_limit.lumin_uthreshold);
                }
                else
                {
                    alarm_limit.lumin_uthreshold++;

                    if (alarm_limit.lumin_uthreshold >= 99)
                        alarm_limit.lumin_uthreshold = 99;

                    show_light_limit_low(alarm_limit.lumin_othreshold, alarm_limit.lumin_uthreshold);
                }
            }
            break;

        case BUTTON_8:
            if (set_limit_flag == 0)         /* 选择菜单,增加/往上功能 */
            {
                if (set_menu_flag == 3)
                {
                    show_setmenu_d();
                    set_menu_flag = 2;
                }
                else if (set_menu_flag == 2)
                {
                    show_setmenu_a();
                    set_menu_flag = 1;
                }
                else if (set_menu_flag == 1)
                {
                    set_menu_flag = 1;
                }
                else
                {
                    set_menu_flag = 0;
                }
            }
            else if (set_limit_flag == 1)   /* 设置温度阈值,减少 */
            {
                if (temp_layer)
                {
                    if (alarm_limit.temp_othreshold > 0)
                        alarm_limit.temp_othreshold--;

                    if (alarm_limit.temp_othreshold <= 0)
                        alarm_limit.temp_othreshold = 0;

                    show_temp_limit_high(alarm_limit.temp_othreshold, alarm_limit.temp_uthreshold);
                }
                else
                {
                    if (alarm_limit.temp_uthreshold > 0)
                        alarm_limit.temp_uthreshold--;

                    if (alarm_limit.temp_uthreshold <= 0)
                        alarm_limit.temp_uthreshold = 0;

                    show_temp_limit_low(alarm_limit.temp_othreshold, alarm_limit.temp_uthreshold);
                }
            }
            else if (set_limit_flag == 2)   /* 设置模入阈值,减少 */
            {
                if (hum_layer)
                {
                    if (alarm_limit.analog_othreshold > 0)
                        alarm_limit.analog_othreshold--;

                    if (alarm_limit.analog_othreshold <= 0)
                        alarm_limit.analog_othreshold = 0;

                    show_analog_limit_high(alarm_limit.analog_othreshold, alarm_limit.analog_uthreshold);
                }
                else
                {
                    if (alarm_limit.analog_uthreshold > 0)
                        alarm_limit.analog_uthreshold--;

                    if (alarm_limit.analog_uthreshold <= 0)
                        alarm_limit.analog_uthreshold = 0;

                    show_analog_limit_low(alarm_limit.analog_othreshold, alarm_limit.analog_uthreshold);
                }
            }
            else if (set_limit_flag == 3)   /* 设置光强阈值,减少 */
            {
                if (light_layer)
                {
                    if (alarm_limit.lumin_othreshold > 0)
                        alarm_limit.lumin_othreshold--;

                    if (alarm_limit.lumin_othreshold <= 0)
                        alarm_limit.lumin_othreshold = 0;

                    show_light_limit_high(alarm_limit.lumin_othreshold, alarm_limit.lumin_uthreshold);
                }
                else
                {
                    if (alarm_limit.lumin_uthreshold > 0)
                        alarm_limit.lumin_uthreshold--;

                    if (alarm_limit.lumin_uthreshold <= 0)
                        alarm_limit.lumin_uthreshold = 0;

                    show_light_limit_low(alarm_limit.lumin_othreshold, alarm_limit.lumin_uthreshold);
                }
            }
            break;

        case BUTTON_4: /* 返回上一级菜单 */
            if (set_limit_flag == 0)
            {
                show_title();
                set_menu_flag = 0;
            }
            else if (set_menu_flag == 1)
            {
                show_setmenu_a();
                set_limit_flag = 0;
            }
            else if (set_menu_flag == 2)
            {
                show_setmenu_b();
                set_limit_flag = 0;
            }
            else if (set_menu_flag == 3)
            {
                show_setmenu_c();
                set_limit_flag = 0;
            }
            temp_layer = 0;

            break;

        case BUTTON_15://设置继电器开关
            CTRL_RELAY = ~CTRL_RELAY;
            if (CTRL_RELAY) /* 继电器开 */
            {
                show_relay_on(); /* 显示继电器开状态 */
            }
            else
            {
                show_relay_off();/* 显示继电器关状态 */
            }
            break;

        case BUTTON_11: /* 增加模拟量输出 */
            analog_out_data++;
            if (analog_out_data >= 0x3ff) /* 十位da输出 */
                analog_out_data = 0x3ff;

            show_analog_out(analog_out_data);
            dac_5615(analog_out_data);

            break;

        case BUTTON_7: /* 减少模拟量输出 */
            if (analog_out_data > 0)
                analog_out_data--;

            if (analog_out_data <= 0)
                analog_out_data == 0;

            show_analog_out(analog_out_data);
            dac_5615(analog_out_data);
            break;

        default:
            break;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -