AVR单片机的程序,请师兄们看看错误在哪里

/****************************************************文件名:duankou.c**Copyright(c)LesnC... /**************************************************
** 文件名: duankou.c
** Copyright (c)Lesn CO.,LTD
** 编写:bd-myj
** 日期:
** 修改:
** 日期:
** 描述:端口电平扫描程序
**
** 版本:1.00
Chip type : MEGA32L
Clock frequency : 7.3728 MHz
Memory model : Small
Internal SRAM size : 1024
External SRAM size : 0
Data Stack size : 256
/*************************************************/
#include <iom32v.h>
#include <macros.h>
//全局
#define uchar unsigned char //定义变量设置
#define uint unsigned int
#define ulong unsigned long
void delay_1ms(void)
{
uint i;
for(i=1;i<1142;i++);
}
/*************************************/
void delay_ms(uint tmp)
{

while(tmp--)
{
delay_1ms();
}
}
/**************************************/
uchar duankou(void)
{
uchar i,key;
DDRB=0XFF;//设置端口为输出
PORTB=0XFF;//设置端口状态为低电平0000 0000
DDRB=0X00;//设置端口为输入
DDRC=0XFF;
delay_ms(2);//延时2毫秒
i=PINB;//读端口电平
if(!(i==0x00))//如果不等于0x00,说明有信号进来
{
delay_ms(5);//延时5毫秒检测是否确实有信号进来
key=PINB;//读端口的值
key&=0X07;//0000 0111
switch(key)
{
case 0X06: //如果端口为0000 0110,说明是PB0有信号
key=1;
break;
case 0X05://如果端口为0000 0101,说明是PB1有信号
key=2;//
break;
case 0X03://如果端口为0000 0100,说明是PB3有信号
key=3;
break;
default:
key=5; // 如果检测失误
}

}
else//
{
key=5;//如果端口为0x00,说明没有信号,key=5
}
return key;//返回key的值

}
/**********************************************/
void main (void)
{
while(1)
{
if(duankou()==1)
{
PORTC|=BIT(PC6);
PORTC&=~BIT(PC7);

// QK2_OFF; QK1_ON
}
else if(duankou()==2)
{
PORTC|=BIT(PC7);
PORTC&=~BIT(PC6);

// QK1_OFF;
// QK2_ON;
}
else if(duankou()==3)//如果PB3有信号
{
//QK1_ON;QK2_ON
PORTC&=~BIT(PC6);
PORTC&=~BIT(PC7);

}
else if(duankou()==5)
{
//没有信号时候QK1_OFF,QK2_OFF

PORTC|=BIT(PC7);
PORTC|=BIT(PC6);
}
}
}

现在的情况是K1单独有信号时,QK2打开,K2单独有信号时,QK1打开,K3单独有信号时,QK1,QK2打开。
K1,K2,K3,同时有信号时,QK1,QK2不动作,只要是任意2个有信号QK1,QK2就不动作。
展开
 我来答
bd_myj
2012-07-11 · TA获得超过526个赞
知道小有建树答主
回答量:526
采纳率:0%
帮助的人:291万
展开全部
#include <iom32v.h>
#include <macros.h>
//全局
#define uchar unsigned char //定义变量设置
#define uint unsigned int
#define ulong unsigned long
#define QK1_ON PORTC&=~BIT(PC4)
/*BIT(PC4)这个表达和(1<<PC4)是一样的,在<macros.h>这个头
文件里有设置:#define BIT(x) (1 << (x))你可以打开看看,
这样方便写程序*/
#define QK1_OFF PORTC|=BIT(PC4)
#define QK2_ON PORTC&=~BIT(PC2)
#define QK2_OFF PORTC|=BIT(PC2)
/****************************************/
void delay_1ms(void)
{
uint i;
for(i=1;i<1142;i++);
}
/*************************************/
void delay_ms(uint tmp)
{

while(tmp--)
{
delay_1ms();
}
}
/**************************************/
uchar duankou(void)
{
uchar i,key;
DDRB|=0X0F;//设置端口为输出
PORTB|=0X0F;//设置端口状态为高电平
DDRB&=0XF0;//设置端口为输入
delay_ms(2);//延时2毫秒
i=PINB&0x0F;//读端口电平,屏蔽高四位
if(!(i=0x0F))//如果不等于0x0F,说明有信号进来
{
delay_ms(5);//延时5毫秒检测是否确实有信号进来
key=PINB;//读端口的值
key&=0X0F;//0000 1111
switch(key)
{
case 0X0E: //如果端口为0000 1110,说明是PB0有信号
key=1;
break;
case 0X0D://如果端口为0000 1101,说明是PB1有信号
key=2;//
break;
case 0X03: //如果端口为0000 1011,PB2有信号
key=3;
break;
case 0X07: //如果端口为0000 0111,PB3有信号
key=4;
break;
case 0X0C: //如果端口为0000 1100,PB0,PB1有信号
key=5;
break;
case 0X0A: //如果端口为0000 1010,PB0,PB2有信号
key=6;
break;
case 0X08: //如果端口为0000 1000,PB0,PB1,PB2有信号
key=7;
break;
case 0X00: //如果端口为0000 0000,全部有信号
key=8;
break;
default:
key=9; // 如果检测失误
}

}
else
{
key=9;//如果端口为0x0F,说明没有信号,key=9
}
return key;//返回key的值

}
/**********************************************/
/*下面这个函数在任何地方都可以掉用,不一定是main函数,
也可以写成别的函数名,需要的时候再来调用它,只是测试的
时候这样写*/
void main (void)
{
while(1)
{
if(duankou()==1)
{
DDRC|=BIT(PC0);
PORTC|=BIT(PC0);
}
else if(duankou()==2)
{
DDRC|=BIT(PC1);
PORTC|=BIT(PC1);
}
else if(duankou()==3)
{
DDRC|=BIT(PC2);
PORTC|=BIT(PC2);
}
else if(duankou()==4)
{
DDRC|=BIT(PC3);
PORTC|=BIT(PC3);
}
else if(duankou()==5)
{
DDRC|=BIT(PC4);
PORTC|=BIT(PC4);
}
else if(duankou()==6)
{
DDRC|=BIT(PC5);
PORTC|=BIT(PC5);
}
else if(duankou()==7)
{
DDRC|=BIT(PC6);
PORTC|=BIT(PC6);
}
else if(duankou()==8)
{
DDRC|=BIT(PC7);
PORTC|=BIT(PC7);
}
else if(duankou()==9)
{
DDRC=0x00;
PORTC=0X00;
}

}
}
意法半导体(中国)投资有限公司
2023-06-12 广告
STM32F103是一款高性能的嵌入式芯片,由意法半导体(STMicroelectronics)公司生产。它是STM32系列芯片之一,具有紧凑、低功耗、高性能等特点,被广泛应用于嵌入式系统中。STM32F103的主要特点包括:1. 集成了A... 点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
百度网友a3795a7
2012-07-11 · TA获得超过513个赞
知道小有建树答主
回答量:384
采纳率:0%
帮助的人:188万
展开全部
你的条件是冲突的

0X06: //如果端口为0000 0110,说明是PB0有信号
key=1;
从这里看,你的按键应该按键下拉(按下去以后低电平);

if(!(i==0x00))//如果不等于0x00,说明有信号进来
而这个按键扫描的条件又是上拉进入。
是矛盾的。
硬件怎么接的? PB0,PB1,PB2外部上拉,还是内部上拉?按键按下时下拉?
如果是这样的按键扫描的条件就应该是if((i&0X07==0x07))//
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式