本帖最后由 pental 于 2009-9-11 23:08 编辑
sbit Col0 = P3^0;
sbit Col1 = P3^1;
sbit Col2 = P3^3;
sbit Col3 = P3^4;
sbit Col4 = P3^5;
sbit Col5 = P3^7;
sbit pcled=P1^5; //PC control
sbit tvled=P1^6; //TV control
sbit redout=P1^7; //RED
void C52_Init()
{
P3=0x44; //与键盘的操作有关//初始化各并口都为0xFF,为使中断有效,部分位置0,要保证中断口为输入即置1
EA=1;
ET0=1;
EX0=1;
TMOD=0x02;
TH0=84;
TL0=84;
timer0_count=0;
send1_flag=0;
mod_count=0;
pcled=0;
tvled=0;
redout=0; //红外发射管初始化为0.
//pout=0;
}
/***************************************************************************************************/
/**********************15ms延迟,用于消除抖动**********************/
void delay()
{
unsigned char i=100,n=200;
for(;i>0;i--)
{
while(n) n--;
}
}
/****************************************************************/
/***********扫描键盘,返回键值(高四位代表行,低四位代表列)*******/
unsigned char scan_key()
{
unsigned char temp,keycode;
temp=P1&0x0F; //存储列值
if(temp==0x0E) keycode=0;
else if (temp==0x0D) keycode=1;
else if (temp==0x0B) keycode=2;
else if (temp==0x07) keycode=3;
P1 = temp; //列输出进行行扫描
P3 = 0xFF; //有用端口置为输入(写1)
if(Col0==0) keycode=keycode;
else if (Col1==0) keycode=keycode+4;
else if (Col2==0) keycode=keycode+8;
else if (Col3==0) keycode=keycode+12;
else if (Col4==0) keycode=keycode+16;
else if (Col5==0) keycode=keycode+20;
return(keycode);
}
/******************************************************************/
/****************************键盘扫描处理**************************/
void program_SCANkey() interrupt 0 //键盘扫描的处理,P1端只要有低电平输入/输出,会产生此中断
{
unsigned char temp;
IE=0x00; //必须禁止,不然在进行列扫描会出现问题,P0会输出低电平,从而再次产生中断
//延时10ms左右,消除抖动干扰
P1=0x0F;
delay();
temp=P1; //P1口输入
if((temp&0x0F)!=0x0F) //判断是否有效按键
{
key_code=scan_key(); //获取键值
while(P1&0x0F!=0x0F) pcled=~pcled; //等待按键释放
}
else while(1) tvled=~tvled; :@
P3=0x44; //保持中断有效,P3输出为低
IE=0x8F;
return;
}
void main(void)
{
unsigned char i,j;
C52_Init(); //初始化,主要是定时器初始化和键盘中断初始化
while(1)
{
while(key_code==0xFF) ; //等待键盘中断,产生0-0F的键盘值,若有数据,发送数据,若没数据,等待中断
buffer[2]=key_code;
buffer[3]=~key_code;
while(1) //用于测试
{
for (i=0;i<200;i++)
for (j=0;j<200;j++); //初始空闲
SendData(); //发数据
for (i=0;i<200;i++)
for (j=0;j<200;j++);
}
}
}
/******************************************************************************************/
测试过了,能运行到有个人头的地方,错在哪 |