• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

求助~~这个键盘如数字母,液晶显示程序为什么不亮呢?

艾笠调查团 2016-10-14 浏览量:789
也就是,用矩阵键盘输入字母,然后显示到液晶上
#include
#define uchar unsigned char
#define uint unsigned int
sbit du=P2^6;
sbit we=P2^7;
sbit en=P3^4;
sbit rs=P3^5;
sbit rw=P3^6;
uchar code tab[]="ABCDEFGHIJKLMNOP";
uchar key;
void delay(uint z)
{
uint a;
for(z=z;z>0;z--)
for(a=114;a>0;a--);
}

void Write_dat(uchar dat)
{
P0=dat;
rs=1;
en=0;
delay(5);
en=1;
delay(5);
en=0;
}

void Write_com(uchar com)
{
P0=com;
rs=0;
en=0;
delay(5);
en=1;
delay(5);
en=0;
}

void init()
{
delay(20);
Write_com(0x38);
delay(5);
Write_com(0x0c);
delay(5);
Write_com(0x06);
delay(5);
Write_com(0x01);
delay(5);
}

void miskey()
{
uint temp;
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(4);
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay(4);
temp=P3;
switch(temp)
{
case 0xee:
key=0;break;
case 0xde:
key=1; break;
case 0xbe:
key=2; break;
case 0x7e:
key=3; break;

}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
Write_dat(tab[key]);
delay(5);
}

}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{ delay(5);
temp=P3;
temp=temp&0xf0;
if(temp=temp&0xf0)
{ temp=P3;
switch(temp)
{ case 0xed:
key=4; break;
case 0xdd:
key=5; break;
case 0xbd:
key=6; break;
case 0x7d:
key=7; break;
}
while(temp!=0xf0)
{ temp=P3; temp=temp&0xf0; }
Write_dat(tab[key]);
delay(5);
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{ delay(5);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{ temp=P3;
switch(temp)
{ case 0xeb:
key=8; break;
case 0xdb:
key=9; break;
case 0xbb:
key=10; break;
case 0x7b:
key=11; break;
}
while(temp!=0xf0)
{ temp=P3; temp=temp&0xf0; }
Write_dat(tab[key]);
delay(5);
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{ delay(5);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{ temp=P3;
switch(temp)
{ case 0xe7:
key=12; break;
case 0xd7:
key=13; break;
case 0xb7:
key=14; break;
case 0x77:
key=15; break;
}
while(temp!=0xf0)
{ temp=P3; temp=temp&0xf0;}
Write_dat(tab[key]);
delay(5);

}
}


}

void main()
{
rw=0;
init();
du=0;
we=0;
Write_com(0x80);
while(1)
{
miskey();
}


}


1 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 本帖最后由 MOP 于 2016-10-22 16:45 编辑

    void miskey()
    {
    uint temp;
            P3=0xfe;
            temp=P3;
            temp=temp&0xf0;
            if(temp!=0xf0)
    如果光看這段code,temp也是0xfe才對,而和0xf0取and的話就是0xf0,即最後temp==0xf0,那當然if內永遠不會執行

    這裡其實有關I/O,因為編譯器關係通常會將assign(指派)做優化,所以你上面這段code會變成
    temp=P3=0xfe
    如果您需要P3有所改變時,temp能夠再次讀取值的話,就必須改成,建議宣告成global variable
    volatile uint temp;
    讓編譯器不會優化,依照assign次數來讀取Register次數
    P3=0xfe;
    temp=P3;
    就會不同,以下其他的assign,你就照著改應該就可了,希望有解決您的問題:)




    • 发布于 2016-10-14
    • 举报
    • 评论 0
    • 1
    • 0

其他答案 数量:9
  • 首先你确定一下你的显示程序是不是有问题,你可以把你要显示的东西改成常量,比如 Write_dat(tab[key]);改成 Write_dat(tab[1]);然后看看显示屏是不是有显示,如果没有就是你显示程序的问题了,或者你的液晶没把亮度调好什么的,如果显示没问题就是你按键代码问题,不得不说你的额按键代码写的太长了!对了,液晶如果不能显示着重看一下你的延时,多数是延时的问题。
    • 发布于2016-10-14
    • 举报
    • 评论 0
    • 2
    • 0

  • 不显示数字么?
    不使用键盘,只显示一个常数可以显示么》?
    若是显示不了,那是你液晶 部分的驱动程序的问题。
    • 发布于2016-10-14
    • 举报
    • 评论 0
    • 1
    • 0

  • 兄弟 至少你应该提供 液晶的类型和 键盘的一些信息吧,直接贴代码很少人一行一行看你代码的~
    • 发布于2016-10-14
    • 举报
    • 评论 0
    • 1
    • 0

  • 你的初始化与液晶的手册上的参数是不是对应的。
    • 发布于2016-10-14
    • 举报
    • 评论 0
    • 0
    • 0

  • 瞎折腾 发表于 2016-10-14 18:02
    首先你确定一下你的显示程序是不是有问题,你可以把你要显示的东西改成常量,比如 Write_dat(tab[key]);改 ...

    亮度,对比度全部调好,显示程序也能显示,就是按按键不显示,应该是按键程序错了但又找不出来:L
    • 发布于2016-10-15
    • 举报
    • 评论 0
    • 0
    • 0

  • Eagleson 发表于 2016-10-14 17:43
    兄弟 至少你应该提供 液晶的类型和 键盘的一些信息吧,直接贴代码很少人一行一行看你代码的~ ...

    抱歉哦...我给忘了,1602显示屏,键盘就是一般的矩阵键盘
    • 发布于2016-10-15
    • 举报
    • 评论 0
    • 0
    • 0

  • 汉云 发表于 2016-10-14 15:55
    不显示数字么?
    不使用键盘,只显示一个常数可以显示么》?
    若是显示不了,那是你液晶 部分的驱动程序的问 ...

    该成数字后之后不能显示,不过加个单个显示程序却能显示字母和数字
    • 发布于2016-10-15
    • 举报
    • 评论 0
    • 0
    • 0

  • uchar code tab[]="ABCDEFGHIJKLMNOP";
    这里是不是应该改成
    uchar code tab[]={"ABCDEFGHIJKLMNOP"};
    • 发布于2016-10-15
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

求助~~这个键盘如数字母,液晶显示程序为什么不亮呢?