#define uchar unsigned char
#define uint unsigned int
__CONFIG(0x3B31);
const unsigned char table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //数码管数组
uchar key_num;
void delay(uint x) //延时函数
{
uint a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
void scan(); //扫描键盘函数 声明
void didi(uchar num); //蜂鸣器响 函数 声明
void disp(uchar num0,uchar num1,uchar num2,uchar num3,uchar num4,uchar num5,uchar num6,uchar num7); //数码管显示 声明
//-----------------------------------------------------------------------------------
void init() //初始化函数
{
TRISA=0x00;
TRISB=0xff;
TRISC=0X00;
TRISD=0x00;
TRISE=0x00;
PORTC=0Xff;
PORTD=0x00;
}
//-------------------主函数-----------------------------------------------------------
void main()
{
init ();
while(1)
{
scan(); //扫描键盘
disp(key_num,2,3,4,5,6,7,8); //后面的直接传给数码管而第一个是几,我们要用键盘来检测,则第一个变量由key_num
}
}
//-------------------------------------------------------------------------------------
void didi(uchar num) //蜂鸣器函数,num响几声
{
uchar di_num; //di_num响几声
for(di_num=num;di_num>0;di_num--)
{
RE0=1;
delay(100);
RE0=0;
delay(50);
}
}
void scan()
{
if(RB0==0)
{
delay(10);
if(RB0==0)
{
didi(1);
while(!RB0);
// PORTD=0x01; //若写成RD0=1;也可,不过呢,会出现灯亮了之后不会灭掉,还得加清零(灭灯)
key_num=1;
}
}
if(RB1==0)
{
delay(10);
if(RB1==0)
{
didi(2);
while(!RB1);
// PORTD=0x02;
key_num=2;
}
}
if(RB2==0)
{
delay(10);
if(RB2==0)
{
didi(3);
while(!RB2);
// PORTD=0x04;
key_num=3;
}
}
if(RB3==0)
{
delay(10);
if(RB3==0)
{
didi(4);
while(!RB3);
// PORTD=0x08;
key_num=4;
}
}
}
//---------------------------数码管显示函数,数组------------------------------------------------
void disp(uchar num0,uchar num1,uchar num2,uchar num3,uchar num4,uchar num5,uchar num6,uchar num7)
{
PORTD=table[num0];
PORTA=0x00; //第一个数码管选通
delay(2); //延时,显示2ms
PORTD=table[num1];
PORTA=0x02; //第二个数码管选通
delay(2); //延时,显示2ms
PORTD=table[num2];
PORTA=0x04; //第三个数码管选通
delay(2); //延时,显示2ms
PORTD=table[num3];
PORTA=0x06; //第四个数码管选通
delay(2); //延时,显示2ms
PORTD=table[num4];
PORTA=0x08; //第五个数码管选通
delay(2); //延时,显示2ms
PORTD=table[num5];
PORTA=0x0A; //第六个数码管选通
delay(2); //延时,显示2ms
PORTD=table[num6];
PORTA=0x0c; //第七个数码管选通
delay(2); //延时,显示2ms
PORTD=table[num7];
PORTA=0x0e; //第八个数码管选通
delay(2); //延时,显示2ms
}