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也一直亮。 展开
独立键盘按键是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也一直亮。 展开
1个回答
展开全部
从程序看,你的“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,不知道会不会有后遗症。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询