#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit DSCQ=P2^6;//位定義段鎖存器控制端
sbit WSCQ=P2^7;//位定義位鎖存器控制端
uchar code table[]={0x3f,0x06,0x5b,0x4f, //0,1,2,3
0x66,0x6d,0x7d,0x07, //4,5,6,7
0x7f,0x6f,0x77,0x7c, //8,9,a,b
0x39,0x5e,0x79,0x71};//c,d,e,f
void delay(uint t);//聲明延時函數
void keyscan(); //聲明掃描函數
void main()
{
DSCQ=0;//段鎖存器鎖存
WSCQ=0;//位鎖存器鎖存
P0=0x00;//P0口輸出0000 0000
WSCQ=1; //位鎖存器允許通過
WSCQ=0; //位鎖存器鎖存(數碼管接地端全為低電平0)
P0=table[8];//P0口輸出8
DSCQ=1; //段鎖存器允許通過
while(1)
{
keyscan();//恒掃描
}
}
void delay(uint t)
{
uint x,y;
for(x=t;x>0;x--)
{
for(y=120;y>0;y--)
{
}
}
}
void keyscan()
{
uchar key1,key2;
P3=0xfe; //1111 1110(將P3.0置為低電平0。高4位寫1,以便讀取4高位I/O口狀態)
key1=P3; //第一次讀取P3口
delay(15);//延時15ms
key2=P3; //第二次讀取P3口
key1=key1&0xf0;//1111 0000(將第一次的值保留高4位,屏蔽低4位)
key2=key2&0xf0;//1111 0000(將第二次的值保留高4位,屏蔽低4位)
if((key1==key2)&&key1!=0xf0)//如果key1的值等于key2的值,并且key1的值不等于1111 0000 表明確實有鍵被按下
{
switch(key1)
{
case 0xe0:P0=table[0];break;//1110 0000
case 0xd0:P0=table[1];break;//1101 0000
case 0xb0:P0=table[2];break;//1011 0000
case 0x70:P0=table[3];break;//0111 0000
}
}
P3=0xfd; //1111 1101(將P3.1置為低電平0。高4位寫1,以便讀取4高位I/O口狀態)
key1=P3; //第一次讀取P3口
delay(15);//延時15ms
key2=P3; //第二次讀取P3口
key1=key1&0xf0;//1111 0000 保留高4位(將第一次的值保留高4位,屏蔽低4位)
key2=key2&0xf0;//1111 0000 保留高4位(將第二次的值保留高4位,屏蔽低4位)
if((key1==key2)&&key1!=0xf0)//如果key11的值等于key2的值,并且key1的值不等于1111 0000 表明確實有鍵被按下
{
switch(key1)
{
case 0xe0:P0=table[4];break;//1110 0000
case 0xd0:P0=table[5];break;//1101 0000
case 0xb0:P0=table[6];break;//1011 0000
case 0x70:P0=table[7];break;//0111 0000
}
}
P3=0xfb; //1111 1011(將P3.2置為低電平0。高4位寫1,以便讀取4高位I/O口狀態)
key1=P3; //第一次讀取P3口
delay(15);//延時15ms
key2=P3; //第二次讀取P3口
key1=key1&0xf0;//1111 0000(將第一次的值保留高4位,屏蔽低4位)
key2=key2&0xf0;//1111 0000(將第二次的值保留高4位,屏蔽低4位)
if((key1==key2)&&key1!=0xf0)//如果key11的值等于key2的值,并且K1的值不等于1111 0000 表明確實有鍵被按下
{
switch(key1)
{
case 0xe0:P0=table[8];break; //1110 0000
case 0xd0:P0=table[9];break; //1101 0000
case 0xb0:P0=table[10];break;//1011 0000
case 0x70:P0=table[11];break;//0111 0000
}
}
P3=0xf7; //1111 0111(將P3.3置為低電平0。高4位寫1,以便讀取4高位I/O口狀態)
key1=P3; //第一次讀取P3口
delay(15);//延時15ms
key2=P3; //第二次讀取P3口
key1=key1&0xf0;//1111 0000(將第一次的值保留高4位,屏蔽低4位)
key2=key2&0xf0;//1111 0000(將第二次的值保留高4位,屏蔽低4位)
if((key1==key2)&&key1!=0xf0)//如果key1的值等于key2的值,并且key1的值不等于1111 0000 表明確實有鍵被按下
{
switch(key1)
{
case 0xe0:P0=table[12];break;//1110 0000
case 0xd0:P0=table[13];break;//1101 0000
case 0xb0:P0=table[14];break;//1011 0000
case 0x70:P0=table[15];break;//0111 0000
}
}
}