怎么修改使按键按下去第一个灯亮,而不是前面四个灯亮。
看我的程序哪出现问题,怎么改啊IO口如图片所示
#include "iom16v.h"
#include "macros.h"
#include <AVR_PQ1A.h> //包含自定义常量头文件
#define uchar unsigned char
#define uint unsigned int
unsigned charF_Rotation={0xF1,0xF2,0xF4,0xF8}; //正转表格,换算成二进制 0000 0001,0000 0010,0000 0100,0000 1000
unsigned charB_Rotation={0xF8,0xF4,0xF2,0xF1}; //反转表格
void delay(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<1141;j++);
}
}
//顺时针转动
void MotorCW()
{
unsigned char i;
{
DDRB = 0xFF;
for(i=0;i<4;i++) //4相
{
PORTB=F_Rotation;//输出对应的相 可以自行换成反转表格
delay(1); //改变这个参数可以调整电机转速 ,数字越小,转速越大
}
}
}
//逆时针转动
void MotorCCW()
{
unsigned char i;
{
DDRB = 0xFF;
for(i=0;i<4;i++) //4相
{
PORTB=B_Rotation;//输出对应的相 可以自行换成反转表格
delay(1); //改变这个参数可以调整电机转速 ,数字越小,转速越大
}
}
}
void MotorStop()
{
DDRB = 0xFF;
}
unsigned char KeyResult;
//键盘按下判断函数
uchar key_press() //按键子函数 ,带返回值的子函数
{
uchar j; //定义变量J
DDRD|=0X0F;//按键低4位输出,其它不变
PORTD|=0X0F;//按键低4位输出高电平,其它不变
DDRD&=0XF0;//按键低4位输入,其它不变
j=PIND; //对变量J赋值
j=j&0X0F;//00001111进行与运算,判断按键是否有按下
if(j==0X0F)//如果按键没有按下返回0,如按下返回1给key_press
{
return 0;
}
else
{
return 1;
}
}
//***********************************************************************
uchar key_scan() //扫描子函数
{
uchar key; //定义变量KEY
delay(10); //延时10MS再次确定按键是否有被按下
if(key_press())//判断按键 是否有被按下,则key_press为1,如按下则执行如下语句
{
key=PIND; //对变量KEY进行赋值
key&=0X0F; //进行运算判断一下是否真的有按下,如真的有按下,则有如下情况
switch(key) //条件语句
{
case 0X0E: //a0按下所对应的数据 ,并执行KEY为1
key=0X0E;
break;
case 0X0D: //a1按下
key=0X0D;
break;
case 0X0B: //a2按下
key=0X0B;
break;
case 0X07: //a3按下
key=0X07;
break;
default: //什么也没有按下
key=0;
break;
}
while(key_press());//判断一下是否有松开
}
else //如果没有按下则执行如下语句
{
key=0; //变量赋值16
}
return key; //返回KEY给key_scan扫描函数
}
void light()//C语言主函数
{
DDRA=0xff; //用于打开LED锁存
PORTA=0xfb; //打开LED灯总线 PA2脚输出底电平,打开LED锁存
DDRB=0xff; //PB0~7为输出状态
PORTB=0xfe; //PB0为输出低电平,而其余为高电平,亦即打亮LED0
//PORTB&=~BIT(0) //输出一个低电平,点亮发光管。 高电平为5V 低电平为0。
while(1); //程式停止。
}
void main(void)
{
uint i,q;
delay(1);
while(1)
{
q=key_scan();
if (q==0x0E)
{
light();
for (i=0;i<500;i++)
{ MotorCW();//顺时针转动
}
delay(10);
MotorStop();//停止转动
delay(10);
for (i=0;i<500;i++)
{ MotorCCW();//逆时针转动
}
delay(10);
MotorStop();//停止转动
delay(10);
} }
}
页:
[1]