小白有地方不懂求大佬帮忙
#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
sbit P30=P3^0;
uint t;
uint code tab1[]={ 0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71}; //显示0-F
uint code tab2[] = { 64103,64260,64400,64524, //低音 4 5 6 7
64580,64684,64777,64820, //中音1 2 3 4
64898,64968,65030,65058, //中音 5 6 7 高音 1
65110,65157,65178,65217 }; //高音 2 3 4
void delay(int x)
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<120;j++);
}
/*************************************************************
* 函数功能 : 用扫描法读 P1 外接 4×4 键盘
* 函数返回 : 按下键:返回0~15、如无键按下:返回0
**************************************************************/
uint Keyscan()
{
uint i,j,col,scancode;
scancode=0xfe;
for(i =0;i<4 ;i++)
{ P1=scancode; //循环四次,扫描四行
j=P1&0xf0;
if(j!=0xf0) //判断列值高四位是否为1111,不为1111,说明有键按下
{
if(j==0xe0)col=3; //如果列值高四位为1110,第3列有键按下
else if(j==0xd0)col=2; //如果列值高四位为1101,第2列有键按下
else if(j==0xb0)col=1; //如果列值高四位为1011,第1列有键按下
else if(j==0x70)col=0; //如果列值高四位为0111,第0列有键按下
return(4*i+col); //扫描次数即为行号,通过计算得出键码值
while(j!=0xf0) //判断按键是否释放
{
P1=scancode;
j=P1&0xf0;
}
P0=0x00; //按键释放,数码管不显示
}
scancode=(scancode<<1)|0x01 ; //扫描码左移1位,准备下一行扫描
}
return 16; //没有键按下就返回16 作为误判动作
}
void main()
{
uint key;
TMOD =0x01;
EA =1; //T0定时方式1
ET0 =1; //允许T0中断
EX0 =1; //允许X0中断
while(1)
{
TR0=0; //暂不发音
key=Keyscan(); //读入按键
if(key!=16) //有键按下
{
tab1[0];
P2=0x01;
delay(10); //显示键值、延时消抖
t=tab2[key]; //根据键值,取出定时半周期的初始值
P0 = tab1[key];
P2=0x01;
delay(10);
TR0=1; //启动定时器,发音
while(Keyscan()<16); //等待释放
P30=1; //停止发音
}
else
{;}
}
}
void intx0() interrupt 1
{
TL0=t%256; //载入定时半周期的初始值
TH0=t/256;
P30=~P30; //发音
}
就是这里的这些代码都是干什么用的啊(为什么要载入定时半周期的初始值?)(中断的作用是什么啊)
{
tab1[0];
P2=0x01;
delay(10); //显示键值、延时消抖
t=tab2[key]; //根据键值,取出定时半周期的初始值
P0 = tab1[key];
P2=0x01;
delay(10);
TR0=1; //启动定时器,发音
while(Keyscan()<16); //等待释放
P30=1; //停止发音
}
else
{;}
}
}
void intx0() interrupt 1
{
TL0=t%256; //载入定时半周期的初始值
TH0=t/256;
P30=~P30; //发音
}
|