一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 2167|回复: 3

[其他综合] 1个独立按键实现长短按键功能

[复制链接]
发表于 2013-5-26 23:41 | 显示全部楼层 |阅读模式
大家好,找了个一个按键 能实现长短按键的逻辑功能图,看了半天没有怎么看明白吧。不会写代码,怎样实现图中的功能, 贴上来,请大家给讲解下,谢谢大家了。
自己试着摸索些了部分代码,可好像没有实现图中的功能,请哪位网友给讲讲。




单个按键长短按

单个按键长短按

Tri_Menu_Logic_v1.rar

6.41 KB, 下载次数: 727, 下载积分: 一乐金币 -1

按键 逻辑图

 楼主| 发表于 2013-5-26 23:42 | 显示全部楼层
自己练习的部分代码:
/*********************************************************************
*       
*
*
*
*
*        2013.05.22  
/*********************************************************************/

// #include "STC12C2052AD.H"
// #include <regX52.h>
#include "STC15F2K08S2.H"
#include <intrins.h>

#define uchar unsigned char
#define uint  unsigned int

#define led_1_close LED_1 = 0;
#define led_1_open  LED_1 = 1;
#define led_2_close LED_2 = 0;
#define led_2_open  LED_2 = 1;

#define delay_number   25  //按键去抖动延时阀值


// sbit led0 = P1^0;                //LED 发光二极管
sbit led0 = P1^1;
// sbit led2 = P1^2;
sbit led1 = P2^1;
sbit led2 = P2^2;


sbit Func_key_in = P3^2;


sbit LED_1 = P2^6;        //正视左边第一个数码管位选
sbit LED_2 = P2^7;        //正视右边第一个数码管位选

bit bit_1s;
bit bwei;

const unsigned char code LED_SEG[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};//0-9

//数码管:正向位置;共阳极;正向连接
const unsigned char code Segment_7code[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,
                                                                                                                                                                        0x83,0xC6,0xA1,0x86,0x8E,0xFF};//0-9,A-F,灭
                                                                                                                                                                        /*
                                                                                                                                                                         P -> 0x8c,t -> 0x87,C -> 0xc6,c -> 0xa7,
                                                                                                                                                                        */

unsigned char key_lock1,Counter = 99;
unsigned char time_10ms,time_100ms,time_300ms,buffer[2];
unsigned char key_step,key_value;/*keyvalue == 8*/
unsigned char t1_value,t2_value,t3_value,T;
unsigned char P1_value,P2_value,P3_value;  //Product1,

unsigned int delay_cnt1;
unsigned int C1,C2,C3;

void DelayMs(uint x);


void key_scan()                                //按键扫描函数
{  

        Func_key_in = 1;        //置1 输入,准备读入按键       
  if(Func_key_in == 1)    //IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
  {
                key_lock1 = 0;  
                delay_cnt1 = 0;        
        }
        else if(Func_key_in == 0)  
  {
   ++delay_cnt1;  //延时计数器
   if(delay_cnt1 > delay_number)
                {
                        delay_cnt1 = 0;
                        key_lock1 = 1;  
      key_value = 1;         //触发1号键
                        key_step++;
                        if(key_step > 6){ //4
                                key_step = 0;                                       
                        }
                }
        }       
}


