LCD显示矩阵键盘输入的任意两位数

合集下载

在数码管上动态显示矩阵键盘数字

在数码管上动态显示矩阵键盘数字

/**********************************************程序功能:在数码管上动态显示矩阵键盘数字***********************************************/#include <msp430x14x.h>typedef unsigned char uchar;typedef unsigned int uint;#define LED_IN_USE 8//共阴极数码管7位段码:0--fuchar scandata[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; uchar led_Buf[LED_IN_USE]; // LED显示缓冲区,// 存放要显示数据uchar led_Ctrl;//记录显示位数的全局变量uchar key_Pressed; //按键是否被按下:1--是,0--否uchar key_val; //存放键值uchar key_Flag; //按键是否已放开:1--是,0--否//设置键盘逻辑键值与程序计算键值的映射uchar key_Map[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};uchar Dispbuf[2];/******************************************************* * 模块初始化*******************************************************/ void init_LED(void){//uchar tmpv;P5DIR = 0xff; //设置P5的IO方向为输出P3DIR |= 0x18; //设置P3.3 P3.4的IO方向为输出P3OUT &= 0xe7;//设置P3.3 P3.4为0,关闭两锁存器P5OUT = 0x00;//设置P5的输出初值led_Ctrl = 0; // led_Ctrl用于控制哪个LED可显示//for(tmpv=0;tmpv<LED_IN_USE;tmpv++)//{ // 初始化缓冲区,可放入主函数//led_Buf[tmpv] = 0;// }}void led_Display(){//P5DIR = 0xff; //设置P5的IO方向为输出//P3DIR |= 0x18; //设置P3.3 P3.4的IO方向为输出//P3OUT &= 0xe7;//设置P3.3 P3.4为0,关闭两锁存器//P5OUT = 0x00;//设置P5的输出初值P5OUT = scandata[Dispbuf[led_Ctrl]]; // 设置显示值P3OUT |= 0x10; // 打开数据锁存器P3OUT &= 0xef; // 关闭数据锁存P5OUT = ~(1 << (led_Ctrl)); // 设置哪只LED显示P3OUT |= 0x08; // 打开控制锁存P3OUT &= 0xf7; // 关闭控制锁存led_Ctrl++;if(led_Ctrl == 2) led_Ctrl = 0; // 设置下一个要显示的LED}/*******************************************函数名称:Init_Keypad功能:初始化扫描键盘的IO端口参数:无返回值:无********************************************/void Init_Keypad(void){P1DIR = 0xf0; //P1.0~P1.3设置为输入状态, P1.4~P1.7设置为输出状态P1OUT |= 0xf0; // P1.4~P1.7输出高电平key_Flag = 0;key_Pressed = 0;key_val = 0;}/********************************************** Check_Key(),检查按键,确认键值*********************************************//*******************************************函数名称:Check_Key功能:扫描键盘的IO端口,获得键值参数:无返回值:无********************************************/void Check_Key(void){uchar row ,col,tmp1,tmp2;tmp1 = 0x80;for(row = 0;row < 4;row++) //行扫描{P1OUT = 0xf0; //P1.4~P1.7输出全1P1OUT -= tmp1; //P1.4~p1.7输出四位中有一个为0tmp1 >>=1;if ((P1IN & 0x0f) < 0x0f) //是否P1IN的P1.0~P1.3中有一位为0{tmp2 = 0x01; // tmp2用于检测出那一位为0for(col = 0;col < 4;col++) // 列检测{if((P1IN & tmp2) == 0x00) // 是否是该列,等于0为是{key_val = key_Map[row * 4 + col]; // 获取键值return; // 退出循环}tmp2 <<= 1; // tmp2左移1位}}}}/*******************************************函数名称:delay功能:延时约15ms,完成消抖功能参数:无返回值:无********************************************/void delay(){uint tmp;for(tmp = 12000;tmp > 0;tmp--);}/*******************************************函数名称:Key_Event功能:检测按键,并获取键值参数:无返回值:无********************************************/void Key_Event(void){uchar tmp;P1OUT &= 0x00; // 设置P1OUT全为0,等待按键输入tmp = P1IN; // 获取p1INif ((key_Pressed == 0x00)&&((tmp & 0x0f) < 0x0f)) //如果有键按下{key_Pressed = 1; // 如果有按键按下,设置key_Pressed标识delay(); //消除抖动Check_Key(); // 调用check_Key(),获取键值}else if ((key_Pressed == 1)&&((tmp & 0x0f) == 0x0f)) //如果按键已经释放{key_Pressed = 0; // 清除key_Pressed标识key_Flag = 1; // 设置key_Flag标识}else{_NOP();}}/********************主函数********************/void main(void){WDTCTL = WDT_ADLY_1_9; // 设置内部看门狗工作在定时器模式,1.9ms中断一次IE1 |= WDTIE; // 使能看门狗中断init_LED();_EINT(); //打开全局中断Init_Keypad();while(1){Key_Event();if(key_Flag == 1){key_Flag = 0;Dispbuf[0] = key_val / 10;Dispbuf[1] = key_val % 10;}}// _BIS_SR(GIE);//_BIS_SR(LPM3_bits + GIE); //CPU进入LPM3低功耗模式,同时打开全局中断//_BIS_SR(CPUOFF+ GIE); //进入LPM0//_BIS_SR(LPM0_bits + GIE); //进入LPM0 }/*******************************************函数名称:watchdog_timer功能:看门狗中断服务函数,在这里输出数码管的段选和位选信号参数:无返回值:无********************************************/#pragma vector=WDT_VECTOR__interrupt void watchdog_timer(void){led_Display();}。

1602LCD显示电话拨号键盘按键说明文档

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液晶屏上。

基于矩阵键盘的加法器并用数码管显示

基于矩阵键盘的加法器并用数码管显示

