打印
[AVR单片机]

please……

[复制链接]
1878|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wucc2009|  楼主 | 2010-11-1 22:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是一个矩阵键盘按键的主函数


红色部分为判断按键式否松开,但其中定义PORTB=0xf0;但是无论怎么样while(PINB!=0xf0);括号里的一定不成立,那这个判断按键是否松开的演示函数不就没用了啊啊!!!


//读键盘值 键盘在端口B
uchar key_value()
{
uchar tem1,tem2,rem,i;
rem=0;                      //不清零会返回一个不可预知的值
DDRB=0xf0;                  //B口高四位输出 低四位输入
PORTB=0x0f;                 //输入有上拉电阻 输出低电平
s_ms(1);
tem1=PINB;                  //读取端口B
tem1=tem1&0x0f;
if(tem1!=0x0f)              //判断是否有键被按下
  {
  s_ms(200);                  //延时
  tem2=PINB;                //读取端口B
  tem2=tem2&0x0f;
  if(tem1==tem2)            //判断是否为干扰
    {
DDRB=0x0f;              //B口高四位输入 低四位输出
PORTB=0xf0;             //反相输出
s_ms(50);                  //换向后要延时
rem=PINB;               //读取端口B
rem=rem&0xf0;           //取高四位
rem=rem+tem1;           //合并
rem=~rem;

do                    //判断按键是否被释放
{
     PORTB=0xf0;
     s_ms(200);
  }while(PINB!=0xf0);

  }
return(rem);
}

相关帖子

沙发
宇宙飞船| | 2010-11-1 23:27 | 只看该作者
DDRB=0xf0;      //B口高四位输出 低四位输入
PORTB=0x0f;    //输入有上拉电阻 输出低电平  

do                    //判断按键是否被释放
{
     PORTB=0xf0;      //干嘛把其低四位输入置成三态??原来是有上拉的确定高电平?
     s_ms(200);
  }while(PINB!=0xf0);    //读入的低四位是不确定的三态电平,这个判断肯定会有问题。

使用特权

评论回复
板凳
wucc2009|  楼主 | 2010-11-2 21:55 | 只看该作者
2# 宇宙飞船 //4x4键盘试验程序
//使用板载的4x4键盘
//数码管显示按键值
#define uchar unsigned char
#define uint unsigned int
#include<iom16v.h>
#include"ch595.h"
#include"encoder.h"
#include"key_value.h"
#include"disp.h"
uchar a1,a2,a3;


//向ch595写数据
#define clk  1
#define rclk 2
#define dat  3  
//延时函数
void s_ms(unsigned int t)
{
    for(;t>1;t--)
    {
    }
}
//写74hc595函数
void sendbyte(uchar byte)
{   
   uchar i,tem;
   byte=encoder(byte);       //译码
   for(i=0;i<8;i++)         
        {
         PORTA&=~(1<<clk);
         tem=(byte&0x80);
   if(tem==0)
     {
     PORTA&=~(1<<dat);
     }
     else
     {
     PORTA|=(1<<dat);
     }
         byte=byte<<1;
         PORTA|=(1<<clk);
         }
         PORTA&=~(1<<rclk);
   s_ms(100);
         PORTA|=(1<<rclk);         
}


//读键盘值 键盘在端口B
uchar key_value()
{
uchar tem1,tem2,rem,i;
rem=0;                      //不清零会返回一个不可预知的值
DDRB=0xf0;                  //B口高四位输出 低四位输入
PORTB=0x0f;                 //输入有上拉电阻 输出低电平
s_ms(1);
tem1=PINB;                  //读取端口B
tem1=tem1&0x0f;
if(tem1!=0x0f)              //判断是否有键被按下
  {
  s_ms(200);                  //延时
  tem2=PINB;                //读取端口B
  tem2=tem2&0x0f;
  if(tem1==tem2)            //判断是否为干扰
    {
DDRB=0x0f;              //B口高四位输入 低四位输出
PORTB=0xf0;             //反相输出
s_ms(50);                  //换向后要延时
rem=PINB;               //读取端口B
rem=rem&0xf0;           //取高四位
rem=rem+tem1;           //合并
rem=~rem;               //反向输出
//do                    //判断按键是否被释放
//{
    // PORTB=0xf0;
//s_ms(200);
//}
    //while(PINB!=0xf0);
}
  }
return(rem);
}

}
void disp(uchar aa)
{
uint bb=0;
DDRA=0xff;      //初始化端口A
PORTA=0xff;
   disa(aa);//提取aa的各位
      sendbyte(a1);//数码管1
   PORTA&=~(1<<ls138a);
   PORTA&=~(1<<ls138b);
   PORTA&=~(1<<ls138c);
   s_ms(600);            
   sendbyte(a2);//数码管2
   PORTA|=(1<<ls138a);
   PORTA&=~(1<<ls138b);
   PORTA&=~(1<<ls138c);
   s_ms(600);      
   sendbyte(a3);//数码管3
   PORTA&=~(1<<ls138a);
   PORTA|=(1<<ls138b);
   PORTA&=~(1<<ls138c);
   s_ms(600);
   sendbyte(0);//数码管4
   PORTA|=(1<<ls138a);
   PORTA|=(1<<ls138b);
   PORTA&=~(1<<ls138c);
   s_ms(600);
   sendbyte(0);//数码管5
   PORTA&=~(1<<ls138a);
   PORTA&=~(1<<ls138b);
   PORTA|=(1<<ls138c);
   s_ms(600);
   sendbyte(0);//数码管6
   PORTA|=(1<<ls138a);
   PORTA&=~(1<<ls138b);
   PORTA|=(1<<ls138c);
   s_ms(600);
   sendbyte(0);//数码管7
   PORTA&=~(1<<ls138a);
   PORTA|=(1<<ls138b);
   PORTA|=(1<<ls138c);
   s_ms(600);
   sendbyte(0);//数码管8
   PORTA|=(1<<ls138a);
   PORTA|=(1<<ls138b);
   PORTA|=(1<<ls138c);
   s_ms(600);
}


