找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机按键程序,支持连按(中断实现)

[复制链接]
跳转到指定楼层
楼主
ID:222142 发表于 2018-9-26 09:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "INT.h"

void INT_Initial(void)
{        
        INTEDG = 0;                                //0 下降沿触发  1 上升沿触发
        
        TRISBbits.TRISB0 = 1;        //RB0设置为输入
        LATBbits.LATB0 = 1;                //设置初始状态位高电平 , 为下降沿触发中断做准备
        
        INTCONbits.GIE = 1;                //允许所有中断
        INTCONbits.PEIE = 1;        //允许外设中断
        
        /*外部中断初始位*/
        INTCONbits.INTE = 1;        //允许外部中断
        INTCONbits.INTF = 0;        //外部中断标志位清0
        
        /*定时器0中断初始位*/
        INTCONbits.TMR0IE = 1;        //允许定时器0溢出中断
        INTCONbits.TMR0IF = 0;        //定时器0溢出中断标志位清0
        
        /*定时器1中断初始位*/
        PIE1bits.TMR1IE = 1;        //允许定时器1溢出中断
        PIR1bits.TMR1IF = 0;        //定时器1溢出中断标志位清0
        
        /*ADC中断初始位*/
        PIE1bits.ADIE = 1;                //允许ADC中断
        PIR1bits.ADIF = 0;                //ADC中断标志位清0
        
}        

void Get_KeyValue(void)
{

    if((timing_s_count2 - key_keep_time) < 1)
    {
            switch (key_value_buffer){
                case 0xFE://S1 K1 RF0
                    KeyCode = KEY_ENTER;
                    break;
//                case 0xFD://S3 K2 RF1
//                    KeyCode = KEY_UP;
//                    break;
                case 0xFB://S5 K3 RF2
                    KeyCode = KEY_LIGHT;
                    break;
//                case 0xF7://S7 K4 RF3
//                    KeyCode = KEY_DOWN;
//                    break;
                case 0xEF://S2 K5 RF4
                    KeyCode = KEY_BACK;
                    break;
                case 0xDF://S4 K6 RF5
                    KeyCode = KEY_FAN;
                    break;
//                case 0xBF://S6 K7 RF6
//                    KeyCode = KEY_STDBY;
//                    break;
                case 0x7F://S8 K8 RF7
                    KeyCode = KEY_SETUP;
                    break;
                default:
                    KeyCode = 0;
                    break;
                           }                        
    }


    key_action_flag = 0;
}


void Get_key_valve_Long_press(void)
{
           if((timing_s_count2 - key_keep_time) > 1)
                {
        switch (key_value_buffer)
                {
            case 0xFE:
                KeyCode = KEY_SETUP;
                break;               
                case 0xBF://S6 K7 RF6
                    KeyCode = KEY_STDBY;
                    break;
            default:
                key_action_flag_Long_press = 0;
                break;
                        }
                        key_action_flag_Long_press = 0;
                  }         

}
void Get_key_valve_continuty(void)
{
                if(key_action_flag_continuty == 1)
                {
                 switch (PORTF){
                case 0xFD://S3 K2 RF1
                    test_show_num = KEY_UP;
                    break;
                case 0xF7://S7 K4 RF3
                    test_show_num = KEY_DOWN;
                    break;
                default:
                test_show_num = 0;
                break;
                           }        
            }

}


void interrupt ISR(void)
{
        /*定时器0中断服务程序段*/
        if(TMR0IE & TMR0IF)
        {        
                TMR0 = 0x07;
               
                timing_ms_count1++;
                timing_ms_count3++;
        
               
                if(timing_ms_count1 % 300 == 0 && timing_ms_count1 != 0)
                {
                        if(S16 == 1)
                        {
                                S15 = ~S15;
                        }
                        
                        if(S11 == 1)
                        {
                                S12 = ~S12;
                        }
                        
                        if(warning_flag == 1)
                        {
                                S1 = ~ S1;
                        }        
                }
               
                if(timing_ms_count1 % 500 == 0 && timing_ms_count1 != 0)
                {
                        timing_half_s_count1++;
                }
               
                if(timing_ms_count1 % 450 == 0 && timing_ms_count1 != 0)
                {
                        LCD_showFanrun();
                }                                
               
                TMR0IF = 0;
        }        
        
        /*定时器1中断服务程序段*/
        if(TMR1IE & TMR1IF)
        {
                TMR1H = 0xFF;
                TMR1L = 0x08;        
                        
                timing_ms_count2++;               
                if(timing_ms_count2 % 1000 == 0)
                {                        
                        /*计时时间处理*/
                        if(S13 == 1)
                        {
                                timing_count_sec_set--;
                        }
                        
                        Key_isrelease_time++;        //按键释放时间计时
                        
                        timing_s_count1++;                //秒计时器1(未用)
                        
                        /*系统运行时间处理*/
                        timing_s_count2++;                                       
                        if(timing_s_count2 % 60 == 0)
                        {
                                timing_s_count2 = 0;
                                sys_time_minute++;
                                if(sys_time_minute % 30 == 0)
                                {
                                        sys_time_minute=0;
                                        sys_time_half_hour++;        //运行半小时计时
                                        if(sys_time_half_hour % 1440 == 0)
                                        {
                                                sys_time_half_hour = 0;
                                                sys_time_month++;//运行月份计时
                                        }        
                                }               
                        }               
                }
               
               
               
                if((PORTF != 0xFF) && (key_action_flag == 1))
                {
                                Get_KeyValue();
                        
                                key_count = 0;
                                
                }
               
                if((PORTF != 0xFF) && (key_action_flag_Long_press == 1))
                {
                                Get_key_valve_Long_press();
                }
               
                if((PORTF != 0xFF) && (key_action_flag_continuty == 1))
                {
                                Get_key_valve_continuty();
                }
               
                if(timing_ms_count2 % 200 == 0)
                {               
                        if((test_show_num == KEY_UP) || (test_show_num == KEY_DOWN))
                                KeyCode = test_show_num;
                                
                }
                if(PORTF == 0xFF)
                {
                                test_show_num = 0;
                                key_action_flag_continuty == 0;
                }
               
                if((KeyCode == KEY_UP) || (KeyCode == KEY_DOWN))
        {
            Key_isrelease_time = 0;
            }
                        
                TMR1IF = 0;
        }
        
        /*外部中断服务程序段*/
        if(INTF == 1)
        {
                if(PORTF != 0xFF && key_action_flag == 0)
                {
                        key_action_flag = 1;
                        key_action_flag_Long_press = 1;
                        key_action_flag_continuty = 1;
                        key_value_buffer = PORTF;
                        key_keep_time = timing_s_count2;
                }
                                
                INTF = 0;
                INTE = 0;
                TRISBbits.TRISB0 = 0;
                LATBbits.LATB0 = 1;
                TRISBbits.TRISB0 = 1;
        }
        
        /*ADC中断服务程序段*/
//        if(ADIE & ADIF)
//        {
//                ADIF = 0;
//        }                        
}        

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

使用道具 举报

沙发
ID:1 发表于 2018-9-26 15:45 | 只看该作者
补全原理图或者详细说明一下电路连接即可获得100+黑币
回复

使用道具 举报

板凳
ID:66287 发表于 2018-9-27 09:29 | 只看该作者
高手!一句注释都没有,真高人
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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