void key_process()
{
        switch(key_step)
        {
                case 1:       
                        if(bit_1s){
                               
                        P0 = 0x87;//t
                        P26 = 0;
                        DelayMs(2);
                        P26 = 1;
                       
                        P0 = Segment_7code[1];         //1
                        P27 = 0;       
                        DelayMs(2);
                        P27 = 1;
                        }else{
                        P0 = Segment_7code[2];
                        P26 = 0;
                        DelayMs(2);
                        P26 = 1;
                       
                        P0 = Segment_7code[6];         //1
                        P27 = 0;       
                        DelayMs(2);
                        P27 = 1;
                        }
                       
       
                                               
                break;               
       
                case 2:
                        P0 = 0x87;//t
                        P26 = 0;
                        DelayMs(2);
                        P26 = 1;
                       
                        P0 = Segment_7code[2];
                        P27 = 0;       
                        DelayMs(2);
                        P27 = 1;
                       
                        break;
               
                case 3:
                        P0 = 0x87;//t
                        P26 = 0;
                        DelayMs(2);
                        P26 = 1;
                       
                        P0 = Segment_7code[3];         //1
                        P27 = 0;       
                        DelayMs(2);
                        P27 = 1;
                       
                        break;
                case 4:
                        P0 = 0x8c;//t
                        P26 = 0;
                        DelayMs(2);
                        P26 = 1;
                       
                        P0 = Segment_7code[1];         //1
                        P27 = 0;       
                        DelayMs(2);
                        P27 = 1;
                        break;
                case 5:
                        P0 = 0x8c;//t
                        P26 = 0;
                        DelayMs(2);
                        P26 = 1;
                       
                        P0 = Segment_7code[2];         //1
                        P27 = 0;       
                        DelayMs(2);
                        P27 = 1;
                        break;
                case 6:
                        P0 = 0x8c;//t
                        P26 = 0;
                        DelayMs(2);
                        P26 = 1;
                       
                        P0 = Segment_7code[3];         //1
                        P27 = 0;       
                        DelayMs(2);
                        P27 = 1;
                        break;
                case 7:
                        P0 = 0xff;
                        break;
               
                default:
                        break;
               
        }
       
}

void DelayMs(uint x)
{
        uchar t;
        while(x--)
        {
                 for(t=120;t>0;t--);
        }
}


void timer0_ser() interrupt 1{
       
        static unsigned char t;
        TR0 = 0;
        TH0 = (65536 - 50000) / 256;
        TL0 = (65536 - 50000) % 256;
        t++;
        if(t >= 20){        //50ms*20=1s  
                t = 0;
//                 bit_1s = 1;
                bit_1s = ~bit_1s;
                led0 = ~led0;       
                 Counter--;
                if(Counter <= 0){
                        Counter = 99;
                }
        }
        TR0 = 1;
}


void display_data(){
               
        P0 = buffer[1];
        P26 = 1;
        DelayMs(2);
        P26 = 0;
       
        P0 = buffer[0];
        P27 = 1;       
        DelayMs(2);
        P27 = 0;
       
}






/*****************************************************************/
void timer1_ser(void)interrupt 3
{                 
               
        TR1 = 0;                                       
        TH1 = 0Xf8;                //2ms value
        TL1 = 0Xcd;               
        time_10ms++;
        //2ms 定时中断到了,这里显示数码管驱动
        if(time_10ms >=5){
                time_10ms = 0;
                key_scan();        //10MS 到了 定时扫描按键
        }
        time_100ms++;
        if(time_100ms >= 50){//100ms flash
                time_100ms = 0;       
                led1 = ~led1;       
                time_300ms++;
                if(time_300ms >= 3){//300ms flash
                        time_300ms = 0;
                        led2 = ~led2;
                }
        }       
        TR1 = 1;
}
       

void main(void)
{
               
        TMOD |= 0x11;        //        timer 0 and timer1 mode 1 16bit       
        TH0 = (65536 - 50000) / 256;
        TL0 = (65536 - 50000) % 256;
        TH1        =        0Xf8;                                 //2ms  11.0592M
        TL1        =        0Xcd;       
        TR0 = 1;
        ET0 = 1;
        TR1 = 1;
        ET1 = 1;
        EA  = 1;
       
        P26 = 1;
        P27 = 1;               

        while(1)
        {       
               
                key_process();       
//                  numberToBuffer();
//                 display_data();
//                
               
        }
}



回复

使用道具 举报

发表于 2013-5-27 01:01 | 显示全部楼层
带长短按功能的按键扫描程序
https://www.yleee.com.cn/forum.p ... 347&fromuid=551
(出处: 一乐电子百科)
看这个能不能帮到你。
回复

使用道具 举报

 楼主| 发表于 2013-5-30 15:31 | 显示全部楼层
昨天调试了,没有实现效果呀。长短按效果。
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-11-1 08:08 , Processed in 0.033856 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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