在12MHZ下
#include <stc15f2k60s2.h>
#include <intrins.h>
#include <stdio.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
#define get() (P3&0x3f)|((P4&0x10)<<3)|((P4&0x04)<<4)
void allinit();
void Delay5ms() ; //@12.000MHz
void mkey();
void Timer0Init();
uchar tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
uchar disbuf[8]={0,11,11,11,11,11,11,11};
uchar discom=0,key=0;
void main()
{
Timer0Init();
ET0=1;
EA=1;
allinit();
while(1)
{
mkey();
}
}
void mkey()
{
uchar temp;
P3=0x0f;P44=0;P42=0;
temp=get();
P3=0xf0;P44=1;P42=1;
temp|=get();//是或取位
if((temp!=0xff)&&!key)
{
key=temp;
}
else if((temp==0xff)&&key)//注意是else选择,==为松手触发,!=为按下触发//累加的功能用松手触发
{
switch (key)
{
case 0x7e:disbuf[0]=1;break;
case 0x7d:disbuf[0]=2;break;
case 0x7b:disbuf[0]=3;break;
case 0x77:disbuf[0]=4;break;
case 0xbe:disbuf[0]=5;break;
case 0xbd:disbuf[0]=6;break;
case 0xbb:disbuf[0]=7;break;
case 0xb7:disbuf[0]=8;break;
case 0xde:disbuf[1]=0;break;
case 0xdd:disbuf[2]=1;break;
case 0xdb:disbuf[3]=1;break;
case 0xd7:disbuf[4]=1;break;
case 0xee:disbuf[5]=1;break;
case 0xed:disbuf[6]=1;break;
case 0xeb:disbuf[7]=1;break;
case 0xe7:disbuf[0]=9;break;
}
key=0;
}
}
void Timer0Init(void) //1ms@12.000MHz
{
AUXR |= 0x80; //
TMOD &= 0xF0; //
TL0 = 0x20; //
TH0 = 0xD1; //
TF0 = 0; //
TR0 = 1; //
}
void time0() interrupt 1
{
P2=0xc0;
P0=1<<discom;
P2=0xe0;
P0=tab[disbuf[discom]];
if(++discom==8)discom=0;
}
void allinit()//这里写的并不严谨应做处理不影响其他管
{
P2=0x80;
P0=0xff;
P2=0xa0;
P0=0x00;
P2=0xc0;
P0=0xff;
P2=0xe0;
P0=0xff;
}
void Delay5ms() //@12.000MHz
{
unsigned char i, j;
i = 59;
j = 90;
do
{
while (--j);
} while (--i);
}