单片机课程设计--1602LCD显示电话拨号键盘按键
- 格式:doc
- 大小:191.50 KB
- 文档页数:19
电话按键显示器课程设计一、课程目标知识目标:1. 学生能够理解电话按键显示器的基本结构和工作原理;2. 学生能够掌握电话按键显示器中LED灯的连接方式和控制方法;3. 学生能够了解电话按键显示器在生活中的应用。
技能目标:1. 学生能够运用所学知识,设计并制作一个简单的电话按键显示器;2. 学生能够通过实际操作,熟练掌握电话按键显示器的调试方法;3. 学生能够运用电话按键显示器进行基本的数字输入和显示。
情感态度价值观目标:1. 学生能够认识到电话按键显示器在科技发展中的重要性,培养对科技创新的兴趣;2. 学生在课程学习过程中,增强合作意识,培养团队精神;3. 学生能够关注生活中的科技创新,激发学习热情,提高自主学习能力。
课程性质分析:本课程为电子技术实践课程,以电话按键显示器为载体,结合电子技术基础知识,培养学生的动手操作能力和创新能力。
学生特点分析:学生处于初中阶段,具有一定的电子技术基础,好奇心强,喜欢动手操作,但需引导培养团队协作能力。
教学要求:结合学生特点,注重理论与实践相结合,强调动手实践,鼓励学生创新,培养团队合作精神。
通过本课程的学习,使学生在掌握电话按键显示器相关知识的基础上,提高综合运用能力。
二、教学内容1. 电话按键显示器基础知识:- 电话按键显示器的结构组成;- 电话按键显示器的工作原理;- 电话按键显示器中LED灯的连接方式。
2. 电话按键显示器制作与调试:- 制作电话按键显示器的步骤和方法;- 电话按键显示器的调试技巧;- 故障排查与解决方法。
3. 电话按键显示器应用实例:- 电话按键显示器在生活中的应用案例分析;- 创意电话按键显示器设计;- 电子制作项目的合作与分工。
教学大纲安排:第一课时:电话按键显示器基础知识学习,介绍电话按键显示器的结构组成和工作原理,分析LED灯的连接方式。
第二课时:电话按键显示器制作,指导学生按照步骤制作电话按键显示器,并掌握调试技巧。
第三课时:电话按键显示器应用实例分析,通过实例讲解电话按键显示器在生活中的应用,激发学生创新意识。
项目:1602LCD显示电话拨号键盘按键设计者:陈小玲1602液晶显示模块指令驱动程序设计介绍液晶显示器以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,在各类仪表和低功耗系统中得到广泛的应用。
根据显示内容可以分为字符型液晶,图形液晶。
根据显示容量又可以分为单行16字,2行16字,两行20字等等。
这里介绍常用的字16字X2行的字符型液晶模块的使用方法。
这是一种通用模块。
与数码管相比该模块有如下优点:1.位数多,可显示32位,32个数码管体积相当庞大了2.显示内容丰富,可显示所有数字和大、小写字母3.程序简单,如果用数码管动态显示,会占用很多时间来刷新显示,而1602自动完成此功能。
1602采用标准的16脚接口,其中:(模块背面有标注)第1脚:VSS为地电源第2脚:VDD接5V正电源第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度(建议接地,弄不好有的模块会不显示)第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。
第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:D0~D7为8位双向数据线。
第15~16脚:空脚(有的用来接背光)1602模块的设定,读写,与光标控制都是通过指令来完成,共有11条指令,如下:程序设计调试与实训:A键用于随机生成一道口诀题,数字键0-9用于输入结果(程序可限制最多只能输入俩位数),B键判断正误,如果正确则闪烁显示success,否则显示error, C键用于清除当前输入的答案,一遍重新输入,DJ键用于显示正确答案。
Proteus绘制的原理图编译的源代码://名称:1602LCD显示电话拨号键盘按键//说明:本例将电话拨号键盘上所拨号号码显示在1602液晶屏上。
课程设计课程名称单片机课程设计题目名称电话键盘及拨号的模拟学生学院材料与能源学院专业班级热能与动力工程(制冷方向)1001 学号**********学生姓名陈光谋指导教师王桂棠日21 月06 年2013.目录1、概述1.1 课程项目名称1.2 设计任务及要求系统设计方案2、2.1 硬件介绍3、电路设计3.1 电路原理图3.2 程序清单4、Proteus软件仿真4.1系统仿真电路图4.2 仿真结果分析5、课程设计心得体会6、参考文献1、概述1.1课程设计项目名称电话拨号键LCD显示1.2设计任务及要求1.实验要求:设计一个单片机监控的电话拨号键盘,将电话键盘中拨出的某一电话号码,显示在LCD显示屏上。
电话键盘共有12个键,除了“0”~“9”10个数字键外,还有“*”键用于实现退格功能,即清除输入的号码;“#”键用于清除显示屏上所有的数字显示。
还要求每按下一个键要发出声响,以表示按下该键。
2.仿真实现说明:本实验在Proteus下按设计要求用P1口扩展了12个键盘,其中每个键盘所代表的含义已在Proteus下用文本注出。
在LCD显示中,第一行为设计者名,第二行开始显示所拨的电话号码,最多为16位(因为LCD第二行功能显示16个字符)。
2、系统设计方案2.1 硬件介绍1.1 AT89C51简介AT89C51是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。
AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除1000次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。
名称:LCD1602论坛:编写:shifang日期:2009.5修改:无内容:通过矩阵键盘输入,依次显示0-F16中字符引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include<intrins.h>sbit RS = P2^4; //定义端口sbit RW = P2^5;sbit EN = P2^6;#define RS_CLR RS=0#define RS_SET RS=1#define RW_CLR RW=0#define RW_SET RW=1#define EN_CLR EN=0#define EN_SET EN=1#define DataPort P0#define KeyPort P1unsigned char code dofly_code[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};//转换成液晶显示的字符/*------------------------------------------------uS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned char t){while(--t);}/*------------------------------------------------mS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/*------------------------------------------------判忙函数------------------------------------------------*/ bit LCD_Check_Busy(void){DataPort= 0xFF;RS_CLR;RW_SET;EN_CLR;_nop_();EN_SET;return (bit)(DataPort & 0x80);}/*------------------------------------------------写入命令函数------------------------------------------------*/ void LCD_Write_Com(unsigned char com) {while(LCD_Check_Busy()); //忙则等待RS_CLR;RW_CLR;EN_SET;DataPort= com;_nop_();EN_CLR;}/*------------------------------------------------写入数据函数------------------------------------------------*/ void LCD_Write_Data(unsigned char Data) {while(LCD_Check_Busy()); //忙则等待RS_SET;EN_SET;DataPort= Data;_nop_();EN_CLR;}/*------------------------------------------------清屏函数------------------------------------------------*/void LCD_Clear(void){LCD_Write_Com(0x01);DelayMs(5);}/*------------------------------------------------写入字符串函数------------------------------------------------*/void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) {if (y == 0){LCD_Write_Com(0x80 + x);}else{LCD_Write_Com(0xC0 + x);}while (*s){LCD_Write_Data( *s);s ++;}}/*------------------------------------------------写入字符函数------------------------------------------------*/void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) {if (y == 0){LCD_Write_Com(0x80 + x);}elseLCD_Write_Com(0xC0 + x);}LCD_Write_Data( Data);}/*------------------------------------------------初始化函数------------------------------------------------*/void LCD_Init(void){LCD_Write_Com(0x38); /*显示模式设置*/DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);LCD_Write_Com(0x08); /*显示关闭*/LCD_Write_Com(0x01); /*显示清屏*/LCD_Write_Com(0x06); /*显示光标移动设置*/DelayMs(5);LCD_Write_Com(0x0C); /*显示开及光标设置*/}/*------------------------------------------------按键扫描函数,返回扫描键值------------------------------------------------*/unsigned char KeyScan(void) //键盘扫描函数,使用行列反转扫描法{unsigned char cord_h,cord_l;//行列值中间变量KeyPort=0x0f; //行线输出全为0cord_h=KeyPort&0x0f; //读入列线值if(cord_h!=0x0f) //先检测有无按键按下{DelayMs(10); //去抖if((KeyPort&0x0f)!=0x0f){cord_h=KeyPort&0x0f; //读入列线值KeyPort=cord_h|0xf0; //输出当前列线值cord_l=KeyPort&0xf0; //读入行线值while((KeyPort&0xf0)!=0xf0);//等待松开并输出return(cord_h+cord_l);//键盘最后组合码值}}return(0xff); //返回该值}/*------------------------------------------------按键值处理函数,返回扫键值------------------------------------------------*/unsigned char KeyPro(void){switch(KeyScan()){case 0x7e:return 0;break;//0 按下相应的键显示相对应的码值case 0x7d:return 1;break;//1case 0x7b:return 2;break;//2case 0x77:return 3;break;//3case 0xbe:return 4;break;//4case 0xbd:return 5;break;//5case 0xbb:return 6;break;//6case 0xb7:return 7;break;//7case 0xde:return 8;break;//8case 0xdd:return 9;break;//9case 0xdb:return 10;break;//acase 0xd7:return 11;break;//bcase 0xee:return 12;break;//ccase 0xed:return 13;break;//dcase 0xeb:return 14;break;//ecase 0xe7:return 15;break;//fdefault:return 0xff;break;}}/*------------------------------------------------主函数------------------------------------------------*/void main(void){unsigned char i,j,num;LCD_Init();LCD_Write_Com(0x0F);//光标开,光标闪烁开LCD_Write_String(0,0,"Press the key !");while (1){num=KeyPro();if(num!=0xff){if((i==0)&&(j==0))//回到第一个字符时清屏LCD_Clear();//清屏LCD_Write_Char(0+i,0+j,dofly_code[num]);//依次显示输入字符i++;if(i==16)//如果第一行显示满,转到第二行{i=0;j++;if(j==2)//如果2行都显示满,清屏后重新从第一行显示{j=0;}}}}}。
摘要在日常生活中,我们经常要通过按键来实现对电子装置的控制,小到手表手机,中到电视电脑,大到各种复杂仪器,都需要通过按键来实现各种操作。
本次课程设计作为实践教学的一个重要环节,将以按键控制显示为主题,以1602液晶、MM74C922解码芯片、AT89C52单片机及其接口芯片为核心构造一个键盘控制显示系统,并使用Proteus软件对所设计的电路进行仿真,仿真结果是在1602液晶上显示所按下的键值。
关键词:Proteus仿真AT89C52 1602液晶MM74C922解码芯片第一章总体设计1.1电路结构分析本次设计的目标为单片机控制的键盘识别显示系统,主要采用AT89C52单片机作为核心,由矩阵键盘电路、译码芯片、液晶显示等模块构成,分别对按键信息和显示电路以及软、硬件各个部分进行控制;本设计采用C言编程来实现对单片机的控制。
实际运作时,单片机会将检测到的按键信号转换成数字,显示于1602液晶上。
系统主要结构可以拆分如下:①矩阵键盘:按键传送输入信息;此键盘采用的是4X4矩阵键盘,能输入0~9,+,—,=,空格,返回,清零。
②键盘识别:矩阵键盘连接的是MM74C922解码芯片,通过解码芯片来识别输入的按键位置。
③AT89C52:采用软件编程来实现按键信息的提取和转换;④1602液晶:用于显示最终被单片机转换过的按键信息。
由以上构思可以设计此按键显示电路。
1.2总体方案设计总体电路原理框图:如图 1.2所示图1.2总体电路原理方框图本次设计分两步来完成,第一步,解码芯片调试系统,将解码芯片接口连接到矩阵键盘作为AT89C52单片机的输入装置,然后以P2口作为输出端并连接一个数码管观察输出结果。
第二步,1602的液晶调试系统,此过程就是将数码管换成1602液晶在进行结果显示。
1.3蜂鸣器模块设计蜂鸣器模块设计如图 1.3所示图 1.3 蜂鸣器模块电路图蜂鸣器的驱动电流比较大一般要500MA~1000MA,所以不能直接接在AT82C52单片机的接口上,需要加一个三极管来进行驱动。
1602LCD仿手机键盘单片机课程设计介绍本文档旨在介绍一个关于1602LCD仿手机键盘的单片机课程设计。
在这个课程设计中,我们将学习如何使用单片机与1602LCD显示屏以及按键进行交互,实现一个仿手机键盘的简单应用。
这有助于初学者掌握单片机和LCD屏幕的基本使用方法,并加强他们的编程能力。
设计目标本课程设计的主要目标是实现以下功能:1.在1602LCD屏幕上显示一个简单的用户界面,包括一个仿手机键盘和一个文本框2.用户可以使用仿手机键盘输入文本,并在文本框中显示输入的内容3.实现基本的字符串操作函数,如删除字符、清空文本等4.通过按下对应按钮实现不同的功能,如发送短信、拨打电话等系统组成该系统主要由以下组件构成:1.单片机:我们将使用一块适配单片机,例如Arduino或者树莓派,作为主控制器来控制整个系统。
2.1602LCD屏幕:它是用于显示用户界面和输入文本的显示设备。
3.按键:我们需要一组按键来模拟手机键盘的输入。
4.连接线:这些连接线将用于将单片机、LCD屏幕和按键连接在一起。
硬件搭建1.首先,将单片机与1602LCD屏幕连接。
根据所使用的单片机型号,查找LCD屏幕的引脚定义,并将其连接到正确的单片机引脚上。
2.接下来,将按键连接到单片机的输入引脚上。
你可以自定义按键的布局,最基本的要求是包含数字、字母和功能键。
软件设计1.首先,我们需要使用相应的开发环境(如Arduino IDE)编写程序代码。
2.在程序中,我们需要定义LCD屏幕的引脚,并初始化它。
然后,我们可以使用LCD库函数来控制显示内容,如在屏幕上显示文本、清空屏幕等。
3.接下来,我们需要定义按键的引脚,并初始化它们。
我们可以编写函数来监测按键的输入状态,并根据按下的按键执行相应的操作。
4.我们还需要编写字符串操作函数,如删除字符、清空文本等。
这些函数能够处理用户输入的文本并显示在LCD屏幕上。
5.最后,我们需要编写主循环函数,以便不断检测按键输入和更新LCD屏幕内容。
单片机应用技术课程报告
实验名称1602LCD液晶显示屏的显示实验时间2020年 7月 9日学生姓名实验地点钉钉群线上
同组人员专业班级
1、实验目的
1、会使用单片机4个并行I/O端口连接外部设备并构建单片机最小应用系统。
2、能使用工具软件绘制单片机硬件原理图、能编写简LCD控制程序。
3、会使用LCD1602显示指定的内容。
2、任务设计要求
采用STC89C52单片机构建最小系统,在I/O口外接1602,编程实现在1602字符型LCD显示:实现字符的静态和动态显示。
显示字符为第一行:“I am xx”,第二行:“Hou are you”。
3、总体设计方案
根据实验任务要求,通过功能分析,设计的系统总体方案如图所示。
并
行接口AT89C51
单片机
电源
时钟电路
复位电路
实现led显示屏显示
4、硬件电路设计
5、软件程序设计
(2)程序清单
#include<reg51.h>
#include<intrins.h>//包含_nop_()空函数指令的头文件#define uchar unsigned char
#define uint unsigned int
#define out P0
sbit RS=P2^0;//位变量
sbit RW=P2^1;//位变量
sbit E=P2^2;//位变量
void lcd_ini();//LCD初始化函数
void check_busy();//检查忙标志函数
2)性能指标测试及结果分析。
51单片机之LCD1602液晶显示与4×4矩阵键盘一、要求:液晶显示器第一行显示“Hello World!”;第二行显示键值和按键次数,且按键时间大于1.5秒时,识别为2次按键。
单片机型号:STC--12C5A16AD二、程序代码:#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intunsigned char code dis[]={"Hello World!"};unsigned char code dis1[]={"KEY:"};unsigned char code dis2[]={"TIME:"};ucharkey_val[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G'};uchar code key_code[]={0x77,0x7B,0x7D,0x7E,0xB7,0xBB,0xBD,0xBE,0xD7,0x DB,0xDD,0xDE,0xE7,0xEB,0xED,0xEE};uchar key,x,count;uint time=0;sbit U3_DS=P1^5;sbit U3_STCP=P1^4;sbit U3_SHCP=P1^3;sbit U4_DS=P1^2;sbit U4_STCP=P1^1;sbit U4_SHCP=P1^0;void delay(unsigned int n);//74HC595void U3_595(unsigned char num){unsigned char count1;for (count1=0;count1<=7;count1++){if ((num&0x80)==0x80)//最高位为1,则向SDATA_595发送1 {U3_DS=1;}else{U3_DS=0;}U3_SHCP=0;U3_SHCP=1;num<<=1;//左移}U3_STCP=0;U3_STCP=1;}void U4_595(unsigned char num)//发送指令到RS,RW,E(4,5,6位){unsigned char count2;for (count2=0;count2<=7;count2++){if((num&0x80)==0x80){U4_DS=1;}else{U4_DS=0;}U4_SHCP=0;U4_SHCP=1;num<<=1;}U4_STCP=0;U4_STCP=1;}//LCD延时子程序 n=1时延时1ms void delay(unsigned int n){unsigned int i;for(;n>0;n--)for(i=0;i<255;i++)_nop_();}//写指令到LCDvoid wcmd(unsigned char cmd) {U4_595(0x00);U3_595(cmd);U4_595(0x40);U4_595(0x00);}//写要显示的数据到LCDvoid wdat(unsigned char dat) {U4_595(0x10);U3_595(dat);U4_595(0x50);U4_595(0x10);}//初始化LCDvoid init(){wcmd(0x38);//设置8位总线双行显示,5*7点阵delay(20);wcmd(0x0C);//开显示,开光标,不闪烁delay(20);wcmd(0x06);//读写字符时地址加1delay(20);wcmd(0x01);//清屏delay(20);wcmd(0x80+2);for(x=0;x<12;x++) //第一行显示hello world! wdat(dis[x]);delay(20);wcmd(0xC2);for(x=0;x<4;x++)//第二行显示按键和次数wdat(dis1[x]);wcmd(0xC8);for(x=0;x<5;x++)wdat(dis2[x]);TMOD=0x01;//中断设置TH0=0x3C;//定时初值设置TL0=0xB0;EA=1;//开中断ET0=1;//定时器0中断允许}//键盘扫描子程序uchar keyscan(void){unsigned char hang,lie,keycode;char i;P0=0xf0;hang=P0;if((hang&0xf0)!=0xf0) //有键按下?{delay(50); //去抖动hang=P0;if((hang&0xf0)!=0xf0) //有键按下{P0=0x0f;lie=P0;keycode=hang|lie; //获得键码for(i=15;i>=0;i--){if(keycode==key_code[i]) //查找键码{key=i;return(key);}}}}else{P0=0xff; //按键弹起则关闭定时器TR0=0;count=0;return (16);}}void keydown() //判断按键按下和显示程序{P0=0xf0;if((P0&0xf0)!=0xf0){TR0=1; //开启定时器while(P0!=0xf0)keyscan(); //获得键码if(count<30){time++;count=0;}else //超过1.5秒计数2次{time+=2;count=0;}wcmd(0xC6); //设置键值显示位置wdat(key_val[16-key]);wcmd(0xCD); //设置次数显示位置if(time<10)wdat(0x30+time);if(time>9&&time<100){wdat(0x30+time/10);wdat(0x30+time%10);}if(time>99&&time<1000){wdat(0x30+time/100);wdat(0x30+time/10-(time/100)*10); wdat(0x30+time%10);}}}//中断函数void timer() interrupt 1{TH0=0x3C;TL0=0xB0;count++;}void main(void){init();for(;;){keydown();}}。
#include<reg52.h>#include<intrins.h> //包含_nop_()函数定义的头文件typedef unsigned int uint ;typedef unsigned char uchar ;sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚uchar keyscan();void delay1ms();void delay(unsigned char n);unsigned char BusyTest(void);void WriteInstruction (unsigned char dictate);void WriteAddress(unsigned char x);void WriteData(unsigned char y);void LcdInitiate(void);void delay1ms(){unsigned char i,j;for(i=0;i<10;i++)for(j=0;j<33;j++);}void delay(unsigned char n){unsigned char i;for(i=0;i<n;i++)delay1ms();}unsigned char BusyTest(void){bit result;RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态RW=1;E=1; //E=1,才允许读写_nop_(); //空操作_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间result=BF; //将忙碌标志电平赋给resultE=0;return result;}void WriteInstruction (unsigned char dictate){while(BusyTest()==1); //如果忙就等待RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令RW=0;E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,// 就是让E从0到1发生正跳变,所以应先置"0"_nop_();_nop_(); //空操作两个机器周期,给硬件反应时间P0=dictate; //将数据送入P0口,即写入指令或地址_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=1; //E置高电平_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令}void WriteAddress(unsigned char x){WriteInstruction(x|0x80); //显示位置的确定方法规定为"80H+地址码x"}void WriteData(unsigned char y){while(BusyTest()==1);RS=1; //RS为高电平,RW为低电平时,可以写入数据RW=0;E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,// 就是让E从0到1发生正跳变,所以应先置"0"P0=y; //将数据送入P0口,即将数据写入液晶模块_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=1; //E置高电平_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令}void LcdInitiate(void){delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间WriteInstruction(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口delay(5); //延时5msWriteInstruction(0x38);delay(5);WriteInstruction(0x38);delay(5);WriteInstruction(0x0f); //显示模式设置:显示开,有光标,光标闪烁delay(5);WriteInstruction(0x06); //显示模式设置:光标右移,字符不移delay(5);WriteInstruction(0x01); //清屏幕指令,将以前的显示内容清除delay(5);}uchar keyscan(void){uchar Key1,Key2,tt; uint temp;P1=0x0f;if((P1&0x0f)==0x0f){return 0xff;}delay(10);if((P1&0x0f)==0x0f)return 0xff; // jiancha2=0;Key1=P1&0x0f;P1=0xf0;if((P1&0xf0)==0xf0)return 0xff;delay(10);if((P1&0xf0)==0xf0)return 0xff;Key2=P1&0xf0;while((P1&0xf0)!=0xf0);tt=Key1|Key2;switch(tt){case 0xe7:temp='1';break;case 0xd7:temp='2';break;case 0xb7:temp='3';break;case 0x77:temp='a';break;case 0xeb:temp='4';break;case 0xdb:temp='5';break;case 0xbb:temp='6';break;case 0x7b:temp='b';break;case 0xed:temp='7';break;case 0xdd:temp='8';break;case 0xbd:temp='9';break;case 0x7d:temp='c';break;case 0xee:temp='*';break;case 0xde:temp='0';break;case 0xbe:temp='#';break;case 0x7e:temp='d';break;}return(temp);}void main(){uchar b,i,j;LcdInitiate(); //调用LCD初始化函数i=0;while(1){b=keyscan();if(b!=0xff){WriteData(b);i++;b=0xff;} //字符的字形点阵读出和显示由液晶模块自动完成if(b=='*'){j=i;}if(b=='#'){j++}if(j==i) Break;}}。
1602 LCD显示电话拨号键盘按键概述本文档介绍了1602 LCD显示电话拨号键盘按键的设计方案及其主要功能。
该方案主要由硬件部分和软件部分组成,硬件部分包括1602液晶显示屏、电话拨号键盘、Arduino板、面包板等;软件部分主要使用Arduino IDE编程,实现LCD屏幕显示、按键检测等功能。
该方案能够检测电话拨号键盘的按键状态并在1602 LCD显示屏上显示对应按键。
设计方案硬件部分硬件部分主要包括以下几个方面:1. 1602液晶显示屏1602液晶显示屏是本方案的显示设备,通过数根引脚与Arduino板相连。
在本方案中,主要利用它显示电话号码和被按下的按键。
2. 电话拨号键盘电话拨号键盘是本方案的主要输入设备,它可以检测到被按下的按键,并将这些信息通过引脚连接Arduino板。
3. Arduino板Arduino板是本方案的主要控制器,它和显示设备、输入设备之间互相连接,通过Arduino IDE编程,实现程序运行、数据传输等功能。
4. 面包板面包板主要是为了方便电路的连接和调试,以及充分利用现成的模块和元器件。
软件部分软件部分主要使用Arduino IDE编程,实现以下几个方面的功能:1. 显示屏幕显示利用Arduino IDE编程,控制1602液晶显示屏上显示电话号码、被按下的按键等相关信息。
2. 按键事件检测利用Arduino IDE编程,通过对电话拨号键盘输入端口的状态检测,实现对按键事件的识别。
主要功能1. 显示电话号码本方案所设计的1602 LCD显示屏,通过数根引脚与Arduino板相连。
在本方案中,主要利用它显示电话号码和被按下的按键。
2. 按键检测利用Arduino IDE编程,通过对电话拨号键盘输入端口的状态检测,实现对按键事件的识别。
当电话拨号键盘检测到按键事件,则通过Arduino板进行响应,并在1602 LCD显示屏上显示对应按键信息。
本文介绍了1602 LCD显示电话拨号键盘按键的设计方案及其主要功能。
单片机课程设计--1602LCD显示电话拨号键盘按键琼州学院电子信息工程学院课程设计报告课程名称: 单片机课程设计设计题目:1602LCD显示电话拨号键盘按键专业: 通信工程班级: 2010级1班学生姓名: ***学号:起止日期: 2013年4月,2013年6月指导教师:指导教师评语: 最终成绩: 指导教师签名: 年月日成项目权重成绩绩1、设计过程中的学习态度 0.2 评2、课程设计的质量及答辩 0.5 定 3、设计报告书规范程度 0.34、总成绩目录1.设计目的 ..................................................... 2 2.设计要求 ..................................................... 2 3.设计方案 .. (2)3.1单片机最小系统 (2)3.2输入按键系统 (3)3.3 1602LCD显示系统 (3)3.4设计原理图 ............................................... 64.分析与编程 (7)4.1系统流程图 (7)4.2 LCD显示程序流程图 (7)4.3 设计程序 ................................................ 85.仿真 ........................................................ 146.在实现过程中遇到的问题及排除措施 ............................ 157.设计心得体会 ................................................ 16 参考文献 (16)1602LCD显示电话拨号键盘按键摘要:本设计以89C51单片机为核心,设计1602LCD显示电话拨号键盘按键,对按键输入系统,LCD1602的引脚功能、控制命令、读写时序进行了分析。
在keil 中进行编程,在proteus软件中进行了仿真。
关键字:单片机;1602LCD显示屏;键盘系统11.设计目的单片机原理与应用课程设计是单片机原理与应用专业课程的实践性教学环节,通过该教学环节,要求达到以下目的:(1)培养学生工程设计能力和综合分析问题、解决问题的能力,能根据工程需求,利用Proteus环境等构建原理图,利用Keil等环境编写调试单片机功能程序,最终构建工程的硬件平台和软件平台,达到预定功能,实现单片机具体应用;(2)熟悉在Proteus环境中的ISIS模块原理图绘制,掌握仿真的基本方法;(3)掌握Keil C编程及C51编程语言和汇编语言开发;(4)掌握单片机片内资源编程,能熟练应用相关片内资源合理配置相关寄存器;(5)实现由原理图到PCB图,硬件与软件结合实现功能,提高电子电路的设计和实验能力,为以后从事生产和科研工作打下一定的基础。
2.设计要求要求以51单片机作为微控制器,通过1602LCD显示屏显示拨号键盘,键值包括数字0-9及“*”“#”等12个按键。
数字显示为逐个显示方式,最多显示11位。
3.设计方案首先构建单片机最小系统、键盘输入系统及1602LCD显示系统。
通过单片机扫面键值,将其结果输入到1602LCD显示屏上。
3.1单片机最小系统[1]单片机最小系统主要由电源、复位、震荡电路以及扩展部分等部分组成。
2图3.1单片机最小系统3.2输入按键系统独立的键盘与单片机相连时,每个按键都需要单片机的一个I/O口,若按键较多时,占用的I/O口资源就会过多,为此就引入了矩阵键盘。
本次设计共有0~9、#、*共12个按键,因此引入3*4的矩阵键盘,共需要7个I/O口,7条线分别与单片机P3口相连。
图3.2输入按键系统3.3 1602LCD显示系统AT89C51单片机,P0口输出时,必须使用上拉电阻,提高电压,否则无法得到输出结果。
3图3.3 1602 LCD显示系统3.31 LCD1602原件显示原理图3.3 1LCD1602原件图表1 LCD1602引脚功能编号符号引脚说明编号符号引脚说明1 VSS 电源地 9 D2 数据2 VDD 电源正极 10 D3 数据3 VL 液晶显示偏压 11 D4 数据4 RS 数据/命令选择 12 D5 数据5 R/W 读/写选择 13 D6 数据6 E 使能信号 14 D7 数据7 D0 数据 15 D8 背光源正极8 D1 数据 16 D9 背光源负极3.32 LCD1602引脚说明第1脚:VSS为地电源;4第2脚:VDD接+5V电源;第3脚:VL为液晶显示器对比度调度端,接正电源时对比度最弱,接地时对比度最高,对比度过高会产生“鬼影”,必要时可以通过一个10K的电位器调整对比度。
第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和R/W同为低电平时可以写入指令或者显示地址,当RS低电平R/W为高电平时可以读忙信号,当RS为高电平R/W低电平时可以写入数据。
第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:D0~D7为8位双向数据线。
第15脚:背光源正极。
[2]第16脚:背光源负极。
3.33 LCD1602指令1602液晶模块内部的控制器共有11条指令,如下表所示表2液晶模块内部控制其指令RS R/D7 D6 D5 D4 D3 D2 D1 D0 序指令W 号1 0 0 0 0 0 0 0 0 0 1 清显示2 0 0 0 0 0 0 0 0 1 * 光标返回3 0 0 0 0 0 0 0 1 I/D S 置输入模式4 0 0 0 0 0 0 1 D C B 显示开/关控制5 0 0 0 0 0 1 S/C R/L * * 光标或字符移位6 0 0 0 0 1 DL N F * * 置功能7 0 0 0 1 置字符发生存贮器地址字符发生存贮器地址 8 0 0 1 只数据存贮器地址显示数据存贮器地址 9 0 1 BF 读忙标志或地址计数器地址10 1 0 写数到CGRAM或DDRAM 要写的数据内容11 1 1 从CGRAM或DDRAM读数读出的数据内容指令说明:指令1:清显示,指令码01H,光标复位到地址00H位置;指令2:光标复位,光标返回到地址00H;指令3:光标和显示位置设置I/D,光标移动方向,高电平向右移,低电平向左移,S:屏幕上所有文字是否左移或右移,高电平表示有效,低电平表示无效; 指令4: 显示开关控制。
D:控制整体的显示开与关,高电平表示开显示,低电平表示5关显示。
C:控制光标的开与关,高电平表示有光标,低电平表示无光标。
B:控制光标是否闪烁,高电平闪烁,低电平不闪烁;指令5:光标或显示移位S/C,高电平时显示移动的文字,低电平时显示移动的光标; 指令6:功能设置命令DL:高电平时为4位总线,低电平时为8位总线。
N:低电平时为单位行显示,高电平时为双行显示。
F:低电平时显示5*7的点阵字符,高电平时显示5*10的显示字符。
指令7:字符发生器RAM地址设置;指令8:DDRAM地址设置;指令9:读忙信号和光标地址。
BF:忙标志位,高电平表示忙,此时模块不能接收命令[2]或数据,如果为低电平表示不忙。
3.34 LCD1602数字代码1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,其中阿拉伯数字的代码为:代码数字00110000 000110001 100110010 200110011 300110100 400110101 500110110 600110111 700111000 800111001 93.4设计原理图根据设计要求画出原理图6图3.4设计原理图4. 分析与编程4.1系统流程图图4.1为系统总流程图。
首先系统进入初始化,系统开始运行,当检测键盘没有按下时,则返回继续检测直至有键盘按下;当扫描到键盘按下时,读取按键值,并检测是否超过10位,若没有超过则送入液晶显示;若超过10位则系统重新初始化。
4.2 LCD显示程序流程图显示程序流程图如图4.2。
流程图分析:首先对1602显示屏进行初始化,然后检查忙信号,若BF=0,则获得显示RAM的地址,写入相应的数据显示;若BF=1,则代表模块正在进行内部操作,不接受人和外部指令和数据,知道BF=0为止。
7开始开始对1602初始化系统初始化写入显示设置命令键盘扫描延时N 设置按键检查忙信号是否按下 N YBF=0? 读取按键 N Y按键是否 Y 获得显示RAM地址超过11位 N 获得延时显示写入相应数据图4.1 系统流程图数据显示完毕,Y结束4.2 LCD显示程序流程图4.3 设计程序#include<reg51.h>#include<intrins.h>#define uchar unsigned char #define uint unsigned int #define DelayNOP() {_nop_();_nop_();_nop_();_nop_();}sbit BEEP=P1^0;8sbit LCD_RS=P2^0;sbit LCD_RW=P2^1;sbit LCD_EN=P2^2;void DelayMS(uint ms);bit LCD_Busy_Check();void LCD_Set_Position(uchar Position); void Write_LCD_command(uchar cmd); void Write_LCD_data(uchar dat); //--标题字符串char code Title_Text[]={"-- phone Code --"}; //--键盘拔号与键盘符号映射表uchar codekey_Table[]={'1','2','3','4','5','6','7','8','9','*','0','#'};//--键盘拔号数字缓冲uchar Dial_Code_Str[]={" "}; //此处空格太少,会在屏幕上显示一个字符出来uchar keyNo=0xff;int tCount=0;//------------------------------------ //延时//------------------------------------ void DelayMS(uint x){uchar i;while(x--)for(i=0;i<120;i++);}//-------------------------------- //在LCD指定的行上显示字符串//--------------------------------9void Display_String(uchar *str,uchar LineNo) {uchar k;LCD_Set_Position(LineNo);for(k=0;k<16;k++)Write_LCD_data(str[k]);}//---------------------------------------------- //忙检查//--------------------------------------------- bit LCD_Busy_Check() {bit LCD_Status;LCD_RS=0;//寄存器选择LCD_RW=1;//读状态寄存器LCD_EN=1;//开始读DelayMS(1);LCD_Status=(bit)(P0&0x80) ;LCD_EN=0;return LCD_Status;}//---------------------------------------------------//写LCD命令//----------------------------------------------------void Write_LCD_Command(uchar cmd) {while((LCD_Busy_Check()&0x80)==0x80);//忙等待LCD_RS=0;//选取择命令寄存器LCD_RW=0;//写10LCD_EN=0;_nop_();_nop_();P0=cmd;DelayNOP();LCD_EN=1;DelayNOP();LCD_EN=0;}//-----------------------------------------//发送数据//----------------------------------------void Write_LCD_Data(uchar Str) {while((LCD_Busy_Check()&0x80)==0x80);//忙等待LCD_RS=1;LCD_RW=0;LCD_EN=0;P0=Str;DelayNOP();LCD_EN=1;DelayMS(1);LCD_EN=0;}//------------------------------------------------- //LCD初始化//------------------------------------------------- void Initialize_LCD(){Write_LCD_Command(0x38);11DelayMS(5);Write_LCD_Command(0x0C);//清屏DelayMS(5);Write_LCD_Command(0x06);//字符进入模式,屏幕不动,字符后移。