1.51单片机键盘接口电路的计算器的实现的毕业设计及开题报告
51单片机计算器的设计(开题报告实物论文)
目 录
1.课程设计的目的………………………………………………3
2.课程设计题目描述和要求……………………………………3
3.单片机发展简史………………………………………………4
4.MCS-51单片机系统简介………………………………………6
5.MCS-51单片机内部定时器/计数器简介……………………7
6.理论设计………………………………………………………8
7.主要电路分析…………………………………………………8
8.硬件设计………………………………………………………10
9.软件设计………………………………………………………11
10.程序代码……………………………………………………12
11.设计总结……………………………………………………18
12.参考文献……………………………………………………20
随着社会的发展,科学的进步,人们的生活水平在逐步的提高,尤其是微电子技术的发展,犹如雨后春笋般的变化。电子产品的更新速度快就不足惊奇了。
计算器在人们的日常中是比较的常见的电子产品之一。可是它还在发展之中,以后必将出现功能更加强大的计算器,基于这样的理念,本次设计是用单片机来设计的四位数计算器。该设计系统是以AT89S51为单片机, P3口作为输入端,外接4X4的键盘,通过键盘扫描来对输入数的控制,在P1口,P2口接了驱动电路。用来保证LED的工作正常。计算器将完成的功能有加,减,乘,除等功能。
功能:
完成0~9999整数的一次加/减/乘/除运算,
减法运算结果可以实现计算结果的负数显示,
除法运算结果为0~999并保留两位小数,
按键音,
设有清零键,
首位零不显示,
其它的显示"E"
按键排布为:
清零/确认/除/乘
减/加/9/8
7/6/5/4
3/2/1/0
2.求基于AT89C51单片机的简易计算器设计
单片机计算器基本功能介绍:简单的加减乘除的运算。
时间显示功能,而且能实现计算器模块和时间模块之间的任意切换。按键音却换功能。
原理;多功能单片机计算器是一个实现加减乘除的和时间功能的计算器,主要的硬件组成由,一个AT89s52单片机芯片,一个LED液晶(1602液晶),一个4*4键盘,和4个特殊功能按键。一个时钟芯片(DS1302),一个蜂鸣器。
单个硬件模块个的介绍AT89S52:主要控制芯片,它是由8kflash,256BRAM,6个中断源,详情参考AT89S52的技术文档.1602液晶1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”,而且可以实现一些复杂的字符操作:1:清显示,光标复位到地址00H位置,2:光标和显示模式设置 光标移动方向,高电平右移,低电平左移,屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效 3:显示开关控制,控制整体显示的开与关,高电平表示开显示,低电平表示关显示,控制光标的开与关,高电平表示有光标,低电平表示无光标,控制光标是否闪烁,高电平闪烁,低电平不闪烁4:光标或显示移位,高电平时移动显示的文字,低电平时移动光标5:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符(高低电平在相应的指令上实现),详情可参考1602的技术文档。
1602采用标准的16脚接口: 第1脚:VSS为地电源第2脚:VDD接5V正电源第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:D0~D7为8位双向数据线。 第15~16脚:空脚。
1602液晶和单片机的接法4*4键盘,和4个特殊功能按键K(切换键) No(复位键)(时间设置键) C(清除键) +1 2 3 —4 5 6 *7 8 9 %(除)—/+ 0 。 =前4个为特殊功能键,后十六个采用键盘扫描接法,扫描原理:首先给p3口赋11111110(0xfe),然后再读取p3口的值,如果为11101110(0xee)说明是第一排第一个被按下,如果是11011110(0xde)说明是第一排第二个被按下,如果是10111110(0xbe)说明是第一排第三个被按下,如果是0111110(0x7e)说明是第一排第四个被按下,判断二三四排的按键,都采用同样的方法,只要分别给P3口赋不同的值即可,在读取p3口的值,在判断。
用这样的方法即可实现4*4键盘的扫描,只要有键按下,就可以知道是那个键按下,通过这种方法可大大节省单片机的io口的资源。详情可参考网上的键盘扫描原理时钟芯片(DS1302)DS1302 是DALLAS 公司推出的涓流充电时钟芯片内含有一个实时时钟/日历和31 字节静态RAM ,通过简单的串行接口与单片机进行通信实时时钟/日历电路提供秒分时日日期月年的信息每月的天数和闰年的天数可自动调整时钟操作可通过AM/PM 指示决定采用24 或12 小时格式DS1302 与单片机之间能简单地采用同步串行的方式进行通信仅需用到三个口线1 RES 复位2 I/O 数据线3 SCLK串行时钟时钟/RAM 的读/写数据以一个字节或多达31 个字节的字符组方式实时时钟具有能计算2100 年之前的秒分时日日期星期月年的能力还有闰年调整的能力(详情可参考DS1302的技术文档管脚描述X1 X2 32.768KHz 晶振管脚GND 地RST 复位脚I/O 数据输入/输出引脚SCLK 串行时钟Vcc1,Vcc2 电源供电管脚计算器工作大概流程。
3.中译英 单片机计算器论文摘要(谢谢,在线等)
In recent years, as computer penetration in the social field and large-scale development of integrated circuits, microcontroller applications are continually deepening, because of its powerful function, small size, low power consumption, cheap, reliable, easy to use, etc. therefore particularly suitable for systems with control of more and more widely used in automatic control, intelligent instruments, meters, data acquisition, military products and home appliances fields,
As one of the main branch of microcomputer, microcontroller in the structure of the biggest feature is the CPU, RAM and ROM memory, timer and multiple I / O interface circuit integrated on a VLSI chip. The composition and function from its point of view, a single chip is actually a computer.
This design is the use of MSC-51 microcontroller to design the four-digit calculator, using C programming language to achieve calculator functions. 4X4 external keyboard, the keyboard scan to finish by the number of control values and make the drive circuit to the cathode results in a total of seven-segment digital tube display properly, and has cleared at any time to complete key calculation and display clear. Calculator to complete an integer from 0 to 9999 plus / minus / multiply / divide.
Implementation of the process is as follows:
Power is displayed 0, waiting type value, when the input numbers, will come out through the digital display, the input +,-,*,/ operator, the calculator in the internal implementation of the numerical conversion and storage, and wait for the re-enter the value, when Type the value in the type of value will be displayed by an equal sign will be displayed in the digital control operation results.
Key words: SCM calculator keyboard scan C language
4.用单片机设计简易计算器
给你些子程序,自己看着凑吧。
呵呵。有了这些,写出来应该不难了。
;@@@@@@@@@双字节整数运算@@@@@@@@@@@@@@@@@@;***********双字节无符号加法**************;入口:R6(H),R7,R4(H),R5,出口:和R6(H),R7(L) UADD: MOV A,R7 ADD A,R5 MOV R7,A MOV A,R6 ADDC A,R4 MOV R6,A RET;***********双字节无符号减法**************;入口:被减数R6(H),R7(L),减数R4(H),R5(L),出口:差R6(H),R7(L) CLR C MOV A,R7 SUBB A,R5 MOV R7,A MOV A,R6 SUBB A,R4 MOV R6,A RET;***********双字节无符号乘法**************;入口:R6(H),R7(L),R4(H),R5(L),出口:积R6(H),R7(L) UMUL: MOV A,R7 MOV B,R5 MUL AB MOV R0,B XCH A,R7 MOV B,R4 MUL AB ADD A,R0 XCH A,R6 MOV B,R5 MUL AB ADD A,R6 MOV R6,A RET;***********双字节无符号除法*****************;入口:R6(H),R7(L),R4(H),R5(L),出口:商R6(H),R7(L),余R4(H),R5(L);影响:R2,R3,;堆栈需求:1 UDIV: CLR C CLR A MOV R2,A MOV R3,A MOV B,#10H MOVBIT: MOV A,R7;R6、R7中数据左移一位到R2、R3中,C到R7 RLC A MOV R7,A MOV A,R6 RLC A MOV R6,A MOV A,R3 RLC A MOV R3,A MOV A,R2 RLC A MOV R2,A CLR C ;R2R3-R4R5 MOV A,R3 SUBB A,R5 PUSH Acc MOV A,R2 SUBB A,R4 JBC Cy,MOVBIT0;不够减,清C继续左移 MOV R2,A;够减,存回余数并置位C POP Acc MOV R3,A SETB C SJMP MOVBIT1 MOVBIT0: POP Acc MOVBIT1: DJNZ B,MOVBIT MOV A,R7 RLC A MOV R7,A MOV A,R6 RLC A MOV R6,A MOV A,R2 MOV R4,A MOV A,R3 MOV R5,A RET (7) 标号: DIVD 功能:双字节二进制无符号数除法 入口条件:被除数在R2、R3、R4、R5中,除数在R6、R7中。出口信息:OV=0 时,双字节商在R2、R3中,OV=1 时溢出。
影响资源:PSW、A、B、R1~R7 堆栈需求: 2字节 DIVD: CLR C ;比较被除数和除数 MOV A,R3 SUBB A,R7 MOV A,R2 SUBB A,R6 JC DVD1 SETB OV ;溢出 RET DVD1: MOV B,#10H ;计算双字节商 DVD2: CLR C ;部分商和余数同时左移一位 MOV A,R5 RLC A MOV R5,A MOV A,R4 RLC A MOV R4,A MOV A,R3 RLC A MOV R3,A XCH A,R2 RLC A XCH A,R2 MOV F0,C ;保存溢出位 CLR C SUBB A,R7 ;计算(R2R3-R6R7) MOV R1,A MOV A,R2 SUBB A,R6 ANL C,/F0 ;结果判断 JC DVD3 MOV R2,A ;够减,存放新的余数 MOV A,R1 MOV R3,A INC R5 ;商的低位置一 DVD3: DJNZ B,DVD2 ;计算完十六位商(R4R5) MOV A,R4 ;将商移到R2R3中 MOV R2,A MOV A,R5 MOV R3,A CLR OV ;设立成功标志 RET。
5.求一个基于51单片机的计算器程序
/****************************************************************** QQ 296750363 ******************************************************************* 按键说明 S6--S11 数字0--9的输入 S12 清零 S13 等于 S14--S17加减乘除程序功能: 本程序为简易计算器。
可以算整数且正数类型的运算。 但是暂时没有实现其连算功能,故在每次运算之后,请按下清零键。
******************************************************************/#include#define uchar unsigned charuchar a0=16,b0=16,c0=16,d0=16,e0=16,f0=16,wei,temp,key,i,j,k;uchar jia,jian,cheng,chu,dengyu,jia0,jian0,cheng0,chu0,qingling;uchar s0,s1,s2,s3,s4,s5; //参加运算的各个位unsigned long qian,hou;//定义参于运算的第一个数和第二个数。sbit dula=P2^6;sbit wela=P2^7;sbit beep=P2^3;unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};void delay(uchar i){ for(j=i;j>0;j--) for(k=125;k>0;k--);}void display(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f){ dula=0; P0=table[a]; dula=1; dula=0; wela=0; P0=0xfe; wela=1; wela=0; delay(5); P0=table[b]; dula=1; dula=0; P0=0xfd; wela=1; wela=0; delay(5); P0=table[c]; dula=1; dula=0; P0=0xfb; wela=1; wela=0; delay(5); P0=table[d]; dula=1; dula=0; P0=0xf7; wela=1; wela=0; delay(5); P0=table[e]; dula=1; dula=0; P0=0xef; wela=1; wela=0; delay(5); P0=table[f]; dula=1; dula=0; P0=0xdf; wela=1; wela=0; delay(5);}void keyscan(){ { P3=0xfe; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(10); if(temp!=0xf0) { temp=P3; switch(temp) { case 0xee: key=0; wei++; break; case 0xde: key=1; wei++; break; case 0xbe: key=2; wei++; break; case 0x7e: key=3; wei++; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; beep=0; } beep=1; } } P3=0xfd; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(10); if(temp!=0xf0) { temp=P3; switch(temp) { case 0xed: key=4; wei++; break; case 0xdd: key=5; wei++; break; case 0xbd: key=6; wei++; break; case 0x7d: key=7; wei++; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; beep=0; } beep=1; } } P3=0xfb; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(10); if(temp!=0xf0) { temp=P3; switch(temp) { case 0xeb: key=8; wei++; break; case 0xdb: key=9; wei++; break; case 0xbb: qingling=1; //key=10; //wei++; break; case 0x7b: dengyu=1; //key=11; //wei++; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; beep=0; } beep=1; } } P3=0xf7; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(10); if(temp!=0xf0) { temp=P3; switch(temp) { case 0xe7: jia=1; //key=12; // wei++; break; case 0xd7: jian=1; break; case 0xb7: cheng=1; break; case 0x77: chu=1; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; beep=0; } beep=1; } }}}void display0(){ if(key!=20) { switch(wei) { case 1: a0=key; b0=16; c0=16; d0=16; e0=16; f0=16; break; case 2: b0=key; c0=16; d0=16; e0=16; f0=16; break; case 3: c0=key; d0=16; e0=16; f0=16; break; case 4: d0=key; e0=16; f0=16; break; case 5: e0=key; f0=16; break; case 6: f0=key; //wei=0; break; } key=20; } display(a0,b0,c0,d0,e0,f0); if(a0!=16) s5=a0; if(b0!=16) s4=b0; if(c0!=16) s3=c0; if(d0!=16) s2=d0; if(e0!=16) s1=e0; if(f0!=16) s0=f0;}void main(){ uchar gongneng,yunsuan; while(1) { keyscan(); gongneng=jia|jian|cheng|chu|dengyu|qingling; if(gongneng==0) { display0(); } else { yunsuan=jia|jian|cheng|chu; if(yunsuan) { a0=16; b0=16; c0=16; d0=16; e0=16; f0=16; //wei=0; if(jia) {jia=0; jia0=1;jian0=0;cheng0=0;chu0=0;} if(jian) {jian=0;jia0=0;jian0=1;cheng0=0;chu0=0;} if(cheng) {cheng=0;jia0=0;jian0=0;cheng0=1;chu0=0;} if(chu) {chu=0; jia0=0;jian0=0;cheng0=0;chu0=1;} switch(wei) { case 6: qian=s5*100000+s4*10000+s3*1000+s2*100+s1*10+s0;break; case 5: qian=s5*10000+s4*1000+s3*100+s2*10+s1;break; case 4: qian=s5*1000+s4*100+s3*10+s2;break; case 3: qian=s5*100+s4*10+s3;break; case 2: qian=s5*10+s4;break; case 1: qian=s5;break; } wei=0; s0=0;s1=0;s2=0;s3=0;s4=0;s5=0; display(a0,b0,c0,d0,e0,f0); //P1=0x55; } if(dengyu) { dengyu=0; //display(16,16,16,16,16,16); switch(wei) { case 6: hou=s5*100000+s4*10000+s3*1000+s2*100+s1*10+s0;break; case 5: hou=s5*10000+s4*1000+s3*100+s2*10+s1;break; case 4: hou=s5*1000+s4*100+s3*10+s2;break; case 3: hou=s5*100+s4*10+s3;break; case 2: hou=s5*10+s4;break; case 1: hou=s5;break; } wei=0; s0=0;s1=0;s2=0;s3=0;s4=0;s5=0; if(jia0) {jia0=0; hou=qian+hou;} if(jian0) {jian0=0; hou=qian-hou;} if(cheng0) {cheng0=0; hou=qian*hou;} if(chu0) {chu0=0; hou=qian/hou;} if(hou 评论0 0 0。
6.毕业设计计算器的开题报告
怎么写开题报告呢?
首先要把在准备工作当中搜集的资料整理出来,包括课题名称、课题内容、课题的理论依据、参加人员、组织安排和分工、大概需要的时间、经费的估算等等。
第一是标题的拟定。课题在准备工作中已经确立了,所以开题报告的标题是不成问题的,把你研究的课题直接写上就行了。比如我曾指导过一组同学对伦教的文化诸如“伦教糕”、伦教木工机械、伦教文物等进行研究,拟定的标题就是“伦教文化研究”。
第二就是内容的撰写。开题报告的主要内容包括以下几个部分:
一、课题研究的背景。 所谓课题背景,主要指的是为什么要对这个课题进行研究,所以有的课题干脆把这一部分称为“问题的提出”,意思就是说为什么要提出这个问题,或者说提出这个课题。比如我曾指导的一个课题“伦教文化研究”,背景说明部分里就是说在改革开放的浪潮中,伦教作为珠江三角洲一角,在经济迅速发展的同时,她的文化发展怎么样,有哪些成就,对居民有什么影响,有哪些还要改进的。当然背景所叙述的内容还有很多,既可以是社会背景,也可以是自然背景。关键在于我们所确定的课题是什么。
二、课题研究的内容。课题研究的内容,顾名思义,就是我们的课题要研究的是什么。比如我校黄姝老师的指导的课题“佛山新八景”,课题研究的内容就是:“以佛山新八景为重点,考察佛山历史文化沉淀的昨天、今天、明天,结合佛山经济发展的趋势,拟定开发具有新佛山、新八景、新气象的文化旅游的可行性报告及开发方案。”
三、课题研究的目的和意义。
课题研究的目的,应该叙述自己在这次研究中想要达到的境地或想要得到的结果。比如我校叶少珍老师指导的“重走长征路”研究课题,在其研究目标一栏中就是这样叙述的:
1、通过再现长征历程,追忆红军战士的丰功伟绩,对长征概况、长征途中遇到了哪些艰难险阻、什么是长征精神,有更深刻的了解和感悟。
2、通过小组同学间的分工合作、交流、展示、解说,培养合作参与精神和自我展示能力。
3、通过本次活动,使同学的信息技术得到提高,进一步提高信息素养。
四、课题研究的方法。
在“课题研究的方法”这一部分,应该提出本课题组关于解决本课题问题的门路或者说程序等。一般来说,研究性学习的课题研究方法有:实地调查考察法(通过组织学生到所研究的处所实地调查,从而得出结论的方法)、问卷调查法(根据本课题的情况和自己要了解的内容设置一些问题,以问卷的形式向相关人员调查的方法)、人物采访法(直接向有关人员采访,以掌握第一手材料的方法)、文献法(通过查阅各类资料、图表等,分析、比较得出结论)等等。在课题研究中,应该根据自己课题的实际情况提出相关的课题研究方法,不一定面面俱到,只要实用就行。
五、课题研究的步骤。
课题研究的步骤,当然就是说本课题准备通过哪几步程序来达到研究的目的。所以在这一部分里应该着重思考的问题就是自己的课题大概准备分几步来完成。一般来说课题研究的基本步骤不外乎是以下几个方面:准备阶段、查阅资料阶段、实地考察阶段、问卷调查阶段、采访阶段、资料的分析整理阶段、对本课题的总结与反思阶段等。
六、课题参与人员及组织分工。
这属于对本课题研究的管理范畴,但也不可忽视。因为管理不到位,学生不能明确自己的职责,有时就会偷懒或者互相推诿,有时就会做重复劳动。因此课题参与人员的组织分工是不可少的。最好是把所有的参与研究的学生分成几个小组,每个小组通过民主选举的方式推选出小组长,由小组长负责本小组的任务分派和落实。然后根据本课题的情况,把相关的研究任务分割成几大部分,一个小组负责一个部分。最后由小组长组织人员汇总和整理。
七、课题的经费估算。
一个课题要开展,必然需要一些经费来启动,所以最后还应该大概地估算一下本课题所需要 的资金是多少,比如搜集资料需要多少钱,实地调查的外出经费,问卷调查的印刷和分发的费用,课题组所要占用的场地费,有些课题还需要购买一些相关的材料,结题报告等资料的印刷费等等。所谓“大军未动,粮草先行”,没有足够的资金作后盾,课题研究势必举步维艰,捉襟见肘,甚至于半途而废。因此,课题的经费也必须在开题之初就估算好,未雨绸缪,才能真正把本课题的研究做到最好。
7.一、设计题目 基于单片机的简易计算器设计 二、设计任务 1、用单片
1. 4X4键盘输入,点阵字符型液晶显示。
2. 由于所采用的浮点程序库的限制(MCU平台只找到这个……),浮点运算采用3字节二进制补码表示,有效数字6位。对于输入输出,采用3字节BCD码浮点数格式,有效数字只有4位,因此最终有效数字只有4位。
3. 可进行连续输入,例如:1.23+4.56*8.23/234.8 ,但是运算结果为从左到右,这也是8位简易计算器的方式。
4. 可进行错误判断,溢出、除零等错误将显示一个字符 E 。
5. 由于键盘只有16个按键,安排如下:
+---------------+
| 7 | 8 | 9 | + |
| 4 | 5 | 6 | - |
| 1 | 2 | 3 | * |
| 0 | . | = | / |
+---------------+
6. 按键的缺少导致取消了一些特殊函数,即开根号,三角函数(sin, cos, tan, ctg)的实现,由于这些函数在浮点程序库中均已提供,如果硬件允许,在原来的框架上添加这些附加功能是很容易的(可以看作和+, -, *, /等价的按键操作,调用不同的子程序进行运算即可)
7. 按两次 = 等于清灵。因为按键实在太少,才采用了这个做法。
8. 相应举例:
按键 结果 说明
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
123+= 123 按下等号而没有第二个操作数,保留第一个操作数
并认为此次运算结束(等号的功能)
123+321/111 4.0 等价于(123+321) / 111
2.3+5.4=/0.1+ 77 等号后直接按 / ,则将前面的运算结果作为第一个
操作数
1/0= E 错误显示
要源码去这里:
8.用C语言写一个基于单片机89c51的计算器程序,p1口为4*4键盘,P0
include //包含头文件#define uchar unsigned char#define uint unsigned int unsigned char const dofly[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//0-F,数码管来显示按下键的值。
uchar keyscan(void); //主要的矩阵键盘扫描函数。void delay(uint i); void main() { uchar key; P2=0x00; P3=0xff;//1数码管亮 按相应的按键,会显示按键上的字符 while(1) { key=keyscan();//调用键盘扫描,switch(key) { case 0xee:P2=dofly[0];break;//c k1 case 0xed:P2=dofly[1];break;//d k2 case 0xeb:P2=dofly[2];break;//e k3 case 0xe7:P2=dofly[3];break;//f k4 case 0xde:P2=dofly[4];break;//8 case 0xdd:P2=dofly[5];break;//9 case 0xdb:P2=dofly[6];break;//a case 0xd7:P2=dofly[7];break; case 0xbe:P2=dofly[8];break;//4 case 0xbd:P2=dofly[9];break;//5 case 0xbb:P2=dofly[10];break;//6 case 0xb7:P2=dofly[11];break; case 0x7e:P2=dofly[12];break; case 0x7d:P2=dofly[13];break;//1 case 0x7b:P2=dofly[14];break;//2 case 0x77:P2=dofly[15];break;//3//b//7//0 按下相应的键显示相对应的码值 原理就是高四位一列低四位一列的组//合。
0111 1110 7e 0表示按键后为0,1表示没有按键按下的。即P3.7与P3.1连接为低电平,为S1键//其他类推。
/*case 0x7d:P2=dofly[1];break;//1 case 0x7b:P2=dofly[2];break;//2 case 0x77:P2=dofly[3];break;//3 case 0xbe:P2=dofly[4];break;//4 case 0xbd:P2=dofly[5];break;//5 case 0xbb:P2=dofly[6];break;//6 case 0xb7:P2=dofly[7];break;//7 case 0xde:P2=dofly[8];break;//8 case 0xdd:P2=dofly[9];break;//9 case 0xdb:P2=dofly[10];break;//a case 0xd7:P2=dofly[11];break;//b */ } } } uchar keyscan(void)//键盘扫描函数,使用行列反转扫描法 比如:行为低电位,列为高四位 { uchar cord_h,cord_l;//行列值 P1=0x0f; //行线输出全为0 cord_h=P1&0x0f; //读入列线值 if(cord_h!=0x0f) //先检测有无按键按下 { delay(100); //去抖 if(cord_h!=0x0f) { cord_h=P1&0x0f; //读入hang线值 P1=cord_h|0xf0; //输出当前列线值 cord_l=P1&0xf0; //读入lie线值 return(cord_l+cord_h);//键盘最后组合码值 } }return(0xff); //返回该值 } void delay(uint i)//延时函数 { while(i--); }。