4*4键盘按键显示程序 有毛病,请高手指教 点击:656 | 回复:5



nuist001

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 3回
  • 年度积分:0
  • 历史总积分:0
  • 注册:2008年11月11日
发表于:2008-11-11 15:52:43
楼主

本人不才,初接触单片机,8051f020开发板。想实现将一个4*4键盘的按键显示到液晶屏的功能,但是程序总是有问题,据我感觉跟延时有关,,其中的延时子程序是10ms延时。毛病是:按1  4  7  0的时候都显示1,按5的时候不稳定,一会是5,一会显示2!还请高手指教,代码附下:

 

#include<c8051F020.h>

#define uchar unsigned char 
#define uint unsigned int


void dlms(void);
void kbscan(void);
void lcd_init(void);

uint DAT;
unsigned long x;

void lcd_init(void)
{
P3 = 0x08;
for(x=0;x<800;x++);

P0 = 0x3c; //功能设置,数据8位,两行显示,字型为5*10
P3 = 0x00;
P3 = 0x08;
for(x=0;x<2;x++);

P0 = 0x0e; //显示状态设置,整体显示开,光标显示,光标位字符不闪
P3 = 0x00;
P3 = 0x08;
for(x=0;x<2;x++);

P0 = 0x06; //输入方式为增量型,向右移位
P3 = 0x00;
P3 = 0x08;
for(x=0;x<2;x++);

P0 = 0x01; //清屏
P3 = 0x00;
P3 = 0x08;
for(x=0;x<60;x++);
}


void dlms(void)
{
for(x=0;x<400;x++);
}


main()
{ P0MDOUT = 0x80;
XBR2 = 0x40; //配置I/O端口

WDTCN = 0xde;
WDTCN = 0xad; //禁止看门狗定时器

for(x=0;x<400;x++);
lcd_init();

for(;;)
{
dlms();
kbscan();
}
}


void kbscan(void)
{
// uchar sccode;
P3 = 0x09;
P1 = 0x0f;
if((P1&0x0f)!= 0x0f)
{
for(x=0;x<400;x++);
while ((P1&0x0f)!= 0x0f) //确认有键被按下
{
// sccode = P1;
P1 = 0xef;
if((P1&0x0f)==0x0e) {DAT=1;break;}
if((P1&0x0f)==0x0d) {DAT=2;break;}
if((P1&0x0f)==0x0b) {DAT=3;break;}
if((P1&0x0f)==0x07) {DAT=4;break;}
for(x=0;x<400;x++);
P1 = 0xdf;
if((P1&0x0f)==0x0e) {DAT=5;break;}
if((P1&0x0f)==0x0d) {DAT=6;break;}
if((P1&0x0f)==0x0b) {DAT=7;break;}
if((P1&0x0f)==0x07) {DAT=8;break;}
for(x=0;x<400;x++);
P1 = 0xbf;
if((P1&0x0f)==0x0e) {DAT=9;break;}
if((P1&0x0f)==0x0d) {DAT=10;break;}
if((P1&0x0f)==0x0b) {DAT=11;break;}
if((P1&0x0f)==0x07) {DAT=12;break;}
for(x=0;x<400;x++);
P1 = 0x7f;
if((P1&0x0f)==0x0e) {DAT=13;break;}
if((P1&0x0f)==0x0d) {DAT=14;break;}
if((P1&0x0f)==0x0b) {DAT=15;break;}
if((P1&0x0f)==0x07) {DAT=16;break;}
for(x=0;x<400;x++);
P1=0x0f;


switch(DAT)
{
case 1:P0=‘1‘; break;
case 2:P0=‘2‘; break;
case 3:P0=‘3‘; break;
case 4:P0=‘+‘; break;
case 5:P0=‘4‘; break;
case 6:P0=‘5‘; break;
case 7:P0=‘6‘; break;
case 8:P0=‘-‘; break;
case 9:P0=‘7‘; break;
case 10:P0=‘8‘; break;
case 11:P0=‘9‘; break;
case 12:P0=‘*‘; break;
case 13:P0=‘0‘; break;
case 14:P0=‘C‘; break;
case 15:P0=‘E‘; break;
case 16:P0=‘/‘; break;
default: break;
}

for(x=0;x<20;x++);
P3 = 0x01;
P3 = 0x09;

// dlms();
// for(x=0;x<50000;x++);
// lcd_init();

}
}
}




nuist001

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 3回
  • 年度积分:0
  • 历史总积分:0
  • 注册:2008年11月11日
发表于:2008-11-11 15:54:50
1楼
急盼解答,还请大师赐教

南通小菜鸟

  • 精华:0帖
  • 求助:0帖
  • 帖子:22帖 | 179回
  • 年度积分:0
  • 历史总积分:267
  • 注册:2006年6月16日
发表于:2008-11-27 21:45:16
2楼
路过                         

happy01

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 45回
  • 年度积分:0
  • 历史总积分:94
  • 注册:2003年5月05日
发表于:2008-12-01 16:43:34
3楼

为什么要把P1赋值然后做与以后又判断啊?我认为P1本来就是你要读得值应该不需要赋值,直接判断就可以了吧?

liangzhk888

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 5回
  • 年度积分:0
  • 历史总积分:8
  • 注册:2007年5月22日
发表于:2008-12-02 17:07:16
4楼

 楼主按键原理没弄清楚,明显逻辑错误.

salman

  • 精华:1帖
  • 求助:0帖
  • 帖子:8帖 | 56回
  • 年度积分:0
  • 历史总积分:128
  • 注册:2003年12月03日
发表于:2008-12-03 13:39:18
5楼
网上代码一大堆,你随便找一个看看就行了,现在都是标准化的,何必自己去写啊

热门招聘
相关主题

官方公众号

智造工程师