题目:上电数码管不显示,顺序按下矩阵键盘后,数码管上显示0~F
#include <REGX52.H>
void Delay(unsigned int xks);//延时函数
unsigned char MatriKey();//矩阵键盘设置函数
void Nixie(unsigned char uu ,ff);//数码管显示函数
unsigned int sa[]={0x3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0x6F,
0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char KeyNum;//矩阵按键的位数
void main() //主函数
{
P0=0x00; //上电数码管不显示
while(1)
{
KeyNum=MatriKey();
if(KeyNum) //刚开始KeyNum=0进不去所有数码管无显示
{
Nixie(1,KeyNum);
}
}
}
void Delay(unsigned int xks) //@12.000MHz延时函数
{
unsigned char i, j;
while(xks)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xks--;
}
}
unsigned char MatriKey()//矩阵键盘
{
unsigned char NN;
P1=0xff;
P1_3=0;
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);NN=1;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);NN=5;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);NN=9;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);NN=13;}
P1=0xff;
P1_2=0;
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);NN=2;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);NN=6;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);NN=10;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);NN=14;}
P1=0xff;
P1_1=0;
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);NN=3;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);NN=7;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);NN=11;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);NN=15;}
P1=0xff;
P1_0=0;
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);NN=4;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);NN=8;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);NN=12;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);NN=16;}
return NN;
}
void Nixie(unsigned char uu ,ff)//数码管显示函数
{
switch(uu)
{
//共阴极
//表示第几个LED灯赋值0,第几个数码管点亮
case 8:P2_4=0;P2_3=0;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 4:P2_4=1;P2_3=0;P2_2=0;break;
case 3:P2_4=1;P2_3=0;P2_2=1;break;
case 2:P2_4=1;P2_3=1;P2_2=0;break;
case 1:P2_4=1;P2_3=1;P2_2=1;break;
}
P0=sa[ff];//显示什么数字
Delay(1);
P0=0x00;//P0口消影
}