基于矩阵键盘的加法器并用数码管显示一.任务解析用Verilog语言编写矩阵键盘驱动程序,实现“0~9,+,=”输入,数码管显示“加数”,按“+”键后再显示“被加数”,按“=”键后显示结果“和”。

二.实验方案键盘的识别有两种编程方法:方法一:module keyboard(clk,clr,keyv,C,L,k1);//输入行线[3:0]L input clk,clr; //输出扫描列线[3:0]C;input [3:0]L; //输出键值[3:0]keyv。

output[3:0]C;output k1;output [3:0]keyv;reg [1:0]scan;reg [3:0]C;reg k1;always @(posedge clk or negedge clr)begin//clk大概1000HZ if(!clr) scan=0;else beginscan=scan+2'h1;case(scan)2'H0:C=4'b1110;//列2'H1:C=4'b1101;2'H2:C=4'b1011;2'H3:C=4'b0111;endcaseendendreg [3:0]keyv;always @(negedge clk or negedge clr)begin if(!clr) begin keyv=0;k1=0;endelse begincase(L)4'HE:begin keyv={2'H0,scan};k1=1;end4'HD:begin keyv={2'H1,scan};k1=1;end4'HB:begin keyv={2'H2,scan};k1=1;end4'H7:begin keyv={2'H3,scan};k1=1;enddefault:k1=0;endcaseendendendmodule8 4 09 5 1+ 6 2= 7 3方法二:module key_recognize(clk,reset,row,col,key_value,key_flag);//50MHz clk,复位,行,列,键值input clk,reset;input [3:0]row;output [3:0]col;output [3:0]key_value;output key_flag;reg [3:0]col;reg [3:0]key_value;reg [5:0]count;//delay_20msreg [2:0]state;//状态标志reg key_flag;//按键标志位reg clk_500khz;//500KHZ时钟信号reg [3:0]col_reg;//寄存扫描列值reg [3:0]row_reg;//寄存扫描行值always @(posedge clk or negedge reset)if(!reset) begin clk_500khz<=0; count<=0; endelse beginif(count>=50) begin clk_500khz<=~clk_500khz;count<=0;end else count<=count+1;endalways @(posedge clk_500khz or negedge reset)if(!reset) begin col<=4'b0000;state<=0;endelsebegincase (state)0:begin col[3:0]<=4'b0000;key_flag<=1'b0;if(row[3:0]!=4'b1111) begin state<=1;col[3:0]<=4'b1110;end //有键按下,扫描第一行else state<=0;end1:beginif(row[3:0]!=4'b1111) begin state<=5;end//判断是否是第一行else begin state<=2;col[3:0]<=4'b1101;end//扫描第二行end2:beginif(row[3:0]!=4'b1111) begin state<=5;end//判断是否是第二行else begin state<=3;col[3:0]<=4'b1011;end//扫描第三行end3:beginif(row[3:0]!=4'b1111) begin state<=5;end//判断是否是第三一行else begin state<=4;col[3:0]<=4'b0111;end//扫描第四行end4:beginif(row[3:0]!=4'b1111) begin state<=5;end//判断是否扫描第一行else state<=0;end5:beginif(row[3:0]!=4'b1111) begincol_reg<=col;row_reg<=row;//保存扫描列、行值state<=5;key_flag<=1'b1;//有键按下endelse begin state<=0;endendendcaseendalways @(clk_500khz or col_reg or row_reg)beginif(key_flag==1'b1)begincase({col_reg,row_reg})8'b1110_1110:key_value<=0; 8'b1110_1101:key_value<=1; 8'b1110_1011:key_value<=2; 8'b1110_0111:key_value<=3; 8'b1101_1110:key_value<=4; 8'b1101_1101:key_value<=5; 8'b1101_1011:key_value<=6; 8'b1101_0111:key_value<=7; 8'b1011_1110:key_value<=8; 8'b1011_1101:key_value<=9; 8'b1011_1011:key_value<=10; 8'b1011_0111:key_value<=11; 8'b0111_1110:key_value<=12; 8'b0111_1101:key_value<=13; 8'b0111_1011:key_value<=14; 8'b0111_0111:key_value<=15;endcaseendendendmodule3 2 1 07 6 5 4= + 9 8三.重难点解析原理框图:从上图及以上两种按键识别程序可以看出,必须设置一个按键标志位以获取有效按键。

4乘4矩阵键盘输入数码管显示四位数

4乘4矩阵键盘输入数码管显示四位数

沈阳航空航天大学综合课程设计三相步进电机控制器电路的设计班级学号 23学生姓名 XXXXXXXXX 指导教师常丽东课程设计任务书一、设计说明步进电机是工业过程控制及仪表控制中的主控元件之一,作为执行元件其特点为能够快速起启停、精度高且能直接接收数字量,由于这些特点使其在定位场合得到了广泛的应用。

设计一个三相步进电机控制器,使其能够控制步进电机的工作状态,如步进电机正、反转,步进电机的工作方式等。

用键盘设定步进电机的工作频率,工作方式,并用数码管显示设定值,可以通过按键来更换显示内容。

用示波器观测三相的输出波形,并用数码管显示电路的工作状态。

二、技术指标步进电机的工作频率为:<10kHz三、设计要求1.进行方案论证,提出一个合理的设计方案并进行理论设计;2.对所设计的方案部分进行调试;3.在选择器件时,应考虑成本。

4.设计测量调试电路。

四、实验要求1.根据技术指标制定实验方案;验证所设计的电路。

2.进行实验数据处理和分析。

五、推荐参考资料1.谢自美. 电子线路设计·实验·测试. [M]武汉:华中理工大学出版社,2000年2.阎石. 数字电子技术基础. [M]北京:高等教育出版社,2006年3.童诗白、华成英.模拟电子技术基础. [M]北京:高等教育出版社,2006年4..付家才. 电子实验与实践. [M]北京:高等教育出版社,2004年5.沙占友、李学芝著.中外数字万用表电路原理与维修技术. [M]北京:人民邮电出版社,1993年六、按照要求撰写课程设计报告成绩评定表沈阳航空航天大学综合课程设计一、概述本次毕设的题目是:三相步进电机控制电路的设计。

