1、杭州电子科技大学电子设计(A)实验设计报告实验名称 1键盘扫描与 LCD 显示实验次数 1小组号 26姓名学号 潘瑞东 07042222姓名学号姓名学号指导教师 黄继业2009 年 3 月 17 日键盘扫描与 LCD 显示一 方案论证与比较方案一:矩阵键盘有一组 I/O 口控制,LCD 输入数据端口直接与单片机的一组 I/O 口连接。此方案的设备比较简单,接线也简单,程序简洁。但缺点是所占的 I/O 资源比较多,实际操作性不强。1602LCD方案二:矩阵键盘由一组 I/O 口控制,使用两块 74HC595 芯片,实现串行输出,转换并行输出,节约了 I/O 口,提高了单片机的可操作性。通过在 K
2、EIL 中用 C 语言编写 HEX 文件,控制 1602 液晶显示屏。键盘单片机 74HC595 LCD二总体方案设计矩阵键盘 STC 是否有键盘输入键盘扫描1 6 0 2 显示 数码管显示复位单片机三理论分析和计算 根据原理图可知,P0.0P0.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 的对应的数据口。键盘扫描原理:先
3、复位使行线输出口全为 0,给高四位低电平,使其处于列线读取状态。然后判断低四位电平状况,如果没有键被按下,则表示没有键被按下,如果有键按下的话,行线和列线的交点处就会被导通,就会出现电平变化。74HC595 工作原理:595 是串入并出带有锁存功能移位寄存器,Q 0-Q7为 并 行 数 据 输 出 ; Q7-Q9 为 串 行 数 据 输 出 ; MR 10 主 复 位 ( 低 电 平 ); SHCP 11 移 位 寄 存 器 时 钟 输 入 ; STCP 12 存 储 寄 存 器 时钟 输 入 ; OE 13 输 出 有 效 ( 低 电 平 ) ; DS 14 串 行 数 据 输 入 。四软硬
4、件的系统设计 本实验只要检测 LCD 是否在在显示屏的第一行出现“Hello World”.在显示屏的第二行显示所按的键,并在数码管中显示相应位置。五测试 本实验最终测试结果实现了 4*4 矩阵键盘扫描,并实现了通过键盘控制在 1602lcd 和数码管上显示数字。在 LCD 显示屏的第一行出现“Hello World”.在显示屏的第二行显示所按的键,并在数码管中显示相应位置。六总结1、通过本次实验,使本人初步掌握了通过 C 语言,实现单片机控制的基本操作,诸如流水灯,液晶显示控制,键盘扫描。知道了通过查阅 PDF 技术文档,解决实验中碰到的问题。2、通过本次实验,提高了我们组的协同合作能力。参
5、考文献:1 EN_TC1602PDF,74HC595PDF2 51 单片机 C 语言常用模块与综合系统设计实例精讲(第二版) 电子工业出版社附:#include#define uint unsigned int#define uchar unsigned charuchar code table2=0,1,2,3,4,5,6,7,8,9,a,b,c,d,e;uchar code led=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e;uchar code table=“Hello W
6、orld!“;uchar code table3=“The key is“;uchar num,temp,key,num1,num2,num3;sbit sh_cp_1=P13; /sh-cp sbit st_cp_1=P14; /st-cpsbit DAT_1=P15; /DSsbit sh_cp_2=P10; /sh-cpsbit st_cp_2=P11; /st-cp sbit DAT_2=P12; /DSvoid delay(unsigned char z) /延时程序unsigned int x,y;for(x=z;x0;x-)for(y=110;y0;y-) ;void send_
7、1(uchar a) /595 给 1602 发数据 控制流水灯 uchar c; for(c=0;c8;c+)sh_cp_1=0;DAT_1=aa=a1; sh_cp_1=1;st_cp_1=0;st_cp_1=1;void send_2(uchar a) / 595 给 1602 发数据 控制数码管 uchar c; for(c=0;c8;c+)sh_cp_2=0;DAT_2=aa=a1; sh_cp_2=1;st_cp_2=0;st_cp_2=1;void shumaguan(uchar j,uchar i) /第 1 个选择送入的地址,0x01,0x02,0x03,0x04,第 2 个
8、选择显示的数字uchar h;if(j=0x01) h=0x0e; else if(j=0x02)h=0x0d;else if(j=0x03)h=0x0b;else if(j=0x04)h=0x07;send_2(h);send_1(i);void write_cmd(unsigned char cmd) /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;void write_date(unsig
9、ned char date) /1602 写数据send_2(0x3f);/; rs=1; 0011send_1(date);/ P0=date;delay(5);send_2(0xdf);/ e=1; 1101 delay(5);send_2(0x3f);/ e=0; 0011void init() /1602 初始化程序send_2(0x3f);/e=0;write_cmd(0x38);write_cmd(0x0e);write_cmd(0x06);write_cmd(0x01);write_cmd(0x80); /第一个地址/*uchar key_scan() /键盘扫描uchar ke
10、y,temp;/第一列P0=0xef;temp=P0;if(temp!=0xef)delay(5);if(temp!=0xef)switch(temp)case 0xee:key=1;break;case 0xed:key=2;break;case 0xeb:key=3;break;case 0xe7:key=4;break;/第二列P0=0xdf;temp=P0;if(temp!=0xdf)delay(5);if(temp!=0xdf)switch(temp)case 0xde:key=5;break;case 0xdd:key=6;break;case 0xdb:key=7;break;c
11、ase 0xd7:key=8;break;/第三列P0=0xbf;temp=P0;if(temp!=0xbf)delay(5);if(temp!=0xbf)switch(temp)case 0xbe:key=9;break;case 0xbd:key=10;break;case 0xbb:key=11;break;case 0xb7:key=12;break;/第四列P0=0x7f;temp=P0;if(temp!=0x7f)delay(5);if(temp!=0x7f)switch(temp)case 0x7e:key=13;break;case 0x7d:key=14;break;case
12、 0x7b:key=15;break;case 0x77:key=16;break;return(key);*/void key_scan_1() /按键判断一;P0=0xef;temp=P0;temp=tempwhile(temp!=0x0f)delay(5);temp=P0;temp=tempwhile(temp!=0x0f)temp=P0;switch(temp)case 0xee:key=1;break;case 0xed:key=2;break;case 0xeb:key=3;break;case 0xe7:key=4;break;delay(5);while(temp!=0x0f)temp=P0;temp=tempvoid key_scan_2() /按键判断二;P0=0xdf;temp=P0;temp=tempwhile(temp!=0x0f)delay(5);temp=P0;temp=tempwhile(temp!=0x0f)temp=P0;switch(temp)case 0xde:key=5;break;case 0xdd:key=6;break;case 0xdb:key=7;