在用C语言写旋转彩虹灯(按键控制方向和速度)时遇到一个小问题,我知道问题在哪,但是解决不了;完整单片机代码如下:
- #include<reg51.h>
- #define unit unsigned int
- #define uchar unsigned char
- uchar code KEY_TABLE[]=
- {0x11,0x21,//0001 0001,KEY0;0010 0001,KEY1
- 0x12,0x22};//0001 0010,KEY2;0010 0010,KEY3//按键表
- uchar code Out_TABLE[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//输出
- //1111 1110;1111 1101;1111 1011;1111 0111
- uchar code T_TABLE[]={0x64,0x50,0x3c,0x28,0x14};//延时部分
- uchar code Sout_TABLE[]={0x0f,0x17,0x1b,0x1d,0x1e};//指示灯
- //0000 1111;0001 0111;0001 1011;0001 1101;0001 1110;
- //延时10ms,基本延时单位和按键消抖部分
- void delay()
- {
- uchar t,ms;
- ms=10;
- while(ms--)for(t=0;t<120;t++);
- }
- //速度选择部分
- void delay1(uchar n)//n=20,40,60,80,100
- {
- uchar i;
- for(i=0;i<n;i++)
- {
- delay();
- }
- }
- void main()
- {
-
- uchar DIR = 0;//方向选择
- uchar m = 0;//方向实现(通过灯亮的顺序)
- uchar speed = 0;//速度档位
- uchar t=T_TABLE[speed];//速度对应延时表
- uchar i,num,key,temp;//变量定义
- P1=Out_TABLE[m];//输出
- P0=Sout_TABLE[speed];//速度挡位指示
- while(1)
- {
- //检测按键部分(线反转法)
- P3=0x30;//0011 0000;
- if(P3!=0x30)//
- {
- delay();//
- P3=0x30;//
- if(P3!=0x30)//0001 0000;
- {
- temp =P3;//0001 0000;
- P3=0x03;//0000 0011;=>0000 0010
- key=temp|P3;//KEY=0001 0010;
- key=0x33-key;//KEY=0010 0001;ZHAODAO 0X21,
- for(i=0;i<4;i++)
- {
- if(key==KEY_TABLE[i])
- {
- num = i;//NUM = 1;
- break;
- }
- }
- //按键不同,功能不同
- switch(num)
- {
- case 0:DIR=0;
-
- break;
-
- case 1:DIR=1;
- break;
- case 2:
-
- {
- speed++;//=1,=2,=3,=4,=5
- if(speed==5)
- speed =0;
- break;
- }
- case 3:
- {
- speed--;//=4,=3,=2,=1,=0
- if(speed==-1)
- speed =4;
- break;
- }
-
- }
- P0=P0=Sout_TABLE[speed];//指示灯输出
- t=T_TABLE[speed];
-
- if(DIR==0)
- {
- for(;m<=7;m++)
- {
- P1=Out_TABLE[m];
- delay1(t);
-
- if(m==7)
- {
- m=-1;
- }
- }
- }
- if(DIR==1)
- {
- for(;m>=0;m--)
- {
- P1=Out_TABLE[m];
- delay1(t);
- if(m==0)
- {
- m=8;
- }
- }
- }
- }
- }
- }
- }
复制代码 问题点在:
if(DIR==0)
{
for(;m<=7;m++)
{
P1=Out_TABLE[m];
delay1(t);
if(m==7)
{
m=-1;
}
}
}
如果我这样写,执行时,再按键就失效了。我试着在里面加上“if(P3!=0x30)break;”,效果不好。希望有大佬可以帮帮忙或者提醒一下这种多次使用按键的应该怎么写。谢谢
|