标题: avr单片机矩阵键盘程序问题 [打印本页]

作者: zhuangtp    时间: 2020-2-9 19:02
标题: avr单片机矩阵键盘程序问题
碰到一个问题,我用变量temp1表达PINA的值,带入switch中,程序运行不起来,但是直接把PINA带入switch中却可以正常运行,请教下这个是什么原因造成的啊,我用的ATMEL16,

单片机源程序如下:
#include<avr/io.h>
#include<util/delay.h>
void scan()
{
unsigned int temp=0,temp1=0;
PORTA=0XF0;
DDRA=0X0F;
temp=PINA&0xf0;
if(temp==0xe0)
   {
    PORTA=0X0F;
DDRA=0XF0;
    temp1=PINA&0x0f;
_delay_ms(10);
      switch(temp1)
  {
  case 0x0e:PORTB&=~(1<<0);break;
  case 0x0d:PORTB&=~(1<<1);break;
  case 0x0b:PORTB&=~(1<<2);break;
  case 0x07:PORTB&=~(1<<3);break;   
        }  
  while(PINA==0x0E);
  while(PINA==0x0D);
  while(PINA==0x0B);
  while(PINA==0x07);
  PORTB=0XFF;  
  }
if(temp==0xd0)
   {
   PORTA=0X0F;
DDRA=0XF0;
    temp1=PINA;
_delay_ms(10);
      switch(PINA)
  {
  case 0x0e:PORTB&=~(1<<4);break;
  case 0x0d:PORTB&=~(1<<5);break;
  case 0x0b:PORTB&=~(1<<6);break;
  case 0x07:PORTB&=~(1<<7);break;   
        }
    while(PINA==0x0E);
  while(PINA==0x0D);
  while(PINA==0x0B);
  while(PINA==0x07);
  PORTB=0XFF;
   
   }
}
int main()
{
PORTB=0XFF;
DDRB=0XFF;
while(1)
{
scan();
}
}

作者: 左眼    时间: 2020-2-10 10:03
问题似乎出在你写了temp1=PINA&0x0f;temp1=PINA;这样写似乎有问题。如果你真想用temp代替PINA可以在#include<util/delay.h>的下面写一句加#define temp1 PINA(不要带;) ,这样temp1就是PINA了.switch(temp1&0x0f)  switch(temp1),就行了不要在一个函数内用一个变量代替两个,在程序中一律用temp1代替PINA。能明白我的意思吗?
作者: zhengdian1    时间: 2020-2-10 11:47
那就把PINA带入switch.
作者: zhuangtp    时间: 2020-2-10 16:06
左眼 发表于 2020-2-10 10:03
问题似乎出在你写了temp1=PINA&0x0f;temp1=PINA;这样写似乎有问题。如果你真想用temp代替PINA可以在#includ ...

void scan()
{
unsigned int temp=0;

PORTA=0XF0;
DDRA=0X0F;
temp=PINA&0xf0;
if(temp==0xe0)
   {
    PORTA=0X0F;
        DDRA=0XF0;
    temp=PINA&0x0f;
        _delay_ms(10);
             switch(temp)
                {
                case 0x0e:PORTB&=~(1<<0);break;
                case 0x0d:PORTB&=~(1<<1);break;
                case 0x0b:PORTB&=~(1<<2);break;
                case 0x07:PORTB&=~(1<<3);break;          
        }  

                while(temp==0x0E);
                while(temp==0x0D);
                while(temp==0x0B);
                while(temp==0x07);
                PORTB=0XFF;  
  }

这个是修改后的代码,依然没有用,奇怪的是第一层if使用temp完全没问题,到了switch就是执行不了,不知道什么问题
作者: zhuangtp    时间: 2020-2-10 16:06
zhengdian1 发表于 2020-2-10 11:47
那就把PINA带入switch.

可是没弄明白为什么带入一个变量就不行啊,原因没找到
作者: zhuangtp    时间: 2020-2-10 16:43
左眼 发表于 2020-2-10 10:03
问题似乎出在你写了temp1=PINA&0x0f;temp1=PINA;这样写似乎有问题。如果你真想用temp代替PINA可以在#includ ...

试过了也没用,奇怪的是第一层的if可以顺利判断temp的值,但是到了第二层的switch,就是执行不了,不知道为什么
作者: Oliveryi    时间: 2020-2-11 00:42
类型错了

试试
switch((unsigned char)temp)





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1