单片机编程问题告急!!!希望个位大哥大姐帮忙.

FTDXL 2007-07-17 03:52:17
我要实现的是4X4键盘显示电路  我键盘接P2口  显示电路用LED(8位) ,使用的是 (P3.1)串行通行 现在我要让键盘每一个键对应显示 1,2,3,....F,0,   我的单片机初始状态显示了 LED 全亮  可我的按键不能控制, 按下一点反应也没?  我在电脑上KEILC51 中编译也通过了,ISP下载也下到单片机里面去了,希望各为帮忙跟我找出原因,我的程序如下:
#include <reg51.h>
#include <absacc.h>
#include <stdio.h>
void delay ( );
unsigned int jiansao( );
unsigned char A[16]={0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e,0xfc};

void uart()
{
TH0=0xf4; //计数3000次//
TL0=0x48;
TR0=1;
}


main ( )
{ TMOD=0x01;//00000001 方式1 (16位计数器//
SCON=0x00; //8位移位寄存器   开起串口//
uart();

ET0=1; EA=1;
for (; ;);
}
void timer0(void) interrupt 1 using 1
{ unsigned int i;
unsigned int key;


key=jiansao( );
delay();

switch (key)
{ case 0x11: for (i=0;i<=7;i++)
{ if (i<=7) SBUF=A[0]; while(!TI) TI=0;}; break;
case 0x21: for (i=0;i<=7;i++)
{ if (i<=7) SBUF=A[1]; while(!TI) TI=0;}; break;
case 0x41: for (i=0;i<=7;i++)
{ if (i<=7) SBUF=A[2]; while(!TI) TI=0;}; break;
case 0x81: for (i=0;i<=7;i++)
{ if (i<=7) SBUF=A[3]; while(!TI) TI=0;}; break;
case 0x12: for (i=0;i<=7;i++)
{ if (i<=7) SBUF=A[4]; while(!TI) TI=0;}; break;
case 0x22: for (i=0;i<=7;i++)
{ if (i<=7) SBUF=A[5]; while(!TI) TI=0;}; break;
case 0x42: for (i=0;i<=7;i++)
{ if (i<=7) SBUF=A[6]; while (!TI) TI=0;}; break;
case 0x82: for (i=0;i<=7;i++)
{ if (i<=7) SBUF=A[7]; while(!TI) TI=0;}; break;
case 0x14: for (i=0;i<=7;i++)
{if (i<=7) SBUF=A[8]; while(!TI) TI=0;}; break;
case 0x24: for (i=0;i<=7;i++)
{if (i<=7) SBUF=A[9]; while(!TI) TI=0;}; break;
case 0x44: for (i=0;i<=7;i++)
{if (i<=7) SBUF=A[10]; while(!TI) TI=0;}; break;
case 0x84: for (i=0;i<=7;i++)
{ if (i<=7) SBUF=A[11]; while(!TI) TI=0;}; break;
case 0x18: for (i=0;i<=7;i++)
{if (i<=7) SBUF=A[12]; while(!TI) TI=0;}; break;
case 0x28: for (i=0;i<=7;i++)
{ if (i<=7) SBUF=A[13]; while(!TI) TI=0;}; break;
case 0x48: for (i=0;i<=7;i++)
{ if (i<=7) SBUF=A[14]; while(!TI) TI=0;}; break;
case 0x88: for (i=0; i<=7;i++)
{if (i<=7) SBUF=A[15]; while (!TI) TI=0;}; break;
default: SBUF=0xff; break;
}

}

void delay(void)    //延时去斗//
{ unsigned int k;
for (k=600; k>0; k--);

}

unsigned int jiansao (void )     扫描子程序
{ unsigned int lie, han;
P2=0xf0;
if ((P2&0xf0)!=0xf0)   判断有无键按下
{ delay ();  去斗
if((P2&0xf0)!=0xf0)  确认有键按下
{ lie=0xfe;    
while ((lie&0x10)!=0)
{ P2=lie;
if ((P2&0xf0)!=0xf0)
{ han=(P2&0xf0)|0x0f;

return ((~lie)+(~han));
}
else lie=(lie<<1)|0x01;
}
}
} return (0);    无键按下 返回0

}
...全文
217 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
shen_guang_wu 2007-07-18
  • 打赏
  • 举报
回复
串口通讯的波特率定时器呢?while(!TI) TI=0;这个地方可能出现死等待哦
lbing7 2007-07-18
  • 打赏
  • 举报
回复
我猜错了,呵呵

你原来是对的
lbing7 2007-07-18
  • 打赏
  • 举报
回复
P2=0xf0; //这个是不是给错了?应该给0x0F,我猜的哈...
if ((P2&0xf0)!=0xf0)   判断有无键按下

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