关于电子琴的显示部分求高手
#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit SPK = P3^7; //P3.7外接扬声器
uint FreqTemp;
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00};
unsigned int code Freqtab[] = {64580,64685,64778,64820,64898,64968,65030,65058,
65058,65110,65157,65178,65217,65252,65283,65297};
uchar Keyscan(void)
{
uchar i,j,temp, Buffer[4] = {0xfe, 0xfd, 0xfb, 0xf7};
for(j=0;j<4;j++) //循环四次,扫描四行
{
P1=Buffer[j]; //在低四位分别输出一个低电平
_nop_();
temp=0x10; //计划先读出P1.4位
for(i=0;i<4;i++) //循环四次,检查四列
{
if(!(P1&temp)) //从高四位,截取1位
{
return(i+j*4); //返回取得的按键值
}
temp<<=1; //换左边一位
}
}
return 16; //没有键按下就返回16
}
void Main(void)
{
uchar Key_Value = 16, Key_Temp1, Key_Temp2;//读出的键值
TMOD = 0x01; //T0定时方式1
ET0 = 1; //允许T0中断
EX0 = 1; //允许X0中断
EA = 1;
while(1)
{
SPK=1; //喇叭初始化
TR0=0; //暂不发音
Key_Temp1 = Keyscan(); //读入按键
if(Key_Temp1 != 16) //有键按下
{
//Display(Key_Value); //显示键值、延时消抖
Key_Temp2 = Keyscan(); //再读一次
if (Key_Temp1 == Key_Temp2) //两次相等
{
Key_Value = Key_Temp1; //就确认下来
FreqTemp = Freqtab[Key_Value]; //根据键值,取出定时半周期的初始值
//Display(Key_Value); //显示
TR0 = 1; //启动定时器,发音
while (Keyscan()<16); //等待释放
SPK = 1; //停止发音
}
}
}
}
void T0_INT(void) interrupt 1
{
TL0 = FreqTemp; //载入定时半周期的初始值
TH0 = FreqTemp>>8;
SPK = ~SPK; //发音
}
===============================================================================================================
这是一个电子琴的程序。。我想在此程序的基础上添加一个按键显示。。。就是矩阵那部分按下那个按钮就显示哪个数字。。。可是试了很多次都没成功。。。希望有高手能够帮忙解决。。。我用的是共阳极的数码管。。P2控制段码 P0控制位码。。。