智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 2102|回复: 5
打印 上一主题 下一主题

[软件类] 键盘问题

[复制链接]

14

主题

295

帖子

0

精华

常驻嘉宾

打酱油出道。。。

Rank: 8Rank: 8

积分
5865

优秀会员奖章活跃会员奖章在线王奖章论坛元老奖章

威望
1727
贡献
1258
兑换币
1045
注册时间
2012-11-10
在线时间
1440 小时
跳转到指定楼层
1#
发表于 2013-1-10 15:02:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1贡献
unsigned char key(void)
{
       
       
        key7=0;
        key6=1;
        key5=1;
        key4=1;
               
        asm("NOP");       
        asm("NOP");
        asm("NOP");       
        asm("NOP");       
if(key0==0)
        {
                  return 1;
                               
         }
        else if(key1==0)
        {
return 2;
       
        }
        else if(key2==0)
        {
return 3;
       
        }
        else if(key3==0)
        {
                return 4;
       
        }
       

        temp=PORTA;
        temp=temp&0xf0;
        while(temp!=0xf0)
        {
          temp=PORTA;
          temp=temp&0xf0;
       
        }
       
        key7=1;
        key6=0;
        key5=1;
        key4=1;       
        asm("NOP");       
        asm("NOP");
        asm("NOP");       
        asm("NOP");       
        if(key0==0)
        {               
                return 5;
       
        }
        else if(key1==0)
        {
                return 6;
               
        }
        else if(key2==0)
        {
                return 7;
       
        }       
        else if(key3==0)
        {
                return 8;
       
        }
        temp=PORTA;
        temp=temp&0xf0;
        while(temp!=0xf0)
        {
          temp=PORTA;
          temp=temp&0xf0;
       
        }
       
        key7=1;
        key6=1;
        key5=0;
        key4=1;       
        asm("NOP");       
        asm("NOP");
        asm("NOP");       
        asm("NOP");       
        if(key0==0)
        {       
                 
                return 9;
       
        }
        else if(key1==0)
        {
                return 10;
       
        }
        else if(key2==0)
        {
                return 11;
       
        }
        else if(key3==0)
        {
                return 12;
       
        }
        temp=PORTA;
        temp=temp&0xf0;
        while(temp!=0xf0)
        {
          temp=PORTA;
          temp=temp&0xf0;
       
        }
        key7=1;
        key6=1;
        key5=1;
        key4=0;       
        asm("NOP");       
        asm("NOP");
        asm("NOP");       
        asm("NOP");       
        if(key0==0)
        {               
                return 13;
       
        }
        else if(key1==0)
        {
                return 14;
       
        }
        else if(key2==0)
        {
                return 15;
       
        }
        else if(key3==0)
        {
                return 16;
       
        }
        temp=PORTA;
        temp=temp&0xf0;
        while(temp!=0xf0)
        {
          temp=PORTA;
          temp=temp&0xf0;
       
        }
       
        return 0;
}

void keyswait()
{

          temp=PORTA;
          temp=temp&0xf0;
          while(temp!=0xf0)
          {
            temp=PORTA;
            temp=temp&0xf0;
         
          }
}

void keyout(void) {

out=key();
if(out==1)
{
  LCD_write_hanzi(0,0,0);
  }
  else if(out==2) {
  LCD_write_hanzi(2,0,1);

}
else if(out==3){
  LCD_write_hanzi(4,0,2);

}
else if(out==4){
LCD_write_hanzi(6,0,3);
}

}
void init(){
    DDRM=0xff;
    DDRA=0xf0;


}
键盘定义的PA口,调试一点用都没有,什么问题

最佳答案

查看完整内容

Sorry,刚没仔细看。你的按键程序没有什么问题。我在PIC18F452上测试正常。你在注意端口定义,输入输出设置和硬件连接,应该不会有问题的。不过我建议你可以像我之前发的那样写,程序简洁。以下是我在开发板上的测试程序,你自己对照下。 #include #pragma config OSC=HS #pragma config WDT=OFF #pragma config LVP=OFF #define key7 PORTCbits.RC0 //定义键盘接口 #define key6 PORTCbits.RC1 ...

