c51单片机,按下独立键盘显示到1206液晶的问题。

我买的是郭天祥的单片机,现在想做一个独立键盘按下去之后,1206显示我按下去的次数,就是我不按,1206显示0,按一下,显示1,再按,显示2,如此类推,直到显示9后再归0... 我买的是郭天祥的单片机,现在想做一个独立键盘按下去之后,1206显示我按下去的次数,就是我不按,1206显示0,按一下,显示1,再按,显示2,如此类推,直到显示9后再归0.并且每按一次led都会亮一下再熄灭。
独立键盘按键是S17,接在P3.4口。蛋疼就是P3.4还是LCDEN的接口。
代码如下:求高手看看我有什么问题。

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit d1=P1^0;
sbit dula=P2^6;
sbit wela=P2^7;
sbit key1=P3^4;
sbit lcden=P3^4;
sbit lcdrs=P3^5;

uchar code table[]="0123456789";
uchar num=0;

void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

void write_com(uchar com) //命令函数
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}

void write_data(uchar date) //显示函数
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init() //初始化
{
dula=0;
wela=0;
lcden=0;
write_com(0x38);
write_com(0x0e);
write_com(0x06);
write_com(0x01);
write_com(0x80);
}

void main()
{
wela=0;
dula=0;
init();
write_data(table[num]);

P3=0xff;
while(1)
{

if(!key1) //按下S17,P3.4=0,默认是1就是没有按下
{
d1=0; //点亮led
write_data(table[num]);
delay(50);
while(!key1);
delay(5);
num++;
if(num>9)
num=0;

}

else
d1=1; //熄灭led
}
}
wela=0;
dula=0;
是为了关闭数码管。
现在就是我一打开单片机,,1602显示0和一个光标,led熄灭。就是“0_”这样。
然后我按S17,显示00_,led亮起,然后貌似就死机了,按S17没反应了,led也一直亮。
展开
 我来答
tx_bird
2012-04-13 · TA获得超过1842个赞
知道小有建树答主
回答量:738
采纳率:75%
帮助的人:671万
展开全部
从程序看,你的“write_data”是会将“lcden”置0的,在"main"里又有while(!key1);那自然是死循环了,key1换个位置估计就OK了。
追问
求大神指导一下具体该怎么改~我怕比如说我按键的时间太长,while(!key1);其实就是个松手检测,不松开就停在那。我也再思考一下。
追答
有没有其它空的I/O口了?
如果有,将“lcden”和“key1”分开。重新定义1个key1就可以了。
如果没有,可以这样试一下:
if(!key1) //按下S17,P3.4=0,默认是1就是没有按下
{
d1=0; //点亮led
write_data(table[num]); // 将这行换成:while(!key1);
delay(50);
while(!key1); //将这行换成:write_data(table[num]);
delay(5);
num++;
if(num>9)
num=0;
key1=1; //这行是新加的
}

else
d1=1; //熄灭led
}

这样做了以后就是,你的lcden相当于一直是1,不知道会不会有后遗症。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式