|
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define INT16U unsigned int
sbit K1 = P3^1;
sbit K2 = P3^2;
sbit K3 = P3^3;
sbit WEI0=P2^4;
sbit WEI1=P2^5;
sbit WEI2=P2^6;
sbit WEI3=P2^7;
unsigned char Time;
uchar Count=0;
unsigned char a,b,c,d;
unsigned char code XIANSHI[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//0x40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X18};//段碼
unsigned char code WEI[]={0X7F,0XBF,0XDF,0XEF}; //位碼
void Delay10ms(unsigned int c) ;
unsigned char Key_Scan();
void Timer();
void main(void)
{
unsigned char ledValue, keyNum;
ledValue = 0x01;
while (1)
{
keyNum = Key_Scan(); //掃描鍵盤
if (keyNum == 1) //如果鍵值返回1
{
P0=0x40;
P2=0X0F;
}
else if (keyNum == 2)//如果鍵值返回2
{
a++;
if(a==4)
{
a=0;
}
switch(a)
{
case 0:
WEI0 = 1;WEI1 = 1;WEI2 = 1;WEI3 = 0;
//P2=0X7F;
Delay10ms(1);
break;
case 1:
WEI0 = 1;WEI1 = 1;WEI2 = 0;WEI3 = 1;
//P2=0XBF;
Delay10ms(1);
break;
case 2:
WEI0 = 1;WEI1 = 0;WEI2 = 1;WEI3 = 1;
//P2=0XDF;
Delay10ms(1);
break;
case 3:
WEI0 = 0;WEI1 = 1;WEI2 = 1;WEI3 = 1;
// P2=0XEF;
Delay10ms(1);
break;
}
}
if (keyNum == 3)//如果鍵值返回3
{
Timer();
Count = Count+1;
if(Count>9) //【最大值】
{
Count=0;
}
P0=XIANSHI[Count];
}
}
}
unsigned char Key_Scan()
{
unsigned char keyValue = 0 , i; //保存鍵值
//--檢測按鍵1--//
if (K1==0) //檢測按鍵K1是否按下
{
Delay10ms(1); //消除抖動
if (K1==0) //再次檢測按鍵是否按下
{
keyValue = 1;
i = 0;
while ((i<50&&K1==0)) //檢測按鍵是否松開
{
Delay10ms(1);
i++;
}
}
}
if (K2==0) //檢測按鍵K2是否按下
{
Delay10ms(1); //消除抖動
if (K2==0) //再次檢測按鍵是否按下
{
keyValue = 2;
i = 0;
while ((i<50&&K2==0)) //檢測按鍵是否松開
{
Delay10ms(1);
i++;
}
}
}
if (K3==0) //檢測按鍵K3是否按下
{
Delay10ms(1); //消除抖動
if (K3==0) //再次檢測按鍵是否按下
{
keyValue = 3;
i = 0;
while ((i<50&&K3==0)) //檢測按鍵是否松開
{
Delay10ms(1);
i++;
}
}
}
return keyValue; //將讀取到鍵值的值返回
}
void Delay10ms(unsigned int c) //誤差 0us
{
unsigned char a, b;
//--c已經在傳遞過來的時候已經賦值了,所以在for語句第一句就不用賦值了--//
for (;c>0;c--)
{
for (b=38;b>0;b--)
{
for (a=130;a>0;a--);
}
}
}
void Timer()
{
TMOD = 0x01; //定時器0選擇工作方式1
TH0 = 0x3C; //設置初始值,定時50MS
TL0 = 0xB0;
EA = 1; //打開總中斷
ET0 = 1; //打開定時器0中斷
TR0 = 1; //啟動定時器0
}
void Timer0() interrupt 1
{
TH0 = 0x3C; //設置初始值
TL0 = 0xB0;
Time++;
if(Time == 20)
{
Time = 0;
}
}
這是程序和電路圖。我寫的程序選位加1之后全部都變了,怎樣加程序使他每個位置都獨立變化?
|
|