3

主题

61

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1405
威望
642
贡献
359
兑换币
334
注册时间
2012-9-23
在线时间
202 小时
2#
发表于 2013-1-10 15:02:33 | 只看该作者
本帖最后由 _若失心便死╮ 于 2013-1-10 21:06 编辑
杀手王旭 发表于 2013-1-10 17:14
能不能帮我的修改下

Sorry,刚没仔细看。你的按键程序没有什么问题。我在PIC18F452上测试正常。你在注意端口定义,输入输出设置和硬件连接,应该不会有问题的。不过我建议你可以像我之前发的那样写,程序简洁。以下是我在开发板上的测试程序,你自己对照下。

#include <p18F452.h>      
#pragma config OSC=HS
#pragma config WDT=OFF
#pragma config LVP=OFF

#define key7  PORTCbits.RC0           //定义键盘接口
#define key6  PORTCbits.RC1           
#define key5  PORTCbits.RC2           
#define key4  PORTCbits.RC3           
#define key0  PORTCbits.RC4           
#define key1  PORTCbits.RC5           
#define key2  PORTCbits.RC6   
#define key3  PORTCbits.RC7           

const unsigned char LED[16]=
{
0x3f,     //0
0x06,    //1
0x5b,          //2
0x4f,          //3
0x66,          //4
0x6d,          //5
0x7d,          //6
0x07,          //7
0x7f,          //8
0x6f,          //9
0x77,          //A
0x7C,          //B
0x39,          //C
0x5E,          //D
0x79,          //E
0x71,          //F
};

unsigned char key(void)
{
        int temp;
        key7=0;
        key6=1;
        key5=1;
        key4=1;

        Nop();        
        Nop();
        Nop();        
        Nop();        
      if(key0==0)
        {
          return 1;

         }
        else if(key1==0)
        {
          return 2;

        }
        else if(key2==0)
        {
          return 3;

        }
        else if(key3==0)
        {
          return 4;

        }

        temp=PORTC;            
        temp=temp&0xf0;
        while(temp!=0xf0)
        {
          temp=PORTC;
          temp=temp&0xf0;
        }

        key7=1;
        key6=0;
        key5=1;
        key4=1;        
        Nop();        
        Nop();
        Nop();        
        Nop();        
        if(key0==0)
        {               
        return 5;

        }
        else if(key1==0)
        {
         return 6;      
        }
        else if(key2==0)
        {
         return 7;
        }        
        else if(key3==0)
        {
         return 8;
        }
        temp=PORTC;
        temp=temp&0xf0;
        while(temp!=0xf0)
        {
          temp=PORTC;
          temp=temp&0xf0;
        }

        key7=1;
        key6=1;
        key5=0;
        key4=1;        
        Nop();        
        Nop();
        Nop();        
        Nop();        
        if(key0==0)
        {        

         return 9;
        }
        else if(key1==0)
        {
          return 10;
        }
        else if(key2==0)
        {
         return 11;
        }
        else if(key3==0)
        {
         return 12;
        }
        temp=PORTC;
        temp=temp&0xf0;
        while(temp!=0xf0)
        {
          temp=PORTC;
          temp=temp&0xf0;
        }
        key7=1;
        key6=1;
        key5=1;
        key4=0;        
        Nop();        
        Nop();
        Nop();        
        Nop();        
        if(key0==0)
        {               
         return 13;
        }
        else if(key1==0)
        {
         return 14;
        }
        else if(key2==0)
        {
         return 15;
        }
        else if(key3==0)
        {
         return 16;
        }
        temp=PORTC;
        temp=temp&0xf0;
        while(temp!=0xf0)
        {
          temp=PORTC;
          temp=temp&0xf0;
        }
        return 0;
}


void main(void)
{
        unsigned char keybuf;
        ADCON1=0X06;            //所有IO均为数字口,模拟量输入禁止
        TRISD=0X00;                   //RD设置为输出  
        TRISC=0B11110000;           //RC0-3设置为输出,RC4-7设置为输入                                   
          while(1)
          {            
              keybuf=key();
         if(keybuf>=1&&keybuf<=16)      
         PORTD=LED[keybuf-1];
                   else PORTD=0;
          }
}


