|
#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之后全部都变了,怎样加程序使他每个位置都独立变化?
|
|