矩阵键盘1602液晶显示键值
矩阵键盘1602液晶显示键值 代码

sbit BEEP = P1^5; //蜂鸣器驱动线
uchar IRCOM[7];
uchar cdis1[] = {" REMOTE CONTROL "};
uchar cdis2[] = {" IR-CODE: ----H"};
//LCD IO
sbit LCD_RW = P2^5;
{;}
}
}
void keyscan(void)
{temp = 0;
P1=0xF0; //高四位输入行为高电平列为低电平
delay(1);
temp=P1; //读P1口
temp=temp&0xF0;//屏蔽低四位
temp=~((temp>>4)|0xF0);
if(temp==1)// p1.4被拉低
key=0;
delay1(5);
lcd_wcmd(0x38);
delay1(5);
lcd_wcmd(0x38);
delay1(5);
lcd_wcmd(0x0c); //显示开,关光标
delay1(5);
lcd_wcmd(0x06); //移动光标
delay1(5);
****/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
/*写指令数据到LCD*/
//RS=L,RW=L,E=高脉冲,D0-D7=指令码。
简易计算器(1602加矩阵键盘)

一、原理图:二、程序#include<reg51.h> //包含单片机寄存器的头文件#include<intrins.h> //包含_nop_()函数定义的头文件#include<math.h>sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚sbit BF=P1^7; //忙碌标志位,#define NO_KEY_PRESS 0xff/********************************************************************************************************/unsigned char code tab[]={0xb7,0xee,0xde,0xbe,0xed,0xdd,0xbd,0xeb,0xdb,0xbb};unsigned long num1,num2,alg;unsigned char flag;void delay1ms(){unsigned char i,j;for(i=0;i<10;i++)for(j=0;j<15;j++);}/********************************************************************************************************/void delay(unsigned char n){unsigned char i;for(i=0;i<n;i++)delay1ms();}/*****************************************************函数功能:判断液晶模块的忙碌状态返回值:result。
1602LCD显示电话拨号键盘按键.dwg

---------毕业论文(设计)题目__单片机课程设计________指导教师________ _________院系___ __________专业__ __________班级________ _________姓名______________________学号____ ___________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.在实现过程中遇到的问题及排除措施 (15)6.设计心得体会 (16)7.参考文献 (16)1602LCD显示电话拨号键盘按键摘要:介绍了基于单片机LCD1602显示屏的设计过程。
给出了其硬件原理图和系统仿真图。
关键词:单片机 1602LCD显示屏键盘系统一、设计预达目标要求以51单片机作为微控制器,通过1602LCD显示屏显示拨号键盘,键值包括数字0-9及“*”“#”等12个按键,数字显示为逐个显示方式。
二.设计方案首先构建单片机最小系统、键盘输入系统及1602LCD显示系统。
通过单片机扫描键值,将其结果输入到1602LCD显示屏上。
(一)单片机最小系统单片机最小系统主要由电源、复位、震荡电路以及扩展部分等部分组成。
图2.1单片机最小系统(二)输入按键系统独立的键盘与单片机相连时,每个按键都需要单片机的一个I/O线,若按键较多时,占用的I/O口资源就会过多,为此就引入了矩阵键盘。
本次设计共有0~9、#、*共12个按键,因此引入3*4的矩阵键盘,共需要7个I/O口,7条线分别与单片机P3口相连。
{注:当作为输入时,上拉电阻将其电位拉高,若输入为低电平则可提供电流源;所以P0口如果作为输入时,处在高阻抗状态,只有外接一个上拉电阻才能有效。
1602LCD显示电话拨号键盘按键说明文档

项目: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液晶屏上。
LCD1602液晶显示与4×4矩阵键盘

一、要求:液晶显示器第一行显示“Hello World!”;第二行显示键盘的键值。
二、程序代码:#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intunsigned char code dis1[]={"Hello World!"};uchar key_val[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G'};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<125;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);}//初始化LCD子程序void init(){wcmd(0x38);//设置8位总线双行显示,5*7点阵delay(20);wcmd(0x0C);//开显示,开光标,不闪烁delay(20);wcmd(0x06);//读写字符时地址加1delay(20);wcmd(0x01);//清屏delay(20);}//键盘扫描子程序void keyscan(void){unsigned char n;//扫描第一行P0=0xEF;n=P0;n&=0x0F;if(n!=0x0F){delay(1);//去抖动P0=0xEF;n=P0;n&=0x0F;if(n!=0x0F){switch(n){case (0x0E):wdat(key_val[0x01]);break;case (0x0D):wdat(key_val[0x02]);break;case (0x0B): wdat(key_val[0x03]);break;case (0x07):wdat(key_val[0x04]);break;}}}P0=0xDF;//扫描第二行n=P0;n&=0x0F;if(n!=0x0F){delay(1);P0=0xDF;n=P0;n&=0x0F;if(n!=0x0F){switch(n){case(0x0E):wdat(key_val[0x05]);break;case(0x0D):wdat(key_val[0x06]);break;case(0x0B):wdat(key_val[0x07]);break;case(0x07):wdat(key_val[0x08]);break;}}}P0=0xBF;//扫描第三行n=P0;n&=0x0F;if(n!=0x0F){delay(1);P0=0xBF;n=P0;n&=0x0F;if(n!=0x0F){switch(n){case(0x0E):wdat(key_val[0x09]);break;case(0x0D):wdat(key_val[0x0A]);break;case(0x0B):wdat(key_val[0x0B]);break;case(0x07):wdat(key_val[0x0C]);break;}}}P0=0x7F;//扫描第四行n=P0;n&=0x0F;if(n!=0x0F){delay(1);P0=0x7F;n=P0;n&=0x0F;if(n!=0x0F){switch(n){case(0x0E):wdat(key_val[0x0D]);break;case(0x0D):wdat(key_val[0x0E]);break;case(0x0B):wdat(key_val[0x0F]);break;case(0x07):wdat(key_val[0x10]);break;}}}}void main(void){unsigned char i;init();wcmd(0x82);for (i=0;i<12;i++){wdat(dis1[i]);}while(1){delay(15);wcmd(0x38);//设置8位总线双行显示,5*7点阵delay(20);wcmd(0x0C);//开显示,开光标,不闪烁delay(20);wcmd(0x06);//读写字符时地址加1delay(20);wcmd(0xC2);keyscan();}}/*--------------------------------------------------------------/xtigmh--------------------------------------------------------------*/。
1602键盘显示

摘要在日常生活中,我们经常要通过按键来实现对电子装置的控制,小到手表手机,中到电视电脑,大到各种复杂仪器,都需要通过按键来实现各种操作。
本次课程设计作为实践教学的一个重要环节,将以按键控制显示为主题,以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单片机的接口上,需要加一个三极管来进行驱动。
最新按键复用(1602 液晶显示)
按键复用(1602液晶显示)按键复用(1602 液晶显示)AVR单片机单按键复用之程序AVR单片机中断法的按钮前一段就可以了,查询的居然卡住了。
先写一个51C的,在此基础上写了AVR GCC的,一直到今天才完成。
感觉二者还是有点区别的。
//查询法按键程序,单键复用。
P1.O接一按键,P1.1接一LED。
//11 05 13 E:\DPJ_C\OTHER\ONEKEY\ONEKEY.C#include <reg51.h>#define uchar unsigned charsbit LED1= P1^1;sbit LED2= P1^2;sbit KEY = P1^0;void delay(unsigned int ms ) {unsigned char i;while(ms--)for(i=0;i<123;i++);}void disp1(){LED1=1;}void disp2(){LED1=0;}void main(){uchar temp;while(1){while(!KEY){delay(10);if(KEY)temp=~temp;if(~temp)disp1();elsedisp2();}}}//查询法按键程序,单键复用。
PCO接一按键,PD0接一LED。
//11 05 13 E:\AVR\ONEKEY\onekey.c#include<avr/io.h>#include<util/delay.h>#define KEY PD0#define uchar unsigned charuchar temp,i;void disp1(){DDRC&=~_BV(PC0);//PB0端口低电平PORTC&=~_BV(PC0);//PB0高阻状态,LED无电流通过}void disp2(){DDRC|=_BV(PC0);//PC0端口高电平,输出PORTC&=~_BV(PC0);//PC0低电平输出,LED点亮}int main(){DDRD|=_BV(KEY); //PD0高电平,输出PORTD|=_BV(KEY);DDRD&=~_BV(KEY);while(1){while(!(PIND&_BV(KEY))){for(i=0;i<5;i++)_delay_ms(10);if((PIND&_BV(KEY)))//等待按键释放temp =~temp;if(temp==0xff)disp2();elsedisp1();}}}1602字符液晶详细资料和实例时间:2010-10-11 来源: 作者: 点击:816 字体大小:【大中小】1602字符液晶在实际的产品中运用的也比较多了,前几天留意了一下,发现宿舍门前的自动售水机就是采用的1602液晶进行显示的。
单片机课程设计——利用矩阵键盘来控制1602液晶显示器的显示设计
《单片机原理及应用课程设计》报告——利用矩阵键盘来控制1602液晶显示器的显示设计2011年12 月7 日目录1.课程设计的目的12.课程设计的要求3.硬件设计3.1设计思想3.2主要元器件介绍3.3.功能电路介绍3.31 1602液晶显示器3.32 3*4矩阵键盘(1)矩阵式键盘的结构与工作原理(2)矩阵式键盘的按键识别方法4.软件设计4.1设计思想4.2软件流程图4.3源程序:5.调试运行6.设计心得体会:1.课程设计目的1.1巩固和加深对单片机原理和接口技术知识的理解;1.2培养根据课题需要选学参考书籍、查阅手册和文献资料的能力;1.3学会方案论证的比较方法,拓宽知识,初步掌握工程设计的基本方法;1.4掌握常用仪器、仪表的正确使用方法,学会软、硬件的设计和调试方法;1.5能按课程设计的要求编写课程设计报告,能正确反映设计和实验成果,能用计算机绘制电路图和流程图。
2.课程设计要求2.1在3*4矩阵键盘上输入信息2.2在1602芯片上显示时间信息。
2.3显示数据的设计与变换3.硬件设计3.1设计思想在3*4矩阵键盘上输入信息,通过中央处理器处理信息,再通过1602液晶显示器显示信息。
3.2主要元器件介绍(1)电源电路(2)STC89C82RC单片机一块。
(3)1602液晶显示器一块(4)杜邦线若干。
(5)3*4矩阵键盘3.3.功能电路介绍3.31 1602液晶显示器液晶显示模块具有体积小、功耗低、显示内容丰富等特点,现在字符型液晶显示模块已经是单片机应用设计中最常用的信息显示器件了。
1602可以显示2行16个字符,有8位数据总线D0-D7,和RS、R/W、EN三个控制端口,工作电压为5V,并且带有字符对比度调节和背光。
1602外观如下图所示1602引脚说明注意事项:从该模块的正面看,引脚排列从右向左为:15脚、16脚,然后才是1-14脚(线路板上已经标明)。
VDD:电源正极,4.5-5.5V,通常使用5V电压;VL:LCD对比度调节端,电压调节范围为0-5V。
2.超详细矩阵键盘控制1602程序实例说明
2、超详细矩阵键盘控制1602程序实例说明(带电路图)By 即墨天2 一、电路图/*----------------------------------------------//程序功能:通过矩阵键盘在LCD1602任意位置输入0~9,且可通过光标二次修改;------------ 能退格,能清除显示,还能自己任意定义16个按键的意义.//调试状态:仿真实现//时间:2014-7-25-----------------------------------------------*/#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit Lcd_RS = P2^0;sbit Lcd_RW = P2^1;sbit Lcd_EN = P2^2;uchar code table[] = "51201314" ;uchar code table1[] = "20140815" ;uchar code key16[]={0xee,0xed,0xeb,0xe7,0xde,0xdd,0xdb,0xd7,0xbe,0xbd,0xbb,0xb7,0x7e,0x7d,0x7b,0x77} ; //该键盘特征码是在特定的接线下有效,请参见电路原理图uchar key_number;void delayMS(uint x){uchar i;while(x--) for(i = 0; i < 120; i++);}//----------------------------------------------//忙检查//-----------------------------------------------bit Busy_Check(){bit state;Lcd_RS = 0;Lcd_RW = 1;Lcd_EN = 1;delayMS(1);state=(bit)(P0&0x80); //屏蔽底7位,state的值仅有高位决定Lcd_EN = 0;delayMS(1);return state;}//---------------------------------------------//向LCD写数据//----------------------------------------------void LCD_Wdata(uchar dat){while(Busy_Check()); //忙等待Lcd_RS = 1;Lcd_RW = 0;Lcd_EN = 0;P0 = dat;Lcd_EN = 1; //高脉冲delayMS(1);Lcd_EN = 0;}//---------------------------------------------//向LCD写指令//----------------------------------------------void LCD_Wcmd(uchar cmd){while(Busy_Check()); //忙等待Lcd_RS = 0;Lcd_RW = 0;P0 = cmd;delayMS(1);Lcd_EN = 0;Lcd_EN = 1; //高脉冲delayMS(1);Lcd_EN = 0;}//---------------------------------------------------------//LCD初始化//---------------------------------------------------------void Init_Lcd(){LCD_Wcmd(0x38);//显示模式设置delayMS(1);LCD_Wcmd(0x0f);//开显示,显示光标,光标闪烁delayMS(1);LCD_Wcmd(0x06);//当读写一个字符后地址指针加一,且光标加一delayMS(1);LCD_Wcmd(0x01);//清屏delayMS(1);}//---------------------------------------------------------//键盘模块//---------------------------------------------------------bit pushkey() //判断是否有键按下{P1=0xf0;if(P1!=0xf0)return (1);elsereturn (0);}void key_scan()//矩阵扫描{ uchar keycode,p;delayMS(15); // 延时消抖if(P1!=0xf0){P1 = 0xf7; //键盘扫描码初值,逐行扫描,P1.3=0,扫描第4列while(1){keycode = P1; //读出数据,看是否在此行上的某列按键被按下if((keycode&0xf0)!=0xf0) break;// 如果扫描到按下的键,则退出P1=_cror_(P1,1); //否则,左移,扫描下一列}while((pushkey())); //等待按键释放for(p = 0 ; p<16 ;p++){if ( keycode== key16[p])key_number=p; //与特征值对比得与哪个键按下}}}void LCD_address(uchar hang,uchar lie )//显示字符先输入显示的位置{if (hang%2==1) LCD_Wcmd(0x80+(lie%16)-1);else LCD_Wcmd(0x80+0x40+(lie%16)-1);}void LCD_display(){ uchar j;LCD_address(1,1);while(table1[j]!='\0'){LCD_Wdata(table[j]);j++;}}void main(){ uchar n=0;Init_Lcd(); //初始化LCDLCD_display();while(1){if(pushkey())//判断是否有键按下{key_scan();switch(key_number){case 10: LCD_Wcmd(0x10);break; //光标左移(相当于A 被按下)case 11: LCD_Wcmd(0x14);break; //光标右移(相当于B被按下)case 12: n++; //光标下移(相当于C被按下)if((n%2)==1) //第二次被按下的时候,光标回到第一行{LCD_Wcmd(0x80+0x40);break;}else LCD_Wcmd(0x80);break;case 13: LCD_Wcmd(0x10);LCD_Wdata(0x00);LCD_Wcmd(0x10);break; //产生退格功能,按下一次后清除前一次的显示case 15: LCD_Wcmd(0x01);break;//清屏default: LCD_Wdata(key_number+0x30);break;}}} ;}。
(实验四)单片机矩阵键盘检测和液晶仿真实验
实验四单片机矩阵键盘检测和液晶仿真实验(4学时)一、实验任务利用51单片机实现4X4矩阵键盘和LCD1602液晶显示人机交互系统,编程实现:(1)按键扫描(1、2、……9、A、B、C、D、E、F)和LCD1602显示按键的键号,格式为:KEYNUM+按键号;(2)LCD1602的第一行显示加1功能,初始数字为980,显示位置自己确定,每次按下某一个按键,数字加1,范围为15---20;二、实验目的1、掌握仿真软件Proteus和单片机联调的方法;2、掌握矩阵键盘扫描检测的原理,并且编程实现键盘按键的检测;3、掌握LCD1602液晶显示的原理,并且编程实现LCD1602的显示功能;4、掌握利用单片机实现键盘检测和液晶显示的功能组合,并掌握独立编程控制的能力。
三、实验设备电脑、Proteus软件、Keil软件四、实验原理(一)矩阵键盘扫描检测原理按照按键结构原理可分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关等;另一类是无触点开关按键,如电气式按键、磁感应按键等。
在单片机应用系统中,通过按键实现控制功能和数据输入是非常普遍的。
在所需按键数量不多时,系统常采用独立式按键。
独立式按键是指每个按键单独占有一根I/O口线,且其工作状态不会影响其他I/O口线的工作状态。
这种按键的电路配置灵活,软件结构简单。
不过在实际应用中,由于不同的系统对按键的要求不同,因此,对按键程序的设计要考虑全面,以便更好地完成按键所设定的功能。
在按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,如图4.1所示。
在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。
这样一个端口(如P1口)就可以构成4×4=16个按键,比直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出1键(共9键)。
由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/* */
/*************************************************************/
void lcd_init()
{
delay(15);
lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据
delay(5);
/**/
/*************************************************************/
void keyscan(void)
{temp = 0;
P1=0xF0; //高四位输入行为高电平列为低电平
delay(1);
temp=P1; //读P1口
temp=temp&0xF0;//屏蔽低四位
/* */
/*写指令数据到LCD */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。*/
/* */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/*******************************************************************/
temp=~((temp>>4)|0xF0);
if(temp==1)// p1.4被拉低
key=0;
else if(temp==2) // p1.5被拉低
key=1;
else if(temp==4) // p1.6被拉低
key=2;
else if(temp==8) // p1.7被拉低
key=3;
else
/* */
/*写显示数据到LCD */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。*/
/**/
/*******************************************************************/
void lcd_wdat(uchar dat)
{
while(lcd_busy());
}
/*************************************************************/
/* */
/*设定显示位置*/
/* */
/*************************************************************/
void lcd_pos(uchar pos)
{
lcd_wcmd(pos | 0x80); //数据指针=80+地址变量
}
/*************************************************************/
/**/
/*键扫描子程序(4*3的矩阵) P1.4 P1.5 P1.6 P1.7为行*/
/*P1.1 P1.2 P1.3为列*/
{
P1=0xF0;
if(P1!=0xF0) //判断按键是否按下如果按钮按下会拉低P1其中的一个端口
{
keyscan();
}
}
/*************************************************************/
/* */
/*主程序*/
/**/
/*************************************************************/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
/*******************************************************************/
#define uint unsigned int
uchar dis_buf; //显示缓存
uchar temp;
uchar key; //键顺序吗
void delay0(uchar x); //x*0.14MS
sbit LCD_RW = P2^5;
sbit LCD_RS = P2^6;
sbit LCD_EN = P2^7;
m++;
}
lcd_pos(0x40); //设置显示位置为第二行第1个字符
m = 0;
while(cdis2[m] != '\0')
{
lcd_wdat(cdis2[m]); //显示字符
m++;
}
dis_buf = 0x2d; //显示字符"-"
while(1)
{
keydown();
lcd_pos(0x4c);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x0c); //显示开,关光标
delay(5);
lcd_wcmd(0x06); //移动光标
delay(5);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(5);
uchar cdis1[16] = {" KEY NUMBER "};
uchar cdis2[16] = {" KEY-CODE: H "};
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
/*************************************************************/
LCD_RS = 1;
LCD_RW = 0;
LCD_EN= 0;
P0 = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/*************************************************************/
/* */
lcd_wdat(dis_buf); //第一位数显示
}
}
/************************************************************/
key=16;
P1=0x0F; //低四位输入列为高电平行为低电平
delay(1);
temp=P1; //读P1口
temp=temp&0x0F;
temp=~(temp|0xF0);
if(temp==2)// p1.1被拉低
key=key+0;
else if(temp==4) // p1.2被拉低
key=key+4;
}
/*************************************************************/
/**/
/*判断键是否按下*/
/* */
/*************************************************************/
void keydown(void)
/**/
/*延时子程序*/
/* */
/*************************************************************/
void delay(uchar x)
{ uchar j;
while((x--)!=0)
{ for(j=0;j<125;j++)
{;}
}
}
else if(temp==8)// p1.3被拉低
key=key+8;
else
key=16;
dis_buf = key;//键值入显示缓存
dis_buf = dis_buf & 0x0f;
if(dis_buf>9) //转换为ASCII码
dis_buf = dis_buf+0x37;
else
dis_buf = dis_buf+0x30;
/********************************************************************************
*描述: *
*矩阵键盘1602液晶显示键值*
#include <reg51.h>
#includesigned char
main()
{
uchar m;
P0=0xFF; //置P0口
P1=0xFF; //置P1口
delay(10); //延时
lcd_init(); //初始化LCD
lcd_pos(0); //设置显示位置为第一行的第1个字符