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就不动作。 展开
** 文件名: 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就不动作。 展开
2个回答
展开全部
#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;
}
}
}
#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 广告
2023-06-12 广告
STM32F103是一款高性能的嵌入式芯片,由意法半导体(STMicroelectronics)公司生产。它是STM32系列芯片之一,具有紧凑、低功耗、高性能等特点,被广泛应用于嵌入式系统中。STM32F103的主要特点包括:1. 集成了A...
点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
展开全部
你的条件是冲突的
0X06: //如果端口为0000 0110,说明是PB0有信号
key=1;
从这里看,你的按键应该按键下拉(按下去以后低电平);
if(!(i==0x00))//如果不等于0x00,说明有信号进来
而这个按键扫描的条件又是上拉进入。
是矛盾的。
硬件怎么接的? PB0,PB1,PB2外部上拉,还是内部上拉?按键按下时下拉?
如果是这样的按键扫描的条件就应该是if((i&0X07==0x07))//
0X06: //如果端口为0000 0110,说明是PB0有信号
key=1;
从这里看,你的按键应该按键下拉(按下去以后低电平);
if(!(i==0x00))//如果不等于0x00,说明有信号进来
而这个按键扫描的条件又是上拉进入。
是矛盾的。
硬件怎么接的? PB0,PB1,PB2外部上拉,还是内部上拉?按键按下时下拉?
如果是这样的按键扫描的条件就应该是if((i&0X07==0x07))//
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询