本次毕设使用80C51单片机作为主控芯片,利用ULN2003A集成电路作为三相步进电机的驱动电路,采用单极性驱动方式,使三相步进电机能在(1)三相单三拍,(2)三相双三拍,(3)三相六拍三种工作方式下正常工作;能实现的功能有:启动/停止控制、方向控制;速度控制;用LED数码管显示工作方式。

矩阵键盘显示,六位数码管滚动显示

矩阵键盘显示,六位数码管滚动显示

南京邮电大学课程设计报告设计类别: EDA-VHDL专业名称: 通信工程班级学号: B09010504 学生姓名: 张嫣艳基本题 : 矩阵键盘按键的数码管显示综合题 : 数码管学号滚动显示同小组成员:学号:B09010502姓名:沈沁芳指导教师: 王奇、梅中辉、周晓燕、孔凡坤日期:2012年3月5日—3月30日目录一矩阵键盘按键的数码管显示1.实验目的--------------------------------------------------------------------- 3 2.实验所用仪器及元器件----------------------------------------------------3 3.实验任务要求----------------------------------------------------------------34. 设计思路-----------------------------------------------------------------------35. 模块分析-----------------------------------------------------------------------36. 逻辑仿真图及功能分析-----------------------------------------------------47. 调试过程与问题--------------------------------------------------------------88. 实验总结-----------------------------------------------------------------------89. 附录(VHDL源程序)-----------------------------------------------------8二数码管学号滚动显示1.实验目的----------------------------------------------------------------------12 2.实验所用仪器及元器件----------------------------------------------------12 3.实验任务要求----------------------------------------------------------------134. 设计思路----------------------------------------------------------------------135. 模块分析----------------------------------------------------------------------136. 逻辑仿真图及功能分析----------------------------------------------------167. 调试过程与问题-------------------------------------------------------------188. 实验总结----------------------------------------------------------------------189. 附录(VHDL源程序)----------------------------------------------------18一矩阵键盘按键的数码管显示1.实验目的(1).使学生全面了解如何应用该硬件描述语言进行高速集成电路设计;(2).通过软件设计环节与仿真环节使学生熟悉Quartus II设计与仿真环境;(3).通过对基本题、综合题的设计实践,使学生掌握硬件系统设计方法(自底向上或自顶向下),熟悉VHDL语言三种设计风格,熟悉其芯片硬件实现的过程。

单片机课程设计——利用矩阵键盘来控制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程序实例说明

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;}}} ;}。

高通平台之矩阵键盘接口问题分析总结

高通平台之矩阵键盘接口问题分析总结

矩阵键盘口使用注意事项1 问题描述客户拿到机器测试时发现按键同时按两位会出现三位数字,当快速按下1、2两个按键时,屏幕显示是1、2、3。

问题在每台机器上都存在。

2 重现条件拿到客户样机在公司进行开机测试复现,问题100%出现。

3 原理分析(1)分析过程1、矩阵键盘电路设计具体电路如下:2、目前模块专用支持矩阵键盘的脚是已经被占用或者是未连线出来,所以客户目前使用的是带有中断功能的GPIO口作为矩阵键盘的输入输出脚。

3、我们使用的代码是直接使用高通平台的矩阵键盘原生代码。

4、将示波器四个脚接在客户的KCOL0、KCOL1、KCOL2、KROW0四个脚位上,测试波形如下,从图中可以看出波形有很多细高电平(1.8V),显得非常不正常,还有电平只有半高(0.9V),并且逻辑不对。

5、而按单个按键是正常的原因一个键按下去时单个下降沿触发正常,即使后面的波形不正常也可以掩盖问题。

但当监控扫描中断时同行不同列的多个按键时就会出现异常,按两个键可能会出现异常,就如客户出现的3个数字这种情况。

6、下面是改正软件配置后的正常波形,从波形中可以看出1(KROW0)默认是高电平,其他3根线是KCOL线(3为KCOL0、1为KCOL1、4为KCOL2)默认是低电平,当按下按键7时,列KCOL先全部拉高然后进行中断扫描,KROW0默认一直为高,触发进行拉低,KROW0在KCOL0拉低时相对应触发拉低,其他KCOL拉低时KROW0没反应,表示只有按键7有效。

同理当按下按键8时,KROW0在KCOL1拉低时触发拉低,图如下:(2)分析原因1、首先说明矩阵按键原理,行row设为输入,且内部上拉,也就是默认输入高电平;列col为输出,默认输出低电平;配置行输入为下降沿中断触发;当有按键按下去时,行列有个脚接通,这时候行会被拉低进入中断;在中断处理函数中,先将所有列电平信号置高,然后再逐一拉低,读取行的电平信号是否为低(列扫描),当扫描到某列时读取的行电平为低,说明该列的按键被按下。

实验五 矩阵式键盘按键值的数码管显示

实验五 矩阵式键盘按键值的数码管显示

实验五矩阵式键盘按键值的数码管显示一实验目的将矩阵键盘的键值采用LED数码管显示出来(分别考虑用动态显示、静态显示)二实验内容与具体任务描述任务1:行列式键盘接口,扫描实现LED动态显示键盘被按下。

将图中的动态显示改成静态显示。

:修改代码及图,2任务三设计的电路图与描述P1口控制键盘,P0口控制LED显示器。

