//矩阵键盘,2011.4.24
#include<reg51.h>
unsigned char k,m,w,n,q,p,l,lie=0,hang;//char占一个字节,int占两个字节
void delay(int t)
;
void saomiao();
sbit buzz=P3^7;
sbit yuyin=P3^5;
sbit zaiyuyin=P3^6;
main()
{
SCON=0x50;//模式yi,jieshou.01代表方式1,01代表允许串行接收。串口控制寄存器?
//pcon特殊功能寄存器控制波特率是否加倍,第一位smod=1波特率加倍。
TCON= 0X00;//关闭所有中断。定时计数器的控制寄存器
TMOD=0X20;//定时计数器设定t1工作方式2
TH1=0Xe8;//波特率1200,,11.0592m
TL1=0Xe8;
ES=1;//开串口中断
EA=1;//开总中断
TR1=1;//开始计时
TR0=1;
/* yuyin=0;
zaiyuyin=1;
while(1)
{
yuyin=~yuyin;
zaiyuyin=~zaiyuyin;
delay(5000);
}
*/
while(1)
{
P1=0Xf8;
k=P1;
if(k!=0xf8)
{
buzz=0;
delay(70);
m=P1;
if(m!=0xf8)//延时后再次确认,目的消斗
{
switch(m) //判断列
{
case 0xf0:lie=0;break;//3jian
case 0xe8:lie=1;break;//6jian
case 0xd8:lie=2;break;//9jian
case 0xb8:lie=3;break;//0dquerenjian
}
P1=0X07;
w=P1;
switch(w)
{
case 0x06:hang=1;break;//2jian
case 0x05:hang=2;break;//5jian
case 0x03:hang=3;break;//8jian
}
while(w!=0x07)//撒手程序放在前面说幕由于已经撒手,P1值不对。
{
w=P1;
}
q=lie*4+hang;
switch(q)
{
case 1:SBUF=0X0d;break;
case 2:SBUF=0X30;break;
case 3:SBUF=0X08;break;
case 5:SBUF=0X39;break;
case 6:SBUF=0X38;break;
case 7:SBUF=0X37;break;
case 9:SBUF=0X36;break;
case 10:SBUF=0X35;break;
case 11:SBUF=0X34;break;
case 13:SBUF=0X33;break;
case 14:SBUF=0X32;break;
case 15:SBUF=0X31;break;
}
}
buzz=1;
}
}
}
void delay(int t)
{
int i;
while(t--)
for(i=0;i<125;i++);
} |