要求用移位
要求:
按下k1流水燈開始自上而下
按下k2流水燈停止
按下k3流水燈熄
按下k4流水燈自下而上
代碼如下
#include <reg52.h>
#define uchar unsigned char //宏定義
#define uint unsigned int
sbit k1=P1^2; //位定義
sbit k2=P1^3;
sbit k3=P1^4;
sbit k4=P1^5;
uchar a=0; //定義所需變量
uchar b;
uchar code table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //從上到下流水數組
uchar code table2[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //從下到上流水數組
void delay_ms(uint xms) //延時函數
{
uint i,j;
for(i=xms;i>0;i--)
for(j=113;j>0;j--);
}
void key_scan(uchar b) //按鍵掃描
{
if(b==1) //若K1按下
{
while(k2==1&&k3==1&&k4==1)
{
for(a=0;a<8;a++) //執行從上到下流水操作
{
P0=table1[a];
delay_ms(100);
}
a=0;
}
}
if(b==2) //若K2按下
{
while(k1==1&&k3==1&&k4==1)
{ //P0全部輸出高電平,關閉LED
P0=0xff;
}
}
if(b==4) //若K4按下
{
while(k1==1&&k2==1&&k4==1)
{
for(a=0;a<8;a++) //執行從下到上流水操作
{
P0=table2[a];
delay_ms(100);
}
a=0;
}
}
if(b==3) //若K3按下
{
while(k1==1&&k2==1&&k3==1)
{
for(a=0;a<8;a++) //執行從上到下流水操作
{
P0=table1[a];
delay_ms(100);
}
a=0;
}
}
}
void main(void) //主函數
{
TMOD=0X01; //定時器中斷初始化
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
EA=1;
ET0=1;
TR0=1;
while(1);
}
void T0_time() interrupt 1 //中斷服務函數
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
if(k1==0)b=1;
if(k2==0)b=2;
if(k3==0)b=3;
if(k4==0)b=4;
key_scan(b);
}
|