jimmyfan 发表于 2013-4-14 14:20:55

怎么修改使按键按下去第一个灯亮,而不是前面四个灯亮。

看我的程序哪出现问题,怎么改啊
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]
查看完整版本: 怎么修改使按键按下去第一个灯亮,而不是前面四个灯亮。