搜索
bottom↓
回复: 5

实验板矩阵键盘的扫描

[复制链接]

出0入0汤圆

发表于 2005-6-1 12:49:46 | 显示全部楼层 |阅读模式
认真学了一下马老师第九章,发觉和实验板不同。但马老师三态处理的思路略有领会。我把实验板带电阻的定义为输出(Y列线),依次低电平;再定义X行线为输入。不知道对不对?

Y列线接PC0~2,X行线接PC3~6,CASE0的扫描程序我是这样写的:

key_mask=0b01111000

case 0:

      key_line=0b10000000;

      for(i=0;i<3;i++)

         {

          key_line=(1<<i);

          PORTC=~key_line;

          PORTC=~key_line;

          key_value=key_mask & PINC;

          if(key_value==key_mask)

                     ;

             else

             {

             key_state++;

             break;

             }

          }

C语言在开始学,写得对不对自己也不知道。请马老师批改。
-----此内容被newhand于2005-06-01,12:56:21编辑过

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2005-6-2 10:06:55 | 显示全部楼层
可惜IF语句ICCAVR始终认为是错的.

出0入0汤圆

 楼主| 发表于 2005-6-2 11:57:00 | 显示全部楼层
下面是实验板3*4键盘扫描,用单个数码管显示1~9,PC0~2接Y作为列线、PC3~6接X作为行线。程序如下(ICCAVR):



                    #include<iom16v.h>

                  #include<macros.h>

                  const unsigned char shum_s[10]={0x3F,0x06,0x5B,0x4F,

                                      0x66,0x6D,0x7D,0x07,0x7F,0x6F};

                  unsigned char key_state;

                  unsigned char key_value;

                  unsigned char key_line;

                  void delay_1ms(void)

                      {

                          unsigned int i;

                          for(i=1;i<570;i++)

                                  ;

                          }

                  void delay_nms(unsigned char n)

                      {

                          unsigned int i;

                          while(i<n)

                              {

                                  delay_1ms();

                                  i++;

                                  }

                           }

                            

                  

                 

                  #define  K1_1   1;

                  #define  K1_2   2;

                  #define  K1_3   3;

                  #define  K2_1   4;

                  #define  K2_2   5;

                  #define  K2_3   6;

                  #define  K3_1   7;

                  #define  K3_2   8;

                  #define  K3_3   9;

                  #define  K4_1   10;

                  #define  K4_2   11;

                  #define  K4_3   12;

                  

                  

                  unsigned char read_key(void)

                  {

                  unsigned char key_return=255;

                  unsigned char i=0;

                  switch(key_state)

                    {

                        case 0:

                             {

                             key_line=0b10000000;

                                 for(i=0;i<3;i++)

                                    {

                                    key_line=(1<<i);

                                    PORTC=~key_line;

                                    PORTC=~key_line;

                                    key_value=PINC&0x78;

                                    if(key_value!=0x78)

                                            {

                                        key_state++;

                                                break;

                                                }

                                       else

                                       

                                       ;

                                     

                                          

                                    }

                                 }

                                 break;

                    case 1:

                             if(key_value==(PINC&0x78))

                                 {

                                 switch(key_value|key_line)

                                     {

                                 case 0b01110001:

                                      key_return=K1_1;

                                          break;

                                 case 0b01110010:

                                      key_return=K1_2;

                                          break;

                                 case 0b01110100:

                                      key_return=K1_3;

                                          break;

                                 case 0b01101001:

                                      key_return=K2_1;

                                          break;

                                 case 0b01101010:

                                      key_return=K2_2;

                                          break;

                                 case 0b01101100:

                                      key_return=K2_3;

                                          break;

                                 case 0b01011001:

                                      key_return=K3_1;

                                          break;

                                 case 0b01011010:

                                      key_return=K3_2;

                                          break;

                                 case 0b01011100:

                                      key_return=K3_3;

                                          break;

                                 case 0b00111001:

                                      key_return=K4_1;

                                          break;

                                 case 0b00111010:

                                      key_return=K4_2;

                                          break;

                                 case 0b00111100:

                                      key_return=K4_3;

                                          break;

                                      }

                                      key_state++ ;

                                 }

                                 else  key_state-- ;

                                       break;

                 case 2:

                       

                       PINC=0x78;

                           PINC=0x78;

                           if((PINC&0x78)==0x78)

                             

                             key_state=0;

                                 break;

                                 

                 }

                 return key_return;

         }

         

         void main(void)

            {

                unsigned char i=0;

                OSCCAL=0xad;

                DDRA=0xff;

                PORTA=0;

                DDRC=0x87;

                PORTC=0x78;

               

                while(1)

                    {

                        delay_nms(10);

                        i=read_key();

                        if(i<10)

                          PORTA=shum_s;

                        }

                }

出0入0汤圆

发表于 2005-6-9 16:02:29 | 显示全部楼层
switch(key_state)

          {

         case 0:

              {

              key_line=0b10000000;

             for(i=0;i<3;i++)

                {

                key_line=(1<<i);

                PORTC=~key_line;

                PORTC=~key_line;

                key_value=PINC&0x78;

                if(key_value!=0x78)

                   {

                    key_state++;  

                  break;

                  }

                   else

                    

                   ;

                  

                  

                }

             }

             break;

          case 1:

              if(key_value==(PINC&0x78))

             {

             switch(key_value|key_line)

                 {

             case 0b01110001:

                  key_return=K1_1;

                 break;

             case 0b01110010:

                  key_return=K1_2;

                 break;

             case 0b01110100:

                  key_return=K1_3;

                 break;

             case 0b01101001:

                  key_return=K2_1;

                 break;

             case 0b01101010:

                  key_return=K2_2;

                 break;

             case 0b01101100:

                  key_return=K2_3;

                 break;

             case 0b01011001:

                  key_return=K3_1;

                 break;

             case 0b01011010:

                  key_return=K3_2;

                 break;

             case 0b01011100:

                  key_return=K3_3;

                 break;

             case 0b00111001:

                  key_return=K4_1;

                 break;

             case 0b00111010:

                  key_return=K4_2;

                 break;

             case 0b00111100:

                  key_return=K4_3;

                 break;

                  }

                  key_state++ ;

             }

             else  key_state-- ;

                   break;

       case 2:

              

             PINC=0x78;

            PINC=0x78;

            if((PINC&0x78)==0x78)

               

              key_state=0;

             break;

              

       }

       return key_return;

    }



這部分可以改為查表法, 代碼寫起來輕鬆多了

出0入0汤圆

发表于 2005-8-20 20:40:08 | 显示全部楼层
我也在做到这个,把马老师改为ICCAVR,但是不行,多谢楼主提供我参考下,我试下是否可以

出0入0汤圆

发表于 2005-8-31 17:01:09 | 显示全部楼层
#include <iom16v.h>

#include <macros.h>

#define uchar unsigned char

#pragma data:code

const uchar num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

#pragma data:data

uchar key[4]={0x3f,0x3f,0x3f,0x3f};

void delay_ns()

{

  asm("nop");

}

void delay_Nns(unsigned char n)

{

  unsigned char j=0;

  for(j=0;j<n;j++)

  delay_ns();

}

void delay_1ms(void)                 //1ms延时函数

  {

   unsigned int i;

   for (i=0;i<1140;i++);

  }

  

void delay_nms(unsigned int n)       //N ms延时函数

  {

   unsigned int i=0;

   for (i=0;i<n;i++)

   delay_1ms();

  }                                  //延时是参考的3310液晶实验

  uchar panduan(void)

{

DDRA=0xf0;

PORTA=0x0f;

if(PINA!=0x0f)

return 1;

else return 0;                    //判断键盘是否按下

}

uchar scankey(void)

{

uchar temp;                        //扫描键盘取的键值

uchar keypress;

{

delay_nms(10);

  

  if((panduan())==1)

{

temp=PINA;

if(temp==0x07)

  keypress=0;

  else if(temp==0x0b)

  keypress=3;

  else if(temp==0x0d)

  keypress=6;

    else if(temp==0x0e)

  keypress=9;

  

  DDRA=0x0f;

  PORTA=0x70;

  delay_Nns(2);           //键盘电平反转,延时只需要1到2个NOP

  if  (PINA==0x60)

  keypress+=0;

  else if(PINA==0x50)

  keypress+=1;

  else if(PINA==0x30)

  keypress+=2;



  }

do{



   }while((panduan())==1);

  DDRA=0x70;                  //从新回写A口初始化

  PORTA=0x0f;

   return keypress;

  }



  }

void yiwei(void)

{

uchar i=0;

uchar temp;

temp=scankey();



for(i=0;i<3;i++)

  

   key[3-i]=key[2-i];

   key[0]=num[temp];

}



void xianshi(void)

{

uchar i=0;

for(i=0;i<4;i++)

{

  PORTB=key;

  PORTD&=~(1<<i);

  delay_nms(10);

  PORTD|=(1<<i);

}

}





void main(void)

{

uchar temp=0;

OSCCAL=0xb7;

DDRB=0x00;

PORTB=0xff;

DDRD=0x0f;

PORTD=0x0f;

for(;;)

{

if((panduan())==1)

yiwei();

xianshi();

}

}

这是我用ICCAVR写的,可以在板上通过。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-19 22:53

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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