键盘扫描与液晶显示.docx
《键盘扫描与液晶显示.docx》由会员分享,可在线阅读,更多相关《键盘扫描与液晶显示.docx(16页珍藏版)》请在冰豆网上搜索。
键盘扫描与液晶显示
杭州电子科技大学
电子设计(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]);
}
}
}