导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→关于复合键盘的程序编写,肯请高手高见[月如镜]

 *第15942篇: 关于复合键盘的程序编写,肯请高手高见

  
楼 主:月如镜 2003年9月1日18:47
 关于复合键盘的程序编写,肯请高手高见
如果可以,不妨给我一点这方面的范例,谢谢。本人的QQ是185193748,希望能跟各位交朋友,无论新手还是老手。
  
2楼:sosa_gu 2003年9月2日13:48
 要有一个标志,用他计按键的次数,再做一个
要有一个标志,用他计按键的次数,再做一个表格,对应不同的键解析。
  
3楼:月如镜 2003年9月2日23:31
 大哥,我说的是2个键同时按下,而不是一个键按的次数
请问我在用这种键盘时,我可以用一个寄存器指到这几个脚上去,根据按键的不同有不同的返回值,这可以设置,至于我在按键时怎样让系统知道,该用什么方法,注:我在显示电路中已经用了单片机的定时器0中断。
  
4楼:luyue 2003年9月2日23:40
 不知道你是什么意思,有关处理软件
无论是采用中断方式还是定时扫描,只能确定有键按下,下一步还是要读入键值,单件还是双键或多键,转入相应的子程序处理即可.但是这种处理方法有点问题,很少有同时两个按键的情况,我看还是现检测按键,然后再在键处理子程序中检测是否有换档键发生,这样就可以区分了.
  
5楼:月如镜 2003年9月3日22:39
 大家看看这个程序,可否解释一下
#include   <reg51.h>  
sbit PinScanKey1=P1^4;
sbit PinScanKey2=P1^5;
sbit PinScanKey3=P1^6;
sbit PinScanKey4=P0^4;
sbit PinScanKey5=P0^3;
#define TRUE 1
#define FALSE 0
#define DELAY_value 5
unsigned char a[8];
unsigned char bdata count;
sbit count0=count^0;
sbit count1=count^1;
sbit count2=count^2;
sbit p2_4=P2^4;
sbit p0_6=P0^6;
sbit p0_5=P0^5;
code unsigned char tb[31]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e,0x2e,0x1c,0x72,0x2a,0x3a,0xce,0x7c,0x00,0x10,0x80,0x02,0x82,0x1e,0x12,0x92};
/* ?0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,h,l,j,n,o,p,u,dark,low-,high-,mid-,high=,t,low=,三?``
*/


void delay(short i);
void keyinit(void);
unsigned char keyscan(void);

void coms() interrupt 1
 { TH0=0xf8;
   TL0=30;
   SBUF=tb[a[count]];
   p2_4=count0;
   p0_6=count1;
   p0_5=count2;
   while(TI) {
   TI=0; }
   if(count  <7)count++;
   else count=0;
  }

 void sinit(void)
 {SCON=0;
 TMOD=1;
 TH0=0x80;
 TL0=0x20;
 TR0=1;
 EA=1;
 ET0=1;
 TI=0;
 }

void keyinit(void)
{PinScanKey1=1;
 PinScanKey2=1;
 PinScanKey3=1;
 PinScanKey4=1;
 PinScanKey5=1;
}


void delay(short i)
{
   int k=0;
   k=i*DELAY_value;
   while(k--);
}

unsigned char keyscan()
{ if((PinScanKey1==FALSE)&&(PinScanKey2==FALSE))
         {delay(DELAY_value);
              if((PinScanKey1==FALSE)&&(PinScanKey2==FALSE))
                  {delay(DELAY_value);
                      if((PinScanKey1==FALSE)&&(PinScanKey2==FALSE))
                                return 6;}
         }
   if((PinScanKey1==FALSE)&&(PinScanKey3==FALSE))
         {delay(DELAY_value);
               if((PinScanKey1==FALSE)&&(PinScanKey3==FALSE))
                        {delay(DELAY_value);
                              if((PinScanKey1==FALSE)&&(PinScanKey3==FALSE))
                                   return 7;}
          }


   if(PinScanKey1==FALSE)
        {delay(DELAY_value);
           if(PinScanKey1==FALSE)
               {delay(DELAY_value);
                  if(PinScanKey1==FALSE)
                        return 1;}
         }

   if(PinScanKey2==FALSE)
          {delay(DELAY_value);
              if(PinScanKey2==FALSE)
                  {delay(DELAY_value);
                     if(PinScanKey2==FALSE)
                          return 2;}
           }

   if(PinScanKey3==FALSE)
        {delay(DELAY_value);
            if(PinScanKey3==FALSE)
                {delay(DELAY_value);
                   if(PinScanKey3==FALSE)
                       return 3;}
         }

  if(PinScanKey4==FALSE)
     {delay(DELAY_value);
           if(PinScanKey4==FALSE)
              {delay(DELAY_value);
                 if(PinScanKey4==FALSE)
                         return 4;}
     }


   if(PinScanKey5==FALSE)
       {delay(DELAY_value);
          if(PinScanKey5==FALSE)
              {delay(DELAY_value);
                  if(PinScanKey5==FALSE)
                      return 5;}
            }

   else return(a[7]);


   }
void main(void)
{
   sinit();
    do
   {keyinit();
   a[7]=keyscan();
   }while(1);
 }
这个程序是按键后,从数码管显示出来,比如按了1键,会显示1,按5会显示5,按1和2会显示6,按1和3会显示7,但是有一点,就是在按1到4这四个键时,没有问题,不按键时,数码管继续显示,但是5和6,7的话,松开手后立即就不显示了,请问谁能帮我解释一下。

  
6楼:guantingwei 2003年9月4日20:35
 编码键盘?
  
7楼:月如镜 2003年9月4日23:40
 请问如何在一个程序里调用2个定时中断,一显示,一键盘。
以下是引用guantingwei在2003-9-4 20:35:29的发言:
编码键盘?


  不知,这样的程序该怎么初始化。
  
8楼:guantingwei 2003年9月5日22:01
 怎么个两个定时中断?请详讲。
是有两个定时器,在其分别的中断服务程序中一个进行显示一个进行键盘查询?(这样可以先分别进行参数设置,最后同时开中断)还是怎么的。其实可以用专用的键盘显示芯片如7289,7189,这样可以免去很多麻烦的啊。


以下是引用月如镜在2003-9-4 23:40:41的发言:
请问如何在一个程序里调用2个定时中断,一显示,一键盘。[quote]以下是引用guantingwei在2003-9-4 20:35:29的发言:
 编码键盘?
 [/quote]
   不知,这样的程序该怎么初始化。

  
9楼:月如镜 2003年9月6日00:32
 对,一个是显示中断,一个是键盘中断,电路已设计好,请问:
该怎样对系统进行初始化。
  
10楼:guantingwei 2003年9月7日10:39
 两个定时中断啊,应该
两个定时中断啊,肯定不能同时处理了,可以在两个中断服务程序中相互控制,如刚开始只开键盘中断,查询完毕后再关闭键盘中断,开显示中断,显示中断亦是类似方法。


以下是引用月如镜在2003-9-6 0:32:51的发言:
对,一个是显示中断,一个是键盘中断,电路已设计好,请问:该怎样对系统进行初始化。


>>>>>>对该主题发表你的看法

本主题贴数10,分页: [第1页]


[上一篇主题]:闲聊

[下一篇主题]:关于复合键盘的程序编写,肯请高手高见