//数码管译码函数
uchar encoder(uchar num)
{
uchar code;
switch(num)
{
  case 0x00:
  code=0xc0;break;
  case 0x01:
  code=0xf9;break;
  case 0x02:
  code=0xa4;break;
  case 0x03:
  code=0xb0;break;
  case 0x04:
  code=0x99;break;
  case 0x05:
  code=0x92;break;
  case 0x06:
  code=0x82;break;
  case 0x07:
  code=0xf8;break;
  case 0x08:
  code=0x80;break;
  case 0x09:
  code=0x90;break;
  }
  return(code);
}




//键值转换
turn(uchar key)
{
switch(key)
{
  case 0x11:        
  key=0x01;break;
  case 0x21:        
  key=0x02;break;
  case 0x41:
  key=0x03;break;
  case 0x81:
  key=0x04;break;
  case 0x12:
  key=0x05;break;
  case 0x22:
  key=0x06;break;
  case 0x42:
  key=0x07;break;
  case 0x82:
  key=0x08;break;
  case 0x14:
  key=0x09;break;
  case 0x24:
  key=0x0a;break;
  case 0x44:
  key=0x0b;break;
  case 0x84:
  key=0x0c;break;
  case 0x18:
  key=0x0d;break;
  case 0x28:
  key=0x0e;break;
  case 0x48:
  key=0xa0f;break;
  case 0x88:
  key=0x10;break;
  }
  return(key);
}
//主函数
main()
{
uchar key,tem;
//端口初始化
DDRA=0xff;
PORTA=0xff;
DDRC=0xff;
PORTC=0xff;
while(1)
     {
  key=key_value();    //读取键值
  if(key!=0)
    {
     tem=turn(key);   //转换译码
    }
  disp(tem);         //显示键值
  }
}

使用特权

评论回复
地板
wucc2009|  楼主 | 2010-11-2 21:57 | 只看该作者
就加红那部分啊,你看看吧啊

使用特权

评论回复
5
宇宙飞船| | 2010-11-2 22:06 | 只看该作者
检测按键是否按下,无非就检测比较送出数值与读回数值,看看否发生了改变,以此确定按键被按下了。
再根据设定的键值映射表,得到行列上的按键号。

俺在2楼的红字上已经指出来了。就错在那。

使用特权

评论回复
6
wucc2009|  楼主 | 2010-11-2 22:20 | 只看该作者
用了这个“判断按键是否被按下函数”之后是不是按键不松开就不在数码管上显示想得到的数字,谢谢飞船大人…… 5# 宇宙飞船

使用特权

评论回复
7
宇宙飞船| | 2010-11-2 22:39 | 只看该作者
代码出现了错误,不能正常工作,但从写代码的思维上看,是基于查询方式。

至于是放开按键才继续工作,还是没按下才继续工作,因楼主写的查询代码出错,无从考证,没法确定。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:加油,我的人生将会变得光明!!!

0

主题

51

帖子

1

粉丝