回复

使用道具 举报

3

主题

61

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1405
威望
642
贡献
359
兑换币
334
注册时间
2012-9-23
在线时间
202 小时
3#
发表于 2013-1-10 16:45:38 | 只看该作者
      4×4键盘是通过按键扫描来读取键值的,每次读取按键值之前,必需确保有按键按下(目测你的程序这里没注意)。如果没有按下,就应该等待按键,按下后再去判断按下的是哪颗键。以下是我写的扫面程序(我在PIC18上测试通过)。
/*******************************************************************************************
            4*4按键扫描 PORTC低四位输入,高四位输出,注意:输入端必须是键盘上接上拉电阻的端口
*********************************************************************************************/   


#define KEYPORT PORTC                            //按键接口
int GetNum(void);                                      //获取单个按键
rom near char lookup[4][4]=                      //4*4按键返回查询数组
{
  { 0, 1, 2, 3},
  { 4, 5, 6, 7},
  { 8, 9,10,11},
  {12,13,14,15}
};

//-----------------------------按键去抖函数---------------------------------------
void qudou(char bit)
{
   do{
        while((KEYPORT&bit)!=bit);
        Delay1KTCYx(15);
      }
    while((KEYPORT&bit)!=bit);
  do{
     while((KEYPORT&bit)==bit);
     Delay1KTCYx(15);
    }   
  while((KEYPORT&bit)==bit);
}
//-------------------------------------------------------------------------------

//-------------------------读取键值------------------------------------------
int GetNum(){
TRISC=0X0F;
PORTC=keyline=keyrow=0;
qudou(0x0F);                                     //此函数保证有建按下并进行按键去抖
  PORTC=0XEF;
while((PORTC&0X0F)==0X0F)
{
  keyrow+=1;
  PORTC=(PORTC<<1)|1;
  if((PORTC&0XF0)==0XF0)
  PORTC=0XEF;
}
for(a=1;a!=0;a<<=1)
{
  if((PORTC&a)==0)
  break;
  keyline++;
}
return lookup[keyline][keyrow];
}


回复

使用道具 举报

14

主题

295

帖子

0

精华

常驻嘉宾

打酱油出道。。。

Rank: 8Rank: 8

积分
5865

优秀会员奖章活跃会员奖章在线王奖章论坛元老奖章

威望
1727
贡献
1258
兑换币
1045
注册时间
2012-11-10
在线时间
1440 小时
4#
 楼主| 发表于 2013-1-10 17:14:14 | 只看该作者
能不能帮我的修改下
回复

使用道具 举报

14

主题

295

帖子

0

精华

常驻嘉宾

打酱油出道。。。

Rank: 8Rank: 8

积分
5865

优秀会员奖章活跃会员奖章在线王奖章论坛元老奖章

威望
1727
贡献
1258
兑换币
1045
注册时间
2012-11-10
在线时间
1440 小时
5#
 楼主| 发表于 2013-1-10 17:14:50 | 只看该作者
_若失心便死╮ 发表于 2013-1-10 16:45
4×4键盘是通过按键扫描来读取键值的,每次读取按键值之前,必需确保有按键按下(目测你的程序这里没 ...

能不能帮我的修改下
回复

使用道具 举报

14

主题

295

帖子

0

精华

常驻嘉宾

打酱油出道。。。

Rank: 8Rank: 8

积分
5865

优秀会员奖章活跃会员奖章在线王奖章论坛元老奖章

威望
1727
贡献
1258
兑换币
1045
注册时间
2012-11-10
在线时间
1440 小时
6#
 楼主| 发表于 2013-1-11 12:35:51 | 只看该作者
_若失心便死╮ 发表于 2013-1-10 21:04
Sorry,刚没仔细看。你的按键程序没有什么问题。我在PIC18F452上测试正常。你在注意端口定义,输入输出设置 ...

非常感谢
回复

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-27 22:27 , Processed in 0.118157 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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