单片机课程设计--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显示电话拨号键盘按键的设计方案及其主要功能。
---------毕业论文(设计)题目__单片机课程设计________指导教师________ _________院系___ __________专业__ __________班级________ _________姓名______________________学号____ ___________2015年 9月 1 日至2015年 12月 7日(共12周)精品文档目录1.设计预达目标 (1)2.设计方案 (1)2.1单片机最小系统 (1)2.2输入按键系统 (2)2.3 1602LCD显示系统 (3)2.4设计原理图 (6)3. 分析与编程 (7)3.1系统流程图 (7)3.2 LCD显示程序流程图 (7)3.3 设计程序 (8)4.仿真 (15)5.在实现过程中遇到的问题及排除措施 (16)6.设计心得体会 (16)7.参考文献 (16)1602LCD显示电话拨号键盘按键摘要:介绍了基于单片机LCD1602显示屏的设计过程。
给出了其硬件原理图和系统仿真图。
关键词:单片机 1602LCD显示屏键盘系统一、设计预达目标要求以51单片机作为微控制器,通过1602LCD显示屏显示拨号键盘,键值包括数字0-9及“*”“#”等12个按键,数字显示为逐个显示方式。
二.设计方案首先构建单片机最小系统、键盘输入系统及1602LCD显示系统。
通过单片机扫描键值,将其结果输入到1602LCD显示屏上。
(一)单片机最小系统单片机最小系统主要由电源、复位、震荡电路以及扩展部分等部分组成。
1图2.1单片机最小系统(二)输入按键系统独立的键盘与单片机相连时,每个按键都需要单片机的一个I/O线,若按键较多时,占用的I/O口资源就会过多,为此就引入了矩阵键盘。
本次设计共有0~9、#、*共12个按键,因此引入3*4的矩阵键盘,共需要7个I/O口,7条线分别与单片机P3口相连。
{注:当作为输入时,上拉电阻将其电位拉高,若输入为低电平则可提供电流源;所以P0口如果作为输入时,处在高阻抗状态,只有外接一个上拉电阻才能有效。
课程设计任务书学生姓名:专业班级:电信指导教师:工作单位:武题目: 液晶屏显示仿手机键盘按键字符初始条件:(1)Proteus软件;(2)课程设计辅导书:《单片机课程设计指导》(3)先修课程:单片机原理,电子设计EDA。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1)课程设计时间:1周;(2)课程设计题目:液晶屏显示仿手机键盘按键字符;(3)本课程设计统一技术要求:按照要求题目进行逻辑分析,设计出各模块逻辑功能,编写C语言程序,上机调试、仿真,完成实物,对实验结果进行分析;(4)课程设计说明书按学校“课程设计工作规范”中的“统一书写格式”撰写,并标明参考文献至少5篇;(5)写出本次课程设计的心得体会(至少500字)。
时间安排:第19周指导教师签名:年月日系主任(或责任教师)签名:年月日目录1.课程设计原理 (1)1.1proteus软件简介 (1)1.2proteus功能特点 (1)1.3protues软件资源丰富 (2)2.课程设计要求 (2)3. 设计原理及基本元器件介绍 (3)3.1 89C51芯片 (3)3.2 1602液晶显示屏 (3)3.3矩阵键盘 (4)4.课程设计思路 (5)5.程序源代码及仿真效果 (5)5.1键盘矩阵扫描程序 (5)5.2 1602液晶显示仿手机按键字符 (7)5.3蜂鸣器及定时器设置 (7)图6(b)定时器流程图 (8)5.4功能键处理程序 (8)5.4主程序 (8)6.仿真及实物 (10)7.心得体会 (12)8.参考文献 (13)附录1:矩阵键盘扫描程序 (14)附录2:1602液晶显示放手机按键字符程序 (15)附录3:蜂鸣器及定时器程序 (16)附录4:功能键代码 (16)1.课程设计原理1.1proteus软件简介Proteus软件是英国Lab Center Electronics公司出版的EDA工具软件(该软件中国总代理为广州风标电子技术有限公司)。
液晶上显示时钟并带按键调整时和分说明:1、此程序只需将之前的时钟程序的数码管显示部分改为液晶显示2、在主函数中进行定时中断初始化、调用时分秒处理子程序、调用按键扫描子程序3、在定时中断子程序中每+1s就调用液晶显示子程序,在此处调用显示程序可以避免闪烁现象;在显示子程序中调用液晶显示初始化、写指令、写数据等子函数4、时分秒处理子程序将时分秒的十位和个位数暂存于数组中5、由于液晶的使用也需要用到独立按键的那几个IO口,所以用按键调整时间时不要用到独立按键,在矩阵键盘中,将P3.7口置0后,s9、s13、s17、s21也相当于独立按键,s9使分加1,s13使分减1,s17使时减1,s21使时加1.程序如下:#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar table1[11]={'0','1','2','3','4','5','6','7','8','9','-'}; uchar table2[8]={0,0,10,0,0,10,0,0}; //存放时、分、秒uchar table3[11]="liu jun luo";sbit dula=P2^6; //初始化时将数码管的位选和段选信号赋值为0,因为液晶sbit wela=P2^7; //和数码管都是从P0口传数据的,防止将数据传到数码管sbit en=P3^4; //使能信号控制端sbit rs=P3^5; //数据/命令选择端(H/L)sbit rw=P3^6; //读/写控制端 (H/L)//定义开发板上的按键sbit s2 = P3^0; //每按一次分加1sbit s3 = P3^1; //每按一次分减1sbit s4 = P3^2; //每按一次时加1sbit s5 = P3^3; //每按一次时减1sbit p3_7=P3^7; //让其置0时,s9、s13、s17、s21相当于独立按键uchar count; //定义无符号字符型数据“count”,用于计数20次达到20*50ms=1suint shi,fen,miao,shis,shig,fens,feng,miaos,miaog; //定义时、分、秒以及时、分、秒的十位和个位//延时子程序1用于读写操作时序图上的的短暂延时void delay1(uint z){uint x,y;for(x=z;x>0;x--)for(y=10;y>0;y--);}//延时子程序2用于控制整屏移动速度的快慢void delay2(uint z){uint x,y;for(x=z;x>0;x--)for(y=10;y>0;y--);}//写指令子程序void write_com(uchar com){P0=com; //将命令传至P0口rs=0; //写的是命令故将其置零en=0; //根据写操作时序图,传命令前en=0delay1(10); //根据写操作时序图,延时一小会en=1; //en=1时开始传输命令delay1(10); //延时一会待命令传完en=0; //命令传完再将其置0}//写数据子程序void write_date(uchar date){P0=date; //将数据传至P0口rs=1; //写的是数据故将其置1en=0; //根据写操作时序图,传数据前en=0delay1(10); //根据写操作时序图,延时一小会en=1; //en=1时开始传输数据delay1(10); //延时一会待数据传完en=0; //数据传完再将其置0}//液晶初始化子程序void init(){P0=0; //P0初始化为0dula=0; //防止将数据传到数码管wela=0;rw=0; //程序牵涉写操作没有读操作,直接置0 write_com(0x38); //设置16*2显示模式delay1(20); //传完命令适当延时一会write_com(0x0c); //设置开显示、不显示光标delay1(20) ;write_com(0x06); //当读或写一个字符后地址指针加1,且光标加1 delay1(20);write_com(0x01); //显示清屏delay1(20);}//显示子程序void display(){uchar a,b,c;init();write_com(0x80+5);//选择数据地址指针delay1(20);for(a=0;a<8;a++) //一共要显示8位,所以写八次{write_date(table1[table2[a]]); //在第一行显示时钟}write_com(0x80+0x40+3);delay1(20);for(b=0;b<11;b++)//一共要显示11位,所以写11次{write_date(table3[b]); //在第二行显示我的名字}}void process() //时、分、秒处理子程序{table2[7]=miao%10;table2[6]=miao/10;table2[4]=fen%10;table2[3]=fen/10;table2[1]=shi%10;table2[0]=shi/10;}//定时器中断函数,定时50ms,每隔1秒,miao++;void timer0() interrupt 1 using 1{count++; //每50ms,count就+1if(count==20) //当count=20时即计数到1s的时候执行if大括号内的语句{display(); //调用液晶显示子程序(在这里调用避免闪烁)count=0;miao++;if(miao==60){miao=0; //当到60秒的时候,分+1 ,同时秒从0重新开始计时fen++;if(fen==60){fen=0; //当到60分的时候,时+1 ,同时分从0重新开始计时shi++;if(shi==12){shi=0; //当到12小时的时候,时从0重新开始计 }}}}TH0 = 0x3c; //到了50ms后重新装入初值TL0 = 0xb0;}void key() //按键判断子程序{if(s2==0) //判断s2是否按下键盘{delay2(100); //延时,软件消抖if(s2==0) //确认按键按下{fen++; //分加1if(fen==60) //加到60时返回0继续加{fen=0;}}while(s2==0); // 等待按键放开. 即每按一次只加1}if(s3==0) //判断s3是否按下键盘{delay2(100); //延时,软件消抖if(s3==0) //确认按键按下{fen--; //分减1if(fen==-1) //减到0时返回60继续减{fen=60;}}while(s3==0); // 等待按键放开. 即每按一次只加1}if(s4==0) //判断s4是否按下键盘{delay2(100); //延时,软件消抖if(s4==0) //确认按键按下{shi++; //时加1if(shi==12) //加到12时返回0继续加{shi=0;}}while(s4==0); // 等待按键放开. 即每按一次只加1}if(s5==0) //判断s2是否按下键盘{delay2(100); //延时,软件消抖if(s5==0) //确认按键按下{shi--; //时减1if(shi==-1) //减到0时返回12继续减{shi=12;}}while(s5==0); // 等待按键放开. 即每按一次只加1}}//主函数void main(){p3_7=0; //将矩阵键盘的这个接口一直呈低电平后s9、s13、s17、s21相当于独立按键count=0;TMOD = 0x01; //选择T0定时器工作方式1ET0 = 1; //开中断EA = 1; //开总中断TH0 = 0x3c; //设置初值,定时50msTL0 = 0xb0;TR0 = 1; //开启计数while(1){process(); //调用时、分、秒处理子程序key(); //调用键盘扫描子程序}}。
LCD1602电话拨号按键系统实验论文一、设计目的本方案设计LCD1602显示电话拨号按键显示的实验,使用基于AT89C51单片机,在lcd1602上显示按键的数字,最多依次显示11位数据,按下数据蜂鸣器会发出声音。
二、摘要:通过lcd1602显示电话按键显示的数字,按下键盘,蜂鸣器会发出声音进行提示,本次lcd1602最多显示11位数据。
程序设计使用模块化设计关键词:单片机,键盘,蜂鸣器,lcd1602系统硬件电路设计1、单片机模块设计本次设计采用的是单片机AT89C51。
芯片共有40个引脚,引脚的排列顺序为从靠芯片的缺口,如图3.1所示。
左边那列逆时针数起,依次为1,2,3.....40,其中芯片的1脚顶上有一个凹点。
在单片机的40个引脚中,电源引脚2根,外接晶体振荡器引脚2根,控制引脚4根以及4组8位可编程I/O引脚32根。
图AT89C51管脚图AT89C51单片机共有4组8位可编程I/O口,分别为P0、P1、P2、P3口,每个口有8位,共32根。
每一根引脚都可以编程,比如用来控制电机、交通灯等,开发产品时就是利用这些可编程引脚来实现我们想要的功能。
P0口:8位双向I/O口线,名称为P0.0-P0.7;P1口:8位准双向I/O口线,名称为P1.0-P1.7;P2口:8位准双向I/O口线,名称为P2.0-P2.7;P3口:8位准双向I/O口线,名称为P3.0-P3.7。
本文单片机模块如图所示,主要是由单片机芯片与晶振和复位电路组成的。
是由单片机来控制整个系统,让我们的系统可以正常的运行。
2、显示模块LM016L液晶模块采用HD44780控制器,HD44780具有功能较强而又简单的指令集,可以实现字符移动,闪烁等功能,LM016L与单片机MCU通讯可采用4位或8位并行传输两种方式,HD44780控制器是由2个8 bit的寄存器、显示数据存储(DDRAM)、指令寄存器(IR)、RAM(DR)、地址计数器RAM(AC)、忙标志(BF)、字符发生器ROMA (CGOROM)以及字符发生器RAM(CGRAM)组成。
题目基于单片机的电话拨号系统的设计摘要随着人们生活水平的不断提高,电话在人们的日常生活中是比较常见的电子产品之一,它已进入我们的每一个家庭。
本文设计是基于单片机的电话拨号系统,硬件部分采用AT89C51单片机作为电话键盘拨号按键显示的核心部件,矩阵键盘作为输入电路模块,1602LCD作为显示电路模块。
系统可以实现所拨号码显示、退格、清屏等功能。
结果表明该设计具有电路简单、读取方便、显示直观、代码简洁、容易操作、低功耗和低成本等优点,可用于一般的生活和工作,也可通过改装,提高性能,增加功能,从而给人们的生活带来更多的方便。
关键词:单片机;键盘;1602LCDAbstractAs people living standard unceasing enhancement, the phone in People's Daily life is one of the more common electronic products, it has entered our every family. Design of this article is paper based on single chip microcomputer telephone dialing system,the hardware part adopts AT89C51single-chip microcomputer as input circuit, 1602 LCD display circuit. Can realize the dial number display backspace, screen clearing, and other functions.The results show that the design has simple circuit, convenient read, direct display, code is simple, easy to operate, low power consumption and low cost advantages, can be used for normal life and work, also can through modification, improve its performance, add features, so as to bring to people life more convenient.Keywords:microcontroller; keyboard ; 1602LCD目录摘要 (Ⅰ)Abstract (Ⅱ)1 绪论 (1)2 系统总体设计方案 (1)2.1 系统基本设计方案与论证 (2)2.1.1 控制部分的选择方案与论证 (2)2.1.2 输出显示电路模块的选择方案与论证 (2)2.1.3 键盘输入电路模块的选择方案与论证 (3)2.2 系统设计最终方案 (4)3 系统硬件设计 (5)3.1 主芯片模块 (5)3.1.1 主要特性 (6)3.1.2 管脚说明 (6)3.2 晶振和复位电路模块 (8)3.2.1 复位电路 (9)3.2.2 晶振电路 (9)3.3 显示电路模块 (9)3.3.1 1602LCD简介 (10)3.3.2 1602LCD的RAM地址映射及标准字库表 (13)3.3.3 1602LCD的一般初始化(复位)过程 (15)3.4输入电路模块 (15)3.4.1 矩阵键盘的按键识别方法 (15)3.4.2 矩阵键盘的基本结构 (16)3.5 系统硬件原理图 (17)4 系统软件设计 (19)4.1 软件设计整体思路 (19)4.2 主要功能模块设计 (21)4.2.1 键盘扫描模块设计 (21)4.2.2 LCD显示模块设计 (23)总结 (25)致谢 (28)参考文献 (29)附件1:源程序 (29)附件2:电话拨号系统电路原理图 (36)1 绪论随着社会的发展,科学的进步,人们的生活水平在逐步的提高,尤其是微电子技术的发展,犹如雨后春笋般的变化。
单片机原理及系统课程设计专业:自动控制班级:控XX姓名: XX学号: XXX指导教师: XXX评语:平时(40)修改(30)报告(30)总成绩兰州交通大学自动化与电气工程学院2012 年 7月 1日基于单片机控制的1602液晶显示1.引言单片机作为微型计算机发展的一个重要的分支,以其高可靠性、高性价比、低电压、低功耗的优势,赢得了广泛的应用。
单片机技术是一门技术性、应用性很强的学科,在目前和今后相当长的一段时间仍有着广泛的应用。
实验教学作为其极为重要的组成环节,在硬件扩展、接口应用、编程方法以及程序调试等方面,都起到重要作用。
作为学习自动控制专业的学生,单凭课堂理论课学习,不切实认真的进行实践仿真,势必出现理论与实践脱节、学习与应用脱节等局面。
1.1课程设计的思想此次《单片机原理及系统》课程设计,选择的是利用1602液晶显示,利用AT89C52芯片实现一串滚动字符显示,本次设计使用的1602液晶为5V电压驱动,带背光,可显示两行,每行16个字符,不能显示汉字,内置128个字符的ASCⅡ字符集字库,只有并行接口,无串行接口。
通过C语言编程经keil软件生成可以在proteus软件中仿真装载的.hex文件,进而通过proteus软件进行硬件电路连接以及软件的仿真,利用LM016L显示器替代1602型液晶显示器,最终得出液晶显示。
1.2课程设计的目的此次程设计是在学习必修课程《单片机原理与系统设计》之后,为加强学生对单片机系统设计和应用能力的培养而开设的综合设计训练环节。
本课程设计应结合《单片机原理与系统设计》课程的基础理论,重点强调实际应用技能训练,包括单片机系统设计的软件和硬件两部分。
其课程设计任务是使学生通过应用单片机系统设计的基本理论,基本知识与基本技能,掌握单片机应用系统各主要环节的设计、调试方法,初步掌握并具备应用单片机进行设备技术改造和产品开发的能力,培养学生的创新意识,提高学生的动手能力和分析问题、解决问题的能力。
单片机课程设计报告专业:电子信息工程姓名:娄刚学号:课题:电话模拟拨号器指导教师:摘要单片机是一门技术性、应用新很强的学科,而课程设计给了大家一个很好的实践机会。
实验“电话模拟拨号器”是以A T89C52单片机为控制核心,使用C程序设计,3*4矩阵控制,包括输入、删除、发送等功能,简单的实现了手机的拨打功能。
关键字:单片机,液晶显示屏,拨号目录目标及总体方案1使用的主要组件及特殊零件功能说明 (1)2流程图说明 (3)3电路图 (3)实验结果及讨论1程序设计 (4)2实验结果展示 (11)结论1本课程设计的特点 (11)2评估结果 (12)3改善建议既自我体会 (12)参考文献 (12)附录 (12)目标及总体方案1使用的主要组件及特殊零件功能说明单片机89C52管脚说明:VCC:供电电压。
GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
单片机课程设计--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);//字符进入模式,屏幕不动,字符后移。