找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1192|回复: 6
收起左侧

avr单片机矩阵键盘程序问题

[复制链接]
ID:691461 发表于 2020-2-9 19:02 | 显示全部楼层 |阅读模式
碰到一个问题,我用变量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();
}
}
回复

使用道具 举报

ID:673128 发表于 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。能明白我的意思吗?
回复

使用道具 举报

ID:672205 发表于 2020-2-10 11:47 来自手机 | 显示全部楼层
那就把PINA带入switch.
回复

使用道具 举报

ID:691461 发表于 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就是执行不了,不知道什么问题
回复

使用道具 举报

ID:691461 发表于 2020-2-10 16:06 | 显示全部楼层
zhengdian1 发表于 2020-2-10 11:47
那就把PINA带入switch.

可是没弄明白为什么带入一个变量就不行啊,原因没找到
回复

使用道具 举报

ID:691461 发表于 2020-2-10 16:43 | 显示全部楼层
左眼 发表于 2020-2-10 10:03
问题似乎出在你写了temp1=PINA&0x0f;temp1=PINA;这样写似乎有问题。如果你真想用temp代替PINA可以在#includ ...

试过了也没用,奇怪的是第一层的if可以顺利判断temp的值,但是到了第二层的switch,就是执行不了,不知道为什么
回复

使用道具 举报

ID:691897 发表于 2020-2-11 00:42 | 显示全部楼层
类型错了

试试
switch((unsigned char)temp)
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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