首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Atmega32接口4x4键盘矩阵

用Atmega32接口4x4键盘矩阵
EN

Stack Overflow用户
提问于 2015-02-10 12:41:54
回答 1查看 7.4K关注 0票数 1

我正在尝试将一个Atmega32微控制器与一个16x2LCD和一个4x4键盘矩阵接口。我正在使用Proteus进行仿真,并使用WinAVR编译器。

液晶显示部分正常(我已经对它进行了彻底的测试)。然而,键盘代码并没有像我预期的那样运行。每当我按下一个键,键盘行的扫描就会无限期地停止

此外,该键不显示在LCD上。请帮我找到窃听器。

下面是用Proteus绘制的电路原理图,以及代码。我没有包括在这里的液晶显示代码,因为我知道这部分工作非常好。

电路:

代码:

代码语言:javascript
复制
#include <avr/io.h>
#include<util/delay.h>



//Keypad Information
#define R0 0
#define R1 1
#define R2 2
#define R3 3
#define C0 4
#define C1 5
#define C2 6
#define C3 7

#define keypadPORT PORTA
#define keypadPIN PINA
#define keypadDDR DDRA


//Keypad functions and global variables
char getkey();
int keypadRow[] = {R0, R1, R2, R3}; //rows of the keypad
int keypadCol[] = {C0, C1, C2, C3};//columnd



int main()
{
   char key_pressed;

   keypadDDR |= (1<<R0)|(1<<R1)|(1<<R2)|(1<<R3);//set upper part of keypad port as output
                                                //this will be required for scanning the rows
   keypadDDR &= ~((1<<C0)|(1<<C1)|(1<<C2)|(1<<C3));//set lower part of keypad port as input.This is
                                                   //the part of the keypad port where the rows are connected.

   LCD_init(); //initialize LCD

   while(1)
   {
      key_pressed = getkey();
      switch(key_pressed)
      {
        case('A'):
            break;//do nothing if no key is pressed
        default:
            send_char(key_pressed);//send the key pressed to LCD
      }
   }     
   return 0;
}



char getkey()
{  
   int i, j;
   for(i = 0; i < 4; i++)
   {
    keypadPORT = 0x00;
    keypadPORT |= (1 << keypadRow[i]);//send a high to a particular row of the keypad

    for(j = 0; j < 4; j++)
    {
        if(bit_is_set(keypadPIN,keypadCol[j]))//check if key is pressed
        {
            while(bit_is_set(keypadPIN,keypadCol[j]));  //wait for key to be released
            switch(i)
            {
                case(0):
                {
                    if (j == 0) return '7';
                    else if (j == 1) return '8';
                    else if (j == 2) return '9';
                    else if (j == 3) return '/';
                    break;
                }
                case(1):
                {
                    if (j == 0) return '4';
                    else if (j == 1) return '5';
                    else if (j == 2) return '6';
                    else if (j == 3) return '*';
                       break;
                }
                case(2):
                {
                    if (j == 0) return '1';
                    else if (j == 1) return '2';
                    else if (j == 2) return '3';
                    else if (j == 3) return '-';
                       break;
                }
                case(3):
                {
                    if (j == 0) return '?';
                    else if (j == 1) return '0';
                    else if (j == 2) return '=';
                    else if (j == 3) return '+';
                       break;
                }
            }
        }
    }
   }
    return 'A';//Return 'A' if no key is pressed.
}
EN

回答 1

Stack Overflow用户

发布于 2015-10-15 07:58:17

如果您按下一个键,“键盘行的扫描无限期停止”和“该键不显示在LCD上”,那么我就会看到任何潜在的无限循环,如下面的一行:

代码语言:javascript
复制
while(bit_is_set(keypadPIN,keypadCol[j]));

我不知道当你释放钥匙的时候,柱子是流失到地面,还是保持在高处,但是你应该能够用以下方式来检查这种行为:

代码语言:javascript
复制
send_char('<');
while(bit_is_set(keypadPIN,keypadCol[j]));
send_char('>');

如果您确实处于无限循环中,则显示应该向您显示<

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28431976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档