四程序清单任务1:#include<reg51.h> //包含51单片机寄存器定义的头文件sbit P14=P1^4; //将P14位定义为P1.4引脚sbit P15=P1^5; //将P15位定义为P1.5引脚sbit P16=P1^6; //将P16位定义为P1.6引脚sbit P17=P1^7; //将P17位定义为P1.7引脚unsigned char code Tab[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数字的段码0~9.unsigned char keyval; //定义变量储存按键值/**************************************************************函数功能:数码管动态扫描延时**************************************************************/ void led_delay(void){unsigned char j;for(j=0;j<200;j++);}/************************************************************** 函数功能:按键值的数码管显示子程序**************************************************************/ void display(unsigned char k){P2=0xbf; //点亮数码管DS6P0=Tab[k/10]; //显示十位led_delay(); //动态扫描延时P2=0x7f; //点亮数码管DS7P0=Tab[k_x0010_]; //显示个位led_delay(); //动态扫描延时}/************************************************************** 函数功能:软件延时子程序**************************************************************/ void delay20ms(void){unsigned char i,j;for(i=0;i<100;i++)for(j=0;j<60;j++);}/************************************************************** 函数功能:主函数**************************************************************/ void main(void){EA=1; //开总中断ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式1TH0=(65536-500)/256; //定时器T0的高8位赋初值TL0=(65536-500)%6; //定时器T0的高8位赋初值TR0=1; //启动定时器T0按键值初始化为// keyval=0x00;while(1) //无限循环{display(keyval); //调用按键值的数码管显示子程序}}/**************************************************************函数功能:定时器0的中断服务子程序,进行键盘扫描,判断键位**************************************************************/void time0_interserve(void) interrupt 1 using 1{TR0=0; //关闭定时器T0P1=0xf0; //所有行线置为低电平“0”,所有列线置为高电平“1”if((P1&0xf0)!=0xf0) //列线中有一位为低电平“0”,说明有键按下delay20ms(); //延时一段时间、软件消抖if((P1&0xf0)!=0xf0) //确实有键按下{P1=0xfe; //第一行置为低电平“0”(P1.1出低电平“0”)if(P14==0) keyval=1; //可判断是S1键被按下if(P15==0) keyval=2; //可判断是S2键被按下if(P16==0) keyval=3; //可判断是S3键被按下if(P17==0) keyval=4; //可判断是S4键被按下P1=0xfd; //第二行置为低电平“0”(P1.1出低电平“0”)if(P14==0) keyval=5; //可判断是S5键被按下if(P15==0) keyval=6; //可判断是S6键被按下if(P16==0) keyval=7; //可判断是S7键被按下if(P17==0) keyval=8; //可判断是S8键被按下P1=0xfb; //第三行置为低电平“0”(P1.2输出低电平“0”)if(P14==0) keyval=9; //可判断是S9键被按下if(P15==0) keyval=10; //可判断是S10键被按下if(P16==0) keyval=11; //可判断是S11键被按下if(P17==0) keyval=12; //可判断是S12键被按下P1=0xf7;if(P14==0) keyval=13; //可判断是S13键被按下if(P15==0) keyval=14; //可判断是S14键被按下if(P16==0) keyval=15; //可判断是S15键被按下if(P17==0) keyval=16; //可判断是S16键被按下}TR0=1; //开启定时器T0TH0=(65536-500)/256; //定时器T0的高8位赋初值TL0=(65536-500)%6; //定时器T0的高8位赋初值}任务2:#include<reg51.h> //包含51单片机寄存器定义的头文件sbit P14=P1^4; //将P14位定义为P1.4引脚sbit P15=P1^5; //将P15位定义为P1.5引脚sbit P16=P1^6; //将P16位定义为P1.6引脚sbit P17=P1^7; //将P17位定义为P1.7引脚unsigned char code Tab[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; 数字// 0~9的段码//定义变量储存按键值unsigned char keyval;/**************************************************************函数功能:数码管动态扫描延时**************************************************************//*void led_delay(void){unsigned char j;for(j=0;j<20;j++);}/**************************************************************函数功能:按键值的数码管显示子程序**************************************************************/void display(unsigned char k){DS6 点亮数码管// P2=0x3f;P0=Tab[k/10]; //显示十位//动态扫描延时//led_delay();DS7 //点亮数码管//P2=0x7f;显示个位// P3=Tab[k_x0010_];//led_delay(); //动态扫描延时}/**************************************************************函数功能:软件延时子程序**************************************************************/void delay20ms(void){unsigned char i,j;for(i=0;i<100;i++)for(j=0;j<60;j++);}/**************************************************************函数功能:主函数**************************************************************/void main(void){EA=1; //开总中断ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式1TH0=(65536-500)/256; //定时器T0的高8位赋初值TL0=(65536-500)%6; //定时器T0 的高8位赋初值TR0=1; //启动定时器T0keyval=0x00; //按键值初始化为0while(1) //无限循环{display(keyval); //调用按键值的数码管显示子程序}}/**************************************************************函数功能:定时器0的中断服务子程序,进行键盘扫描,判断键位**************************************************************/void time0_interserve(void) interrupt 1 using 1{TR0=0; //关闭定时器T0P1=0xf0; //所有行线置为低电平ぜ,所有列线置为高电平if((P1&0xf0)!=0xf0) //列线中有一位为低电平ぜ,说明有键按下delay20ms(); //延时一段时间、软件消抖if((P1&0xf0)!=0xf0) //确实有键按下{P1=0xfe; //第一行置为低电平ぜ(P1.1 出低电平ぜ)if(P14==0) keyval=1; //可判断是S1键被按下if(P15==0) keyval=2; //可判断是S2键被按下if(P16==0) keyval=3; //可判断是S3键被按下if(P17==0) keyval=4; //可判断是S4键被按下P1=0xfd; //第二行置为低电平ぜ(P1.1出低电平ぜ)if(P14==0)keyval=5; //可判断是S5键被按下if(P15==0) keyval=6; //可判断是S6键被按下if(P16==0) keyval=7; //可判断是S7键被按下if(P17==0) keyval=8; //可判断是S8键被按下P1=0xfb; //第三行置为低电平ぜ(P1.2输出低电平ぜ)if(P14==0) keyval=9; //可判断是S9键被按下if(P15==0) keyval=10; //可判断是S10键被按下if(P16==0) keyval=11; //可判断是S11键被按下if(P17==0) keyval=12; //可判断是S12键被按下P1=0xf7;键被按下S13可判断是// keyval=13; if(P14==0)if(P15==0) keyval=14; //可判断是S14键被按下if(P16==0) keyval=15; //可判断是S15键被按下if(P17==0) keyval=16; //可判断是S16键被按下}TR0=1; //开启定时器T0TH0=(65536-500)/256; //定时器T0的高8位赋初值TL0=(65536-500)%6; //定时器T0的高8位赋初值}五运行结果任务1:两个LED显示器动态显示被按下键盘号。

矩阵控制键盘操作说明

矩阵控制键盘操作说明

矩阵控制键盘操作说明键盘概述控制器是智能电视监控系统中的控制键盘,也是个监控系统中人机对话的主要设备。

可作为主控键盘,也可作为分控键盘使用。

对整个监控系统中的每个单机进行控制。

键盘功能1.中文/英文液晶屏显示2.比例操纵杆(二维、三维可选)可全方位控制云台,三维比例操纵杆可控制摄像机的变倍3.摄像机可控制光圈开光、聚集远近、变倍大小4.室外云台的防护罩可除尘和除霜5.控制矩阵的切换、序切、群组切换、菜单操作等6.控制高速球的各种功能,如预置点参数、巡视组、看守卫设置、菜单操作等7.对报警设备进行布/撤防及报警联动控制8.控制各种协议的云台、解码器、辅助开头设置、自动扫描、自动面扫及角度设定9.在菜单中设置各项功能10.键盘锁定可避免各种误操作,安全性高11.内置蜂鸣器桌面上直接听到声音,可判断操作是否有效技术参数1.控制模式主控、分控2.可接入分控数16个3.可接入报警模块数239个4.最大报警器地址1024个5.最大可控制摄像机数量1024个6.最大可控制监视器数量 64个7.最大可控制解码器数量 1024个8.电源 AC/DC9V(最低500mA的电源)9.功率 5W10.通讯协议Matri、PEL-D、PEL-P、VinPD11.通讯波特率1200 Bit/S,2400 Bit/S,4800 Bit/S ,9600Bit/S,Start bit1,Data bit8,Stop bit1键盘按键说明Focus Far 聚焦远FocusNear 聚焦近ZoomTele 变倍大Zoom Wide 变倍小DVR 设备操作DVR功能键Shift 用户登入Login退出键Exit报警记录查询List进入键盘主菜单MENU启动功能F1/ON关闭功能F2/OFF液晶显示区1.蜂鸣声提示说明2.1 “嘀”一声,表示有按键操作。

2.2 “嘀,嘀,嘀”三声,表示本次操作错误或无效。

2.3 “嘀嘀嘀…”连续发声,表示有报警发生。

lcd1602与矩阵按键实现3位数的加减乘除有清屏和清数

lcd1602与矩阵按键实现3位数的加减乘除有清屏和清数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void LCD_Clear(void)
{
LcdWriteCom(0x01);
{
sign++;
flag=asc_code[KeyValue];
LcdWriteData(asc_code[KeyValue]);
}
else if(asc_code[KeyValue]=='=')
case '+':a=a+b; break;
case '-':a=a-b;break;
case '*':a=a*b;break;
case '/':a=a/b;break;
LcdWriteData(asc_code[shi]);
LcdWriteData(asc_code[ge]);
}
void main(void)
{
unsigned char sign=0,flag,i,j;
int a,b;
LcdInit();
KeyState=0;
{
sign=0;
LcdWriteCom(0xcc);
LcdWriteData(asc_code[KeyValue]);
switch(flag)
{
void Delay10ms(void) //误差 0us
{
unsigned char a,b,c;

按键 出两位数

按键 出两位数

#include<reg52.h>#define uchar unsigned char#define uint unsigned int#define led_shift P2//数码管位选#define led_port P0//数码管段选#define on 1 //启动#define off 2 //停止#define ret 3 //复位sfr KeyPort=0x90;//#define KeyPort P1 -----行在P1口低四位sbit key=P3^7; //按键(启动、停止、复位共用)uchar key_flag=ret; //按键按下后的状态uint watch=0; //定义秒寄存器(每隔十分之一秒加一)uchar code led_tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//阴码0--9uchar code led_tab_dop[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//带小数点阴码0--9void delayms(uchar ms);//参数加1延时增加0.5MSvoid delayms(uchar ms);void led_disp(uint x);//数码管显示uchar temp;void main(){TMOD=0x01; //0000 0001 使用定时器T0的模式1(16位模式)TH0=(65536-5000)/256; //设定每次中断间隔50msTL0=(65536-5000)%256;EA=1; //打开总中断允许(IE=0x82;)ET0=1; //打开定时器T0中断允许位TR0=1; //启动定时器T0while(1){KeyPort=0x6f; //0110 1111if(KeyPort!=0x6f){delayms(10);if(KeyPort!=0x6f){switch(KeyPort){case 0x6e: //0110 1110if(temp<10)temp=temp*10+1;break;case 0x6d: //0110 1101 if(temp<10)temp=temp*10+4;break;case 0x6b: //0110 1011 if(temp<10)temp=temp*10+7;break;case 0x67: //0110 0111led_shift=0xff;break;}while(KeyPort!=0x6f);}}KeyPort=0x5f; //0101 1111if(KeyPort!=0x5f){delayms(10);if(KeyPort!=0x5f){switch(KeyPort){case 0x5e: //0101 1110 if(temp<10)temp=temp*10+2;break;case 0x5d: //0101 1101 if(temp<10)temp=temp*10+5;break;case 0x5b: //0101 1011 if(temp<10)temp=temp*10+8;break;case 0x57: //0101 0111 if(temp<10)temp=temp*10+0;break;}while(KeyPort!=0x5f);}}KeyPort=0x3f; //0011 1111if(KeyPort!=0x3f){delayms(10);if(KeyPort!=0x3f){switch(KeyPort){case 0x3e: //0011 1110if(temp<10)temp=temp*10+3;break;case 0x3d: //0011 1101if(temp<10)temp=temp*10+6;break;case 0x3b: //0011 1011if(temp<10)temp=temp*10+9;break;}while(KeyPort!=0x3f);}}led_disp(temp);}}void delayms(uchar ms){uchar i;while(ms--){for(i=0;i<250;i++);}}void led_disp(uint x){uint temp=x;led_port=led_tab[temp%10];led_shift=0xfe;delayms(1);led_shift=0xff;temp/=10;led_port=led_tab[temp%10];led_shift=0xfd;//1111 1101delayms(1);led_shift=0xff;}void timer0() interrupt 1 using 1{static uchar i=0; //i为2时十分位加一TF0=0;ET0=0; //关闭定时器T0中断允许位TR0=0; //关闭定时器T0TH0=(65536-5000)/256; //设定每次中断间隔50msTL0=(65536-5000)%256;switch(key_flag){case on: if(i<1) //注意i不能小于2{ i+=1;}else{i=0;watch+=1;}break;case off: break;case ret: i=0;watch=0;break;}TR0=1; //启动定时器T0ET0=1; //打开定时器T0中断允许位}。

键盘输入与LCD显示原理

键盘输入与LCD显示原理

接口电路:
关键: 关键:如何 判断键号? 判断键号?
矩 阵 式 按 键
P1.7 P1.6 P1.5 +5V P1.4 P1.3 P1.2 P1.1 P1.0
12 13 14 15 0 4 8 1 5 9 2 6 3 7
10 11
MCS-51
特点:按键识别应采用扫描法或线路反转法 编程较为复杂,节省口资源,8 编程较为复杂,节省口资源,8键以上使用
段选口
位选
动态显示基本原理
PB0~PB7
12 13 14 15 16 17 18 19 8 9 10 7 11 6 3 4 AD0 AD1 AD2 AD3 AD4 AD5 AD6 AD7 CE RD WR IO/M ALE TMROUT TMRIN RESET PC0 PC1 PC2 PC3 PC4 PC5 PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 PB0 PB1 PB2 PB3 PB4 PB5 PB6 PB7 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 1 2 5
com
com
例:模拟产品计数显示电路
段 显
编 程
ORG 1000H STAR:MOV TMOD,#60H ;定时器T1工作在方式2计数 MOV TH1,#00H ;T1置初值 MOV TL1,#00H MAIN:MOV P1,#0C0H ;数码管显示0 DISP:JB P3.3,DISP ;监测按键信号 ACALLDELAY ;消抖延时 JB P3.3,DISP ;确认低电平信号 DISP1:JNB P3.3,DISP1 ;监测按键信号 ACALLDELAY ;消抖延时 JNB P3.3,DISP1 ;确认高电平信号 SETB TR1 ;启动计数器 DISP2:MOV A,TL1 MOVC A,@A+DPTR ;查表获取数码管显示值 MOV P1,A ;数码管显示计数值 CJNE A,#8E,DISP2 LJMP STAR TAB:0C0H,0F9H,0A4H … … DELAY:MOV R2,#14H DELAY1:MOV R3,#0FAH DJNZ R3,$ DJNZ R2,DELAY1 RET END

键盘输入两位小数,4位八段LED显示

键盘输入两位小数,4位八段LED显示

天津工业大学理学院《EDA课程设计》报告书姓名:班级:学号:时间:成绩:分原理图文件名PCB图文件名指导教师评语关于设计方案关于原理图设计关于PCB图设计指导教师: 2012年月日同组者姓名同组者班级相关软件和程序Protel DXP 2004设计题目键盘输入2位整数2位小数4位八段LED显示设计指标运用AT89C52单片机设计电路达到预期效果设计过程1. 确定“设计方案”的过程:通过运用以AT89C52单片机为数据运算核心;外部电源电路提供电源是整个硬件系统正常工作;外部连接矩阵键盘提供数据输入和功能键;使用LED 实现输入数据和运算结果的显示。

LED显示器具有以下特点:低压微功耗;平板型结构;被动显示型;显示信息量大且易于彩色化,无电磁辐射,长寿命等。

AT89C52单片机与LED液晶显示屏显示电路是整个电路的核心他们实现系统的功能要求。

2. 上机设计原理图的过程(另页附原理图):3. 上机设计原理图的过程(另页附PCB图):参考资料1.华成英, 童诗白. 模拟电子技术基础, 高等教育出版社, P185—P205,集成电路相关内容, P259——P271.负反馈电路。

2008年2.阎石. 数字电子技术基础, 高等教育出版社, P262—P326,关于逻辑电路设计内容,2008年3.龙马工作室,Protel2004完全自学手册,人民邮电出版社,2005年学习一些关于基本原理图的制作和PCB图的设计。

收获和体会此次课程设计涉及到了很多方面的知识,在设计中,也学到了很多以前没有见到的元器件的性能参数和功能,也是对单片机的实际应用,把平时所学的知识应用于实践,理论联系实践的结合,我们对单片机知识的学习更加熟悉,并且有了更深刻的认识。

设计最大的收获就是熟悉了整个设计的流程以及系统的工作原理,以后需要多进行此类设计训练,一进一步提高自身的实践能力,那样也可以学到很多平时接触不到但又很重要的知识。

附1:原理图;附2:PCB图。

矩阵键盘按键的数码管显示矩阵键盘按键的数码管显示

矩阵键盘按键的数码管显示矩阵键盘按键的数码管显示

一、矩阵键盘按‎键的数码管‎显示1.实验目的(1)掌握VHD‎L语言的语‎法规范,掌握时序电‎路描述方法‎(2)掌握多个数‎码管动态扫‎描显示的原‎理及设计方‎法2.实验所用仪‎器及元器件‎计算机一台‎实验板一块‎电源线一根‎扁平线一根‎下载线一根‎3.实验任务要求设计出‎4*4矩阵键盘‎对某一按键‎按下就在数‎码管显示一‎个数字。

按键从左上‎角到右下角‎依次为1,2, (16)4.实验原理按键模块原‎理键盘扫描的‎实现过程如‎下:对于4×4键盘,通常连接为‎4行、4列,因此要识别‎按键,只需要知道‎是哪一行和‎哪一列即可‎,为了完成这‎一识别过程‎,我们的思想‎是,首先固定输‎出4行为高‎电平,然后输出4‎列为低电平‎,在读入输出‎的4行的值‎,通常高电平‎会被低电平‎拉低,如果读入的‎4行均为高‎电平,那么肯定没‎有按键按下‎,否则,如果读入的‎4行有一位‎为低电平,那么对应的‎该行肯定有‎一个按键按‎下,这样便可以‎获取到按键‎的行值。

同理,获取列值也‎是如此,先输出4列‎为高电平,然后在输出‎4行为低电‎平,再读入列值‎,如果其中有‎哪一位为低‎电平,那么肯定对‎应的那一列‎有按键按下‎。

键盘键值的‎获取:键盘上的每‎一个按键其‎实就是一个‎开关电路,当某键被按‎下时,该按键的接‎点会呈现0‎的状态,反之,未被按下时‎则呈现逻辑‎1的状态。

扫描信号由‎r o w进入‎键盘,变化的顺序‎依次为11‎10-1101-1011-0111-1110。

每一次扫描‎一排,依次地周而‎复始。

例如现在的‎扫描信号为‎1011,代表目前正‎在扫描9,10,11,12这一排‎的按键,如果这排当‎中没有按键‎被按下的话‎,则由col‎umn读出‎的值为11‎11;反之当9这‎个按键被按‎下的话,则由col‎u mn读出‎的值为11‎10。

根据上面所‎述原理,我们可得到‎各按键的位‎置与数码关‎系如表所示‎:1110 1110 1110 1110 1101 1101 1101 1101row1110 1101 1011 0111 1110 1101 1011 0111 colum‎n1 2 3 4 5 6 7 8键值row 1011 1011 1011 1011 0111 0111 0111 0111colum‎n1110 1101 1011 0111 1110 1101 1011 0111键值9 10 11 12 13 14 15 16动态显示原‎理为使得输入‎控制电路简‎单且易于实‎现,采用动态扫‎描的方式实‎现设计要求‎。

矩阵式键盘控制数码管显

矩阵式键盘控制数码管显
去抖动处理
为了避免按键抖动造成的误判,微 控制器会对检测到的按键状态进行 去抖动处理,确保按键状态的准确 性。
键盘编码方式
行码与列码组合
01
每个按键都有一个唯一的行码和列码组合,用于标识按键的位
置。
编码表
02
建立一个包含所有按键行码和列码组合的编码表,用于将按键
位置映射到对应的编码值。
编码输出
03
键盘扫描程序
根据矩阵式键盘的原理,编写键盘扫描程序,实 现按键的检测与识别。
数码管显示程序
根据数码管的显示原理,编写数码管显示程序, 实现数码管的显示和控制。
主程序
主程序负责调用键盘扫描程序和数码管显示程序, 实现整个系统的控制逻辑。
系统调试与测试
硬件调试
检查硬件电路连接是否正确,确保各模块工作正常。
矩阵式键盘控制数码管显示系 统
目录
CONTENTS
• 矩阵式键盘控制原理 • 数码管显示技术 • 矩阵式键盘控制数码管显示系统设计 • 系统性能优化与改进 • 应用前景与发展趋势

01 矩阵式键盘控制原理
CHAPTER
矩阵式键盘结构
4x4矩阵式键盘结构
由16个按键组成的矩阵,行线和列线 交叉连接,每个按键位于行线和列线 的交叉点上。
根据按键位置在编码表中找到对应的编码值,通过微控制器输
出相应的编码信号,控制数码管显示相应的字符或数字。
02 数码管显示技术
CHAPTER
数码管工作原理
数码管由多个LED段组成,通过控制各段的亮灭来显示数字或字符。
数码管内部有8个LED段,通过电流的通断控制每个段的亮灭,从而显示不同的数字 或字符。
数码管驱动方式
点驱动方式

液晶1602显示矩阵键盘

液晶1602显示矩阵键盘

#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit lcd_RS=P2^5;sbit lcd_RW=P2^6;sbit lcd_en=P2^7;void delay(uint z){uint i,j;for(i=0;i<200;i++)for(j=0;j<z;j++);}* 名称 : write_command(uchar com)*功能 : 1602命令函数* 输入 : 输入的命令值* 输出 : 无void write_command(uchar com) /*LCD写命令*/ {lcd_RS=0;lcd_RW=0;P0=com;delay(5);lcd_en=1;delay(5);lcd_en=0;}void lcd_init() /*LCD初始化*/{write_command(0X38);write_command(0X0e);write_command(0X06);write_command(0X01);}* 名称 : write_data(number)* 功能 : 1602写数据函数* 输入 : 需要写入1602的数据* 输出 : 无void write_data(number) /*LCD写数据操作*/ {lcd_RS=1;lcd_RW=0;P0=number;delay(5);lcd_en=1;delay(5);lcd_en=0;}uchar Keyscan() /*扫描子程序*/{uchar i,j,temp,buffer[4]={0xfe,0xfd,0xfb,0xf7};for(j=0;j<4;j++){P1=buffer[j];/*以下三个_nop_();作用为让P1 口的状态稳定*/_nop_();_nop_();_nop_();temp=0x10;for(i=0;i<4;i++){if(!(P1&temp)){return (i+j*4);}temp<<=1;}}}* 名称: L1602_char(uchar hang,uchar lie,char sign)* 功能: 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下L1602_char(1,5,'b')* 输入: 行,列,需要输入1602的数据* 输出: 无void L1602_char(uchar hang,uchar lie,uchar sign){uchar a;if(hang == 1) a = 0x80;if(hang == 2) a = 0xc0;a = a + lie - 1;write_command(a);write_data(sign);}void L1602_string(uchar hang,uchar lie,uchar *p) {uchar a;if(hang == 1) a = 0x80;if(hang == 2) a = 0xc0;a = a + lie - 1;write_command(a);while(1){if(*p == '\0') break;write_data(*p);p++;}}void main(){uchar key_data;lcd_init();L1602_string(1,1," 4*4 KeyBoard ");L1602_string(2,1,"You Press The ");while(1){ P1 = 0xf0;if(P1 != 0xf0){delay(5);if(P1 != 0xf0){key_data = Keyscan();}}L1602_char(2,15,key_data /10+48);L1602_char(2,16,key_data %10+48);}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include<reg52.h>
#include<intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
#defineNOP_nop_();
sbitLCD_CS=P1^0;//片选,高电平有效(RS)
sbitLCD_SID=P1^1;//串行数据输入端(R/W)
for(i=0;i<8;i++)
{
LCD_SID=(bit)(i_dat&0x80);
LCD_SCLK=0;
LCD_SCLK=1;
i_dat=i_dat<<1;
}
i_dat=cmd_dat;
i_dat<<=4;
for(i=0;i<8;i++)
{
LCD_SID=(bit)(i_dat&0x80);
LCD_SCLK=0;
while(1)
{
key_dispos();
}
}
voiddisplay()
{
uinti;
send_cmd(0x80);//第一行显示
i=0;
while(dis1[i]!='\0')
{
send_dat(dis1[i]);
i++;
}
send_cmd(0x90);//第二行显示数据
send_dat(dis2[dis_buf[1]]);
{
if(!(P2&k))//如果有键按下
return(row*4+col);//返回按键位置
k<<=1;
}
}
return99;//无键按下返回99
}
voidkey_dispos()//按键处理并显示程序
{
display();//显示第一行和初始键值
keynum=getkey();//获取键值
if(keynum<10)//
{
uchari;
uchari_dat;
i_dat=0xf8;
LCD_CS=1;
LCD_SCLK=0;
for(i=0;i<8;i++)
{
LCD_SID=(bit)(i_dat&0x80);
LCD_SCLK=0;
LCD_SCLK=1;
i_dat=i_dat<<1;
}
i_dat=cmd_dat;
i_dat&=0xf0;
LCD_CS=1;
for(i=0;i<8;i++)
{
LCD_SID=(bit)(i_dat&0x80);
LCD_SCLK=0;
LCD_SCLK=1;
i_dat=i_dat<<1;
}
i_dat=cmd_dat;
i_dat&=0xf0;
for(i=0;i<8;i++)
{
LCD_SID=(bit)(i_dat&0x80);
send_dat(dis2[dis_buf[0]]);
}
LCD_SCLK=1;
i_dat=i_dat<<1;
}
LCD_CS=0;
delay(10);
}
/*写数据程序,指令由3个字节组成,第一个为写数据*/
/*第二个为数据高4位,第三个为数据低4位*/
voidsend_dat(ucharcmd_dat)
{
uchari;
uchari_dat;
i_dat=0xfa;
LCD_SCLK=0;
LCD_SCLK=1;
i_dat=i_dat<<1;
}
i_dat=cmd_dat;
i_dat<<=4;
for(i=0;i<8;i++)
{
LCD_SID=(bit)(i_dat&0x80);
LCD_SCLK=0;
LCD_SCLK=1;
i_dat=i_dat<<1;
}
LCD_CS=0;
delay(10);
}
voidLCD_INIT()
{
LCD_PSB=0;//串行方式操作
send_cmd(0x30);//基本指令操作
delay(5);
send_cmd(0x0c);//显示开,关游标,游标位置反白禁止
delay(5);
send_cmd(0x06);//光标右移,整体显示不移动
delay(5);
{
dis_buf[1]=dis_buf[0];//第一个键值移位显示
dis_buf[0]=keynum;//获得第二个键值
display();//显示改变后的键值
while(keynum<10)//松手检测
{
keynum=getkey{
P1=0xff;
LCD_INIT();
sbitLCD_SCLK=P1^2;//串行同步时钟,上升沿读取SID数据(E)
sbitLCD_PSB=P1^3;//并/串选择H并行L串行
sbitLCD_RST=P1^4;//复位,低电平有效
ucharkeynum;
ucharcodedis1[]={"请输入任意两位数"};
ucharcode
uchardis_buf[]={0,0};
send_cmd(0x01);//清除LCD显示内容
delay(5);
}
uchargetkey()
{
unsignedcharrow,col,k;
for(row=0;row<4;row++)//行值依次为0xfe,0xfd,0xfb,0xf7
{
P2=~(1<<row);
k=0x10;
for(col=0;col<4;col++)//列值扫描
/**********************************************************
用矩阵按键输入任意两位数并显示在12684上。如先输入2,再输入5
液晶上显示25。用矩阵按键0-9共10个按键。LCD12864用串行方式操作,
如果用并行,请自行修改。
***********************************************************/
uchargetkey();
voiddisplay();
voiddelay(uintx)
{
uchari;
while(x--)
{
for(i=0;i<110;i++);
}
}
/*写指令程序,指令由3个字节组成,第一个为写指令*/
/*第二个为指令高4位,第三个为指令低4位*/
voidsend_cmd(ucharcmd_dat)
相关文档
最新文档