键盘扫描与液晶显示.docx

上传人:b****6 文档编号:5248453 上传时间:2022-12-14 格式:DOCX 页数:16 大小:226.18KB
下载 相关 举报
键盘扫描与液晶显示.docx_第1页
第1页 / 共16页
键盘扫描与液晶显示.docx_第2页
第2页 / 共16页
键盘扫描与液晶显示.docx_第3页
第3页 / 共16页
键盘扫描与液晶显示.docx_第4页
第4页 / 共16页
键盘扫描与液晶显示.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

键盘扫描与液晶显示.docx

《键盘扫描与液晶显示.docx》由会员分享,可在线阅读,更多相关《键盘扫描与液晶显示.docx(16页珍藏版)》请在冰豆网上搜索。

键盘扫描与液晶显示.docx

键盘扫描与液晶显示

杭州电子科技大学

电子设计(A)实验

设计报告

 

实验名称

1

键盘扫描与LCD显示

实验次数

1

小组号

26

姓名学号

潘瑞东

07042222

姓名学号

姓名学号

指导教师

黄继业

 

2009年3月17日

键盘扫描与LCD显示

一.方案论证与比较

方案一:

矩阵键盘有一组I/O口控制,LCD输入数据端口直接与单片机的一组I/O口连接。

此方案的设备比较简单,接线也简单,程序简洁。

但缺点是所占的I/O资源比较多,实际操作性不强。

 

方案二:

矩阵键盘由一组I/O口控制,使用两块74HC595芯片,实现串行输出,转换并行输出,节约了I/O口,提高了单片机的可操作性。

通过在KEIL中用C语言编写HEX文件,控制1602液晶显示屏。

二.总体方案设计

三.理论分析和计算

根据原理图可知,P0.0—P0.7口控制矩阵键盘,P1.0-P1.2作为第一块595芯片的输入,其中P1.0接入SH_CP,P1.1接入ST_CP,P1.2接入DS,其输出的Q4,Q5,Q6输出口分别控制LCD的RS,RW,E.P1.3-P1.5作为第二块595芯片的输入,其输出端Q0-Q7分别控制LCD的对应的数据口。

键盘扫描原理:

先复位使行线输出口全为0,给高四位低电平,使其处于列线读取状态。

然后判断低四位电平状况,如果没有键被按下,则表示没有键被按下,如果有键按下的话,行线和列线的交点处就会被导通,就会出现电平变化。

74HC595工作原理:

595是串入并出带有锁存功能移位寄存器,Q0-Q7为并行数据输出;Q7-Q9为串行数据输出;MR10主复位(低电平);SHCP11移位寄存器时钟输入;STCP12存储寄存器时

钟输入;OE13输出有效(低电平); DS14串行数据输入。

四.软硬件的系统设计

本实验只要检测LCD是否在在显示屏的第一行出现“HelloWorld”.在显示屏的第二行显示所按的键,并在数码管中显示相应位置。

五.测试

本实验最终测试结果实现了4*4矩阵键盘扫描,并实现了通过键盘控制在1602lcd和数码管上显示数字。

在LCD显示屏的第一行出现“HelloWorld”.在显示屏的第二行显示所按的键,并在数码管中显示相应位置。

六.总结

1、通过本次实验,使本人初步掌握了通过C语言,实现单片机控制的基本操作,诸如流水灯,液晶显示控制,键盘扫描。

知道了通过查阅PDF技术文档,解决实验中碰到的问题。

2、通过本次实验,提高了我们组的协同合作能力。

参考文献:

[1]EN_TC1602PDF,74HC595PDF

[2]51单片机C语言常用模块与综合系统设计实例精讲(第二版)电子工业出版社

 

附:

#include

#defineuintunsignedint

#defineucharunsignedchar

ucharcodetable2[]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e'};

ucharcodeled[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

ucharcodetable[]="HelloWorld!

";

ucharcodetable3[]="Thekeyis";

ucharnum,temp,key,num1,num2,num3;

sbitsh_cp_1=P1^3;//sh-cp

sbitst_cp_1=P1^4;//st-cp

sbitDAT_1=P1^5;//DS

sbitsh_cp_2=P1^0;//sh-cp

sbitst_cp_2=P1^1;//st-cp

sbitDAT_2=P1^2;//DS

voiddelay(unsignedcharz)//延时程序

{

unsignedintx,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

 

voidsend_1(uchara)//595给1602发数据控制流水灯

{

ucharc;

for(c=0;c<8;c++)

{

sh_cp_1=0;

DAT_1=a&0x80;

a=a<<1;

sh_cp_1=1;

}

st_cp_1=0;

st_cp_1=1;

}

 

voidsend_2(uchara)//595给1602发数据控制数码管

{

ucharc;

for(c=0;c<8;c++)

{

sh_cp_2=0;

DAT_2=a&0x80;

a=a<<1;

sh_cp_2=1;

}

st_cp_2=0;

st_cp_2=1;

}

voidshumaguan(ucharj,uchari)//第1个选择送入的地址,0x01,0x02,0x03,0x04,第2个选择显示的数字

{ucharh;

if(j==0x01){h==0x0e;}

elseif(j==0x02)

{h=0x0d;}

elseif(j==0x03)

{h=0x0b;}

elseif(j==0x04)

{h=0x07;}

send_2(h);

send_1(i);

}

 

voidwrite_cmd(unsignedcharcmd)//1602显示控制

{

//send_2(0xef);//rs=0;

send_2(0x8f);//rw=0;

delay(5);

send_1(cmd);//P0=cmd;

send_2(0xcf);//e=1;

delay(5);

send_2(0x8f);//e=0;

}

voidwrite_date(unsignedchardate)//1602写数据

{

send_2(0x3f);//;rs=1;0011

send_1(date);//P0=date;

delay(5);

send_2(0xdf);//e=1;1101

delay(5);

send_2(0x3f);//e=0;0011

}

voidinit()//1602初始化程序

{

send_2(0x3f);//e=0;

write_cmd(0x38);

write_cmd(0x0e);

write_cmd(0x06);

write_cmd(0x01);

write_cmd(0x80);//第一个地址

}

 

/*

ucharkey_scan()//键盘扫描

{

ucharkey,temp;

//第一列

P0=0xef;

temp=P0;

if(temp!

=0xef)

{

delay(5);

if(temp!

=0xef)

{

switch(temp)

{

case0xee:

key=1;break;

case0xed:

key=2;break;

case0xeb:

key=3;break;

case0xe7:

key=4;break;

}

}

}

//第二列

P0=0xdf;

temp=P0;

if(temp!

=0xdf)

{

delay(5);

if(temp!

=0xdf)

{

switch(temp)

{

case0xde:

key=5;break;

case0xdd:

key=6;break;

case0xdb:

key=7;break;

case0xd7:

key=8;break;

}

}

}

//第三列

P0=0xbf;

temp=P0;

if(temp!

=0xbf)

{

delay(5);

if(temp!

=0xbf)

{

switch(temp)

{

case0xbe:

key=9;break;

case0xbd:

key=10;break;

case0xbb:

key=11;break;

case0xb7:

key=12;break;

}

}

}

//第四列

P0=0x7f;

temp=P0;

if(temp!

=0x7f)

{

delay(5);

if(temp!

=0x7f)

{

switch(temp)

{

case0x7e:

key=13;break;

case0x7d:

key=14;break;

case0x7b:

key=15;break;

case0x77:

key=16;break;

}

}

}

return(key);

}

*/

 

voidkey_scan_1()//按键判断一;

{

P0=0xef;

temp=P0;

temp=temp&0x0f;

while(temp!

=0x0f)

{

delay(5);

temp=P0;

temp=temp&0x0f;

while(temp!

=0x0f)

{

temp=P0;

switch(temp)

{

case0xee:

key=1;

break;

case0xed:

key=2;

break;

case0xeb:

key=3;

break;

case0xe7:

key=4;

break;

}

delay(5);

while(temp!

=0x0f)

{

temp=P0;

temp=temp&0x0f;

}

}

}

}

voidkey_scan_2()//按键判断二;

{

P0=0xdf;

temp=P0;

temp=temp&0x0f;

while(temp!

=0x0f)

{

delay(5);

temp=P0;

temp=temp&0x0f;

while(temp!

=0x0f)

{

temp=P0;

switch(temp)

{

case0xde:

key=5;

break;

case0xdd:

key=6;

break;

case0xdb:

key=7;

break;

case0xd7:

key=8;

break;

}

delay(5);

while(temp!

=0x0f)

{

temp=P0;

temp=temp&0x0f;

}

}

}

}

voidkey_scan_3()//按键判断三;

{

P0=0xbf;

temp=P0;

temp=temp&0x0f;

while(temp!

=0x0f)

{

delay(5);

temp=P0;

temp=temp&0x0f;

while(temp!

=0x0f)

{

temp=P0;

switch(temp)

{

case0xbe:

key=9;

break;

case0xbd:

key=10;

break;

case0xbb:

key=11;

break;

case0xb7:

key=12;

break;

}

delay(5);

while(temp!

=0x0f)

{

temp=P0;

temp=temp&0x0f;

}

}

}

}

voidkey_scan_4()//按键判断四;

{

P0=0x7f;

temp=P0;

temp=temp&0x0f;

while(temp!

=0x0f)

{

delay(5);

temp=P0;

temp=temp&0x0f;

while(temp!

=0x0f)

{

temp=P0;

switch(temp)

{

case0x7e:

key=13;

break;

case0x7d:

key=14;

break;

case0x7b:

key=15;

break;

case0x77:

key=16;

break;

}

delay(5);

while(temp!

=0x0f)

{

temp=P0;

temp=temp&0x0f;

}

}

}

}

 

voiddisplay()

{

for(num=0;num<12;num++)

{

write_date(table[num]);

delay(20);

}

write_cmd(0x80+0x40+0x04);

for(num3=0;num3<10;num3++)

{

write_date(table3[num3]);

delay(20);

}

}

voidmain()

{

init();

display();

while

(1)

{

key_scan_1();

key_scan_2();

key_scan_3();

key_scan_4();

if(key!

=0)

{

num1=key/10;

num2=key%10;

write_cmd(0x80+0x40+0x0e);

write_date(table2[num1]);

write_cmd(0x80+0x40+0x0f);

write_date(table2[num2]);

key=0;

shumaguan(0x01,led[num2]);

}

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 预防医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1