矩阵键盘简易计算器.

合集下载

矩阵键盘计算器

矩阵键盘计算器

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include<stdio.h>#define DataPort P0 //定义数据端口程序中遇到DataPort 则用P0 替换#define KeyPort P1sbit LATCH1=P2^2;//定义锁存使能端口段锁存sbit LATCH2=P2^3;// 位锁存bit KeyPressFlag;//定义按键标志位unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码unsigned char TempData[8]; //存储显示值的全局变量void Display(unsigned char FirstBit,unsigned char Num){static unsigned char i=0;DataPort=0; //清空数据,防止有交替重影LATCH1=1; //段锁存LATCH1=0;DataPort=dofly_WeiMa[i+FirstBit]; //取位码LATCH2=1; //位锁存LATCH2=0;DataPort=TempData[i]; //取显示数据,段码LATCH1=1; //段锁存LATCH1=0;i++;if(i==Num)i=0;}/*------------------------------------------------定时器初始化子程序------------------------------------------------*/void Init_Timer0(void){TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响//TH0=0x00; //给定初值//TL0=0x00;EA=1; //总中断打开ET0=1; //定时器中断打开TR0=1; //定时器开关打开}/*------------------------------------------------定时器中断子程序------------------------------------------------*/void Timer0_isr(void) interrupt 1{TH0=(65536-2000)/256; //重新赋值2msTL0=(65536-2000)%256;Display(0,8);}void Init_INT0(void){EA=1; //全局中断开EX0=1; //外部中断0开IT0=1; //边沿触发}/*------------------------------------------------外部中断0程序------------------------------------------------*/void ISR_INT0(void) interrupt 0{KeyPressFlag=1; //表明按键有动作,可以进行按键扫描}void DelayUs2x(unsigned char t){while(--t);}void DelayMs(unsigned char t){while(t--)//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}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); //返回该值}/*------------------------------------------------按键值处理函数,返回扫键值可以根据需要改变返回值| 1 | 2 | 3 | + || 4 | 5 | 6 | - || 7 | 8 | 9 | * || 0 | . | = | / |------------------------------------------------*/unsigned char KeyPro(void){switch(KeyScan()){case 0x7e:return 1 ;break;//0 按下相应的键显示相对应的码值case 0xbe:return 2 ;break;//1case 0xde:return 3 ;break;//2case 0xee:return '+';break;//3case 0x7d:return 4 ;break;//4case 0xbd:return 5 ;break;//5case 0xdd:return 6 ;break;//6case 0xed:return '-';break;//7case 0x7b:return 7 ;break;//8case 0xbb:return 8 ;break;//9case 0xdb:return 9 ;break;//acase 0xeb:return 'x';break;//bcase 0x77:return 0 ;break;//ccase 0xb7:return '.';break;//dcase 0xd7:return '=';break;//ecase 0xe7:return '/';break;//fdefault:return 0xff;break;}}/*------------------------------------------------主程序------------------------------------------------*/main(){unsigned char num,i,sign;unsigned char temp[8]; //最大输入8个bit firstflag;int a=0,b=0;unsigned char s;Init_INT0();Init_Timer0(); //初始化定时器0while (1) //主循环{KeyPort=0xf0;// 赋值用于中断检测if(KeyPressFlag==1){KeyPressFlag=0; //按num=KeyPro(); //扫描键盘if(num!=0xff) //如果扫描是按键有效值则进行处理{if(i==0) //输入是第一个字符的时候需要把改行清空,方便观看{for(s=0;s<8;s++) //赋值完成后把缓冲区清零,防止下次输入影响结果TempData[s]=0;}if(('+'==num)|| (i==8) || ('-'==num) || ('x'==num)|| ('/'==num) || ('='==num))//输入数字最大值8,输入符号表示输入结束{i=0; //计数器复位if(firstflag==0) //如果是输入的第一个数据,赋值给a,并把标志位置1,到下一个数据输入时可以跳转赋值给b{sscanf(temp,"%d",&a);//从一个字符串输入到变量firstflag=1;}elsesscanf(temp,"%d",&b);for(s=0;s<8;s++) //赋值完成后把缓冲区清零,防止下次输入影响结果temp[s]=0;///////////////////////if(num!='=') //判断当前符号位并做相应处理sign=num; //如果不是等号记下标志位else{firstflag=0; //检测到输入=号,判断上次读入的符合switch(sign){case '+':a=a+b;break;case '-':a=a-b;break;case 'x':a=a*b;break;case '/':a=a/b;break;default:break;}sprintf(temp,"%d",a); //打印十进制到临时缓冲区for(s=0;s<8;s++) //由于打印的是ASCII码值{if(temp[s]==0) //所以需要转换,如果为0表示null 数码管上则不能显示,所以赋值0TempData[s]=0;else if(temp[s]==0x2d)//表示负号,数码管显示负号0x40TempData[s]=0x40;elseTempData[s]=dofly_DuanMa[temp[s]-'0'];//其他0-9负号则进行ASCII 到数字处理,如当前是'3',用'3'-'0'=3//'3'的16进制是0x33,'0'的16进制是0x30}sign=0;a=b=0; //用完后所有数据清零for(s=0;s<8;s++)temp[s]=0;}}else if(i<16){temp[i]=num+'0';TempData[i]=dofly_DuanMa[num];//输出数据i++; //输入数值累加}}}}}。

简易计算器(1602加矩阵键盘)

简易计算器(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。

基于msc51单片机实现的四位4乘4矩阵键盘计算器的C语言程序及其PROTUES电路和仿真_课程设计

基于msc51单片机实现的四位4乘4矩阵键盘计算器的C语言程序及其PROTUES电路和仿真_课程设计

单片机原理及接口技术课程设计报告设计题目:计算器设计信息与电气工程学院二零一三年七月计算器设计单片机体积小,功耗小,价钱低,用途灵活,无处不在,属专用运算机。

是一种特殊器件,需通过专门学习方能把握应用,应用中要设计专用的硬件和软件。

最近几年来,单片机以其体积小、价钱廉、面向操纵等独特优势,在各类工业操纵、仪器仪表、设备、产品的自动化、智能化方面取得了普遍的应用。

与此同时,单片机应用系统的靠得住性成为人们愈来愈关注的重要课题。

阻碍靠得住性的因素是多方面的,如组成系统的元器件本身的靠得住性、系统本身各部份之间的彼此耦合因素等。

其中系统的抗干扰性能是系统靠得住性的重要指标。

数学是科技进步的重要工具,数据的运算也随着科技的进步越发变得繁琐复杂,计算器的显现能够大大解放人在设计计算进程中的工作量,使计算的精度、速度取得改善,通过msc51单片机,矩阵键盘和LED数码管能够实现简单的四位数的四那么运算和显示,并当运算结果超出范围时予以报错。

注:这一部份要紧描述题目的背景和意义,对设计所采取的要紧方式做一下简要描述。

字数不要太多,300-500字。

另注:本文要当做模板利用,不要随意更改字体、字号、行间距等,学会利用格式刷。

文中给出的各项内容都要在大伙儿的报告中表现,可采纳填空的方式利用本模板。

1. 设计任务结合实际情形,基于AT89C51单片机设计一个计算器。

该系统应知足的功能要求为:(1) 实现简单的四位十进制数字的四那么运算;(2) 按键输入数字,运算法那么;(3) LED数码管移位显示每次输入的数据和运算结果;(4) 当运算结果超出范围时实现报错。

要紧硬件设备:AT89C51单片机、LED数码管、矩阵键盘。

注:这一部份需要写明系统功能需求,用到的要紧硬件(参考实验箱的说明书)。

2. 整体方案设计计算器以AT89C51单片机作为整个系统的操纵核心,应用其壮大的I/O功能和计算速度,组成整个计算器。

通过矩阵键盘输入运算数据和符号,送入单片机进行数据处置。

电子信息工程专业毕业论文--基于51单片机的简易计算器设计

电子信息工程专业毕业论文--基于51单片机的简易计算器设计

摘要近几年单片机技术的发展很快,其中电子产品的更新速度迅猛。

计算器是日常生活中比较的常见的电子产品之一。

如何才能使计算器技术更加的成熟,充分利用已有的软件和硬件条件,设计出更出色的计算器呢。

本设计是以AT89S52单片机为核心的计算器模拟系统设计,输入采用4×4矩阵键盘,可以进行加、减、乘、除4位带符号数字运算,并在LCD1602上显示操作过程。

科技的进步告别了以前复杂的模拟电路,一块几厘米平方的单片机可以省去很多繁琐的电路。

现在应用较广泛的是科学计算器,与我们日常所用的简单计算器有较大差别,除了能进行加减乘除,科学计算器还可以进行正数的四则运算和乘方、开方运算,具有指数、对数、三角函数、反三角函数及存储等计算功能。

计算器的未来是小型化和轻便化,现在市面上出现的使用太阳能电池的计算器,使用ASIC设计的计算器,如使用纯软件实现的计算器等,未来的智能化计算器将是我们的发展方向,更希望成为应用广泛的计算工具。

[关键词] AT89S52 LCD1602 计算器矩阵键盘目录第一章前言 (1)1.1 系统开发背景 (1)1.2 系统开发意义 (1)1.3 设计目的 (1)第二章方案论证 (2)2.1 方案构思 (2)2.2 方案比较与选择 (2)第三章系统硬件设计及说明 (3)3.1系统组成及总体框图 (3)3.2元件简介 (3)3.2.1 AT89S52特点 (3)3.2.2 LCD1602液晶显示屏 (9)第四章设计原理分析 (12)4.1 设计方案的确定 (13)4.2计算器硬件方案及硬件资源分配 (13)4.2.1 硬件资源分配 (15)4.2.2 系统的硬件设计 (13)4.2.3 键盘电路的设计 (16)4.2.4 显示电路的设计 (16)第五章计算器的软件设计 (17)5.1计算器的软件规划 (17)5.2 键盘扫描的程序设计 (16)5.3 显示模块的程序设计 (18)5.4 主程序的设计 (19)5.5 软件的可靠性设计 (19)结束语 (19)参考文献 (20)第一章前言1.1 系统开发背景随着社会的发展,科学的进步,人们的生活水平在逐步的提高,尤其是微电子技术的发展,犹如雨后春笋般的变化。

4×4_矩阵键盘计算器设计

4×4_矩阵键盘计算器设计

西华大学课程设计说明书题目4×4 矩阵键盘计算器设计系(部) 电气信息学院专业(班级) 自动化3班姓名学号指导教师胡红平起止日期2012.6.10-2012.6.30计算机接口及应用课程设计任务书系(部):电气信息学院专业:09自动化指导教师:日期:2012-6-20西华大学课程设计鉴定表摘要近几年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。

在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,仅单片机方面的知识是不够的,还应根据具体硬件结合,加以完善。

本任务是个简易得三位数的减法运算,用4×4 矩阵键盘及计算器设计,利用数码管实现255内的减法运算。

程序都是根据教材内和网络中的程序参考编写而成,在功能上还并不完善,限制也较多。

本任务重在设计构思与团队合作,使得我们用专业知识,专业技能分析和解决问题全面系统的锻炼。

关键词:单片机,AT89C51,矩阵键盘,数码管ABSTRACTIn recent years, along with the rapid development of science and technology, the application of SCM is unceasingly thorough, it causes the traditional control test technology increasingly updates. In real-time detection and automatic control of single-chip microcomputer application system, often as a core component to use, only microcontroller aspects of knowledge is not enough, should according to specific hardware combined, and perfects.This task is a simple three digits, subtract with 4 * 4 matrix keyboard and a calculator design, use digital tube realization within the 255 subtract. Program is according to the teaching material and within the network reference and compiled program, on the function is not perfect, restrictions also more. This task focuses on design conception and team cooperation, make us with professional knowledge, professional skills to analyze and solve problems of full system exercise.Keywords:Single-chip,AT89C51,Matrix keyboard,digital tube目录摘要 (I)ABSTRACT (II)第1章课题概述 (1)1.1 课题概述 (1)1.2 课题要求 (2)第2章系统设计 (3)2.1 设计思路 (3)2.2 框图设计 (3)2.3 知识点 (3)2.4 硬件设计 (4)2.4.1 电路原理图 (4)2.4.2 元件选择 (5)2.4.3 PCB制版及效果 (9)2.5 软件设计 (10)2.5.1 程序流程图 (10)2.6 系统仿真及调试 (11)2.6.1 硬件调试 (11)2.6.2 软件调试 (11)2.6.3 软硬件调试 (11)结论 (11)参考文献 (14)附录 (15)第1章课题概述1.1 课题概述随着当今时代的电子领域的发展,尤其是自动化的控制领域,传统的分立元件或数字逻辑电路构成的控制系统正被智能化的单片机所取代。

51单片机矩阵键盘计算器

51单片机矩阵键盘计算器

/****‎*****‎*413暑‎假作品**‎*****‎**128‎64液晶显‎示屏,结合‎4*4矩阵‎键盘,简易‎计算器*,‎存储地址:‎S TC-h‎e x2 ,‎LCD1‎2864.‎c**‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎//**‎*功能:1‎、基本整数‎的加减乘除‎; 2、有‎清除功能;‎3、除法计‎算,结果保‎留两位小数‎;4、分母‎为0报错*‎*****‎**//‎*****‎****5‎、小数减大‎数可显示负‎号;6、只‎能做两个数‎的加减乘除‎;7、可做‎10位数的‎有效运算*‎*****‎*****‎*****‎*****‎*****‎*****‎****/‎/***‎***注意‎:计算结果‎要求余显示‎,比如正确‎结果123‎,求余显示‎321,所‎以将321‎逐个赋给某‎一数组,倒‎序向128‎64输出*‎*/‎#incl‎u de<r‎e g52.‎h>#d‎e fine‎uint‎unsi‎g ned ‎i nt#‎d efin‎e uch‎a r un‎s igne‎d cha‎r#de‎f ine ‎u long‎unsi‎g ned ‎l ong‎sbit‎rs=P‎3^7;‎s bit ‎r w=P3‎^6;s‎b it ‎e=P3^‎5;sb‎i t ps‎b=P3^‎4; ‎//串并选‎择,H=串‎L=并,‎此程序让1‎2864并‎行输出‎b it f‎l ag1=‎0; /‎/数字标记‎位bit‎flag‎11=0;‎ // ‎ +标记‎位bit‎flag‎12=0;‎ // ‎—标记‎位bit‎flag‎13=0;‎ // ‎ *标记‎位bit‎flag‎14=0;‎ // ‎ /标记‎位bit‎flag‎15=0;‎ // ‎ =标记‎位bit‎flag‎16=0;‎ /‎/清除位‎b it f‎l ag2=‎0; /‎/负号标‎记bit‎flag‎3=0; ‎ /‎/分子小‎于分母,结‎果只有两位‎有效数字时‎,扩大10‎0倍有两位‎有效数字‎b it f‎l ag4=‎0; /‎/分子小‎于分母,结‎果只有一位‎效数字时,‎扩大100‎倍有1位有‎效数字‎v oid ‎i nit(‎); ‎ //初‎始化168‎24子函数‎void‎writ‎e_com‎(ucha‎r); ‎//写命‎令voi‎d wri‎t e_da‎t(uch‎a r);‎ //写‎数据,即显‎示内容v‎o id d‎i spla‎y1(uc‎h ar);‎‎//显示字‎符voi‎d del‎e te()‎;‎//清除‎显示vo‎i d de‎l ay(u‎i nt);‎‎ //延‎时voi‎d key‎s can(‎); ‎ //键‎盘扫描v‎o id s‎c an()‎;‎ /‎/扫描运算‎符,设定两‎个数计算‎v oid ‎d ispl‎a y_va‎l ue()‎; /‎/计算结‎果显示v‎o id v‎a lue(‎); ‎ // ‎计算vo‎i d be‎g in()‎;‎//开机‎屏幕显示‎v oid ‎m ath_‎e rror‎(); ‎ //数‎学错误显示‎uch‎a r co‎d e ta‎b le1[‎]="01‎23456‎789.+‎-*/="‎;uch‎a r co‎d e ta‎b le3[‎]="we‎l come‎to";‎ucha‎r cod‎e tab‎l e4[]‎=" 51‎calc‎u lato‎r" ;‎u char‎code‎tabl‎e5[]=‎"math‎erro‎r";‎l ong ‎t able‎2[19]‎; //‎存储结果的‎数组,20‎就出错?‎l ong ‎s,a,b‎,num1‎; //‎s为计算结‎果,a为第‎一个数,b‎为第二个数‎,num1‎对应为键对‎应的值为显‎12864‎显示服务‎/****‎*****‎*****‎*****‎*****‎*****‎*****‎*主**函‎**数**‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎**/v‎o id m‎a in()‎{‎i nit(‎);‎d elay‎(5);‎beg‎i n();‎ /‎/开机初始‎化d‎e lay(‎5);‎writ‎e_com‎(0x80‎); //‎输入数在第‎一行显示‎whi‎l e(1)‎‎//大循‎环使其不断‎的显示‎{‎keys‎c an()‎;‎s can(‎);‎valu‎e();‎di‎s play‎_valu‎e();‎de‎l ete(‎);‎‎}}‎/****‎*****‎**初始化‎*****‎*****‎*****‎*****‎*****‎*****‎**/v‎o id i‎n it()‎{‎psb=‎1; ‎//并口‎传输方式‎‎d‎e lay(‎50); ‎‎‎//先等待‎50个毫秒‎w‎r ite_‎c om(0‎x30);‎ /‎/基本操作‎指令‎dela‎y(5);‎w‎r ite_‎c om(0‎x0e);‎‎//显示状‎态开/关,‎08什么也‎没有;0c‎无光标;0‎e有光标但‎不闪;0f‎有光标闪烁‎d‎e lay(‎5);‎ wri‎t e_co‎m(0x0‎1); ‎ //清‎除显示‎ del‎a y(5)‎;‎w rite‎_com(‎0x06)‎;‎//进入点‎设置‎dela‎y(5);‎}/*‎*****‎*****‎*****‎写指令**‎*****‎*****‎*****‎*****‎*****‎/voi‎d wri‎t e_co‎m(uch‎a r co‎m){‎rs=0‎;‎//‎表示写命令‎rw=‎0;e‎=0;‎P0=co‎m;d‎e lay(‎5);‎e=1;‎dela‎y(5);‎e=0‎;‎‎}‎/****‎*****‎*****‎***写数‎据****‎*****‎*****‎*****‎*****‎***/‎v oid ‎w rite‎_dat(‎u char‎dat)‎{r‎s=1; ‎‎ //‎表示写数据‎rw=‎0;e‎=0;‎P0=da‎t;d‎e lay(‎5);‎e=1;‎dela‎y(5);‎e=0‎;}‎/****‎*****‎*****‎***显示‎字符函数*‎*****‎*****‎*****‎*****‎****/‎void‎disp‎l ay1(‎u char‎num1‎){ ‎w‎r ite_‎d at(t‎a ble1‎[num1‎]);‎ del‎a y(2)‎;}‎/****‎*****‎*****‎*****‎*****‎*****‎*****‎***键*‎*盘**扫‎**描 P‎1口***‎*****‎*****‎*****‎*****‎*****‎*****‎/voi‎d key‎s can(‎){ ‎ uc‎h ar t‎e mp; ‎/‎*第一行*‎/‎P1=0x‎f e; ‎‎//将第一‎行置为低电‎平,其余行‎线置为高电‎平‎t emp=‎P1; ‎ //读‎取P3口当‎前状态赋‎给临时变量‎t emp,‎用于后面计‎算‎t emp=‎t emp&‎0xf0;‎ //‎判断第一行‎是否有按键‎按下‎whil‎e(tem‎p!=0x‎f0) ‎ //消‎抖‎{‎de‎l ay(5‎);‎te‎m p=P1‎;‎tem‎p=tem‎p&0xf‎0;‎wh‎i le(t‎e mp!=‎0xf0)‎‎{‎‎t emp=‎P1;‎‎s witc‎h(tem‎p)‎‎{‎‎c ase ‎0xee:‎n um1=‎7;fla‎g1=1;‎//第一‎个键‎7‎‎brea‎k;‎‎case‎0xde‎:num1‎=8;fl‎a g1=1‎;; /‎/第二个键‎ 8‎‎b‎r eak;‎‎‎‎cas‎e 0xb‎e:num‎1=9;f‎l ag1=‎1; /‎/第三个键‎9‎‎bre‎a k;‎‎cas‎e 0x7‎e:num‎1=11;‎f lag1‎1=1;‎//第四‎个键‎+‎‎brea‎k;‎‎}‎wh‎i le(t‎e mp!=‎0xf0)‎‎//等待按‎键释放‎‎{‎‎temp‎=P1;‎‎te‎m p=te‎m p&0x‎f0;‎‎} ‎‎‎d ispl‎a y1(n‎u m1);‎‎}‎‎}‎/*第‎二行*/‎P1‎=0xfd‎;‎t emp=‎P1;‎tem‎p=tem‎p&0xf‎0;‎whil‎e(tem‎p!=0x‎f0)‎{‎‎d elay‎(5);‎‎t emp=‎P1;‎t‎e mp=t‎e mp&0‎x f0;‎‎w hile‎(temp‎!=0xf‎0)‎{‎‎tem‎p=P1;‎‎swi‎t ch(t‎e mp)‎‎{‎‎cas‎e 0xe‎d:num‎1=4;f‎l ag1=‎1;//‎4‎‎brea‎k;‎‎case‎0xdd‎:num1‎=5;fl‎a g1=1‎; /‎/5‎‎bre‎a k;‎‎cas‎e0xb‎d:num‎1=6;f‎l ag1=‎1; ‎//6‎‎br‎e ak;‎‎ca‎s e0x‎7d:nu‎m1=12‎;flag‎12=1;‎ //-‎‎‎b reak‎;‎}‎‎whi‎l e(te‎m p!=0‎x f0)‎‎{‎‎tem‎p=P1;‎‎t‎e mp=t‎e mp&0‎x f0;‎‎}‎‎disp‎l ay1(‎n um1)‎;‎‎}‎‎}‎/‎*第三行*‎/‎P1=0x‎f b;‎tem‎p=P1;‎t‎e mp=t‎e mp&0‎x f0;‎wh‎i le(t‎e mp!=‎0xf0)‎‎{‎del‎a y(5)‎;‎tem‎p=P1;‎‎temp‎=temp‎&0xf0‎;‎whi‎l e(te‎m p!=0‎x f0)‎‎{‎t‎e mp=P‎1;‎s‎w itch‎(temp‎)‎{‎‎c‎a se 0‎x eb:n‎u m1=1‎;flag‎1=1; ‎// ‎1‎‎brea‎k;‎‎case‎0xdb‎:num1‎=2;fl‎a g1=1‎; //2‎‎‎b reak‎;‎‎c ase ‎0xbb:‎n um1=‎3;fla‎g1=1;‎//3‎‎b‎r eak;‎‎‎c ase ‎0x7b:‎n um1=‎13;fl‎a g13=‎1; /‎/*‎‎bre‎a k;‎‎}‎w‎h ile(‎t emp!‎=0xf0‎)‎{‎‎t‎e mp=P‎1;‎‎temp‎=temp‎&0xf0‎;‎}‎‎dis‎p lay1‎(num1‎);‎‎‎}‎}‎‎/*第四行‎*/‎P1=0‎x f7;‎te‎m p=P1‎;‎t emp=‎t emp&‎0xf0;‎w‎h ile(‎t emp!‎=0xf0‎)‎{‎de‎l ay(5‎);‎te‎m p=P1‎;‎tem‎p=tem‎p&0xf‎0;‎wh‎i le(t‎e mp!=‎0xf0)‎‎{‎‎t emp=‎P1;‎‎s witc‎h(tem‎p)‎‎{‎‎c ase ‎0xe7:‎n um1=‎15;fl‎a g15=‎1;//‎=‎‎bre‎a k;‎‎cas‎e 0xd‎7:num‎1=0;f‎l ag1=‎1;//‎0‎‎brea‎k;‎‎case‎0xb7‎:‎ fl‎a g16=‎1;//清‎屏,要把所‎有标识位给‎清除‎‎bre‎a k;‎‎cas‎e 0x7‎7:num‎1=14;‎f lag1‎4=1;‎// ‎/除号‎‎br‎e ak;‎‎}‎‎w hile‎(temp‎!=0xf‎0)‎‎{‎‎t emp=‎P1;‎‎tem‎p=tem‎p&0xf‎0;‎‎}‎‎di‎s play‎1(num‎1); ‎‎‎}‎}‎}/*‎*****‎*****‎*****‎*****‎*****‎*****‎***扫描‎运算符,设‎定两个数计‎算****‎*****‎*****‎***8*‎*****‎*****‎*****‎*****‎/voi‎d sca‎n(){‎‎if(‎f lag1‎5==0)‎‎// ‎只有没按‎等号才能‎进入{‎‎if‎(flag‎11||f‎l ag12‎||fla‎g13||‎f lag1‎4)‎{ ‎‎ if‎(flag‎1==1)‎ /‎/不使运‎算符对应‎的num1‎进入‎ {‎‎b=b*‎10+nu‎m1;‎f‎l ag1=‎0; ‎ //b‎为第二个数‎,并防止b‎不断死循环‎‎} ‎‎}‎‎i f(fl‎a g1==‎1) ‎//a为‎第一个数‎{‎a‎=a*10‎+num1‎;‎‎fla‎g1=0;‎}‎} ‎}/*‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎计****‎算****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎**/v‎o id v‎a lue(‎){‎ if(‎f lag1‎5==0)‎‎ // ‎只有没按‎等号才能‎进入,只要‎按等号就不‎会运算,防‎止死循环‎ { ‎‎if(‎f lag1‎1==1)‎‎//加法‎{‎s=a+‎b; }‎‎‎‎els‎e if(‎f lag1‎2==1)‎‎//减法‎{‎‎if(a‎>=b) ‎‎//做减‎法时,判断‎两个数大小‎‎{ s‎=a-b;‎ } ‎‎e‎l se‎‎{‎s‎=b-a;‎‎fl‎a g2=1‎;‎//如果‎a<b,f‎l ag2是‎负号标记‎‎}‎}‎el‎s e if‎(flag‎13==1‎)‎//乘法‎‎{ s=‎a*b; ‎ }‎‎‎‎else‎if(f‎l ag14‎==1) ‎‎//除法‎{‎‎s=‎(((fl‎o at)a‎/b)*1‎00); ‎//s‎为long‎,将a/b‎结果转化为‎f loat‎‎}‎}}‎/***‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎****计‎算结果显示‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎***/‎v oid ‎d ispl‎a y_va‎l ue()‎{‎l ong ‎n=0,y‎;‎i f(fl‎a g15=‎=1)‎{‎flag‎15=0;‎w‎r ite_‎c om(0‎x98);‎‎//结果在‎第四行显示‎i‎f(s==‎0) ‎ /‎/如果两数‎相减结果s‎为0,直接‎输出0‎{ ‎ wri‎t e_da‎t('0'‎); }‎‎‎if(‎f lag2‎==1) ‎‎ //如‎果小数减大‎数,先输出‎一个‘-’‎,再输出结‎果‎{ wr‎i te_d‎a t('-‎'); ‎}‎i‎f(s!=‎0)‎{‎wh‎i le(s‎)/‎/求余,将‎结果赋给数‎组tabl‎e2,运算‎结果为12‎3,但求余‎赋给数组为‎321‎{‎‎y=s‎%10; ‎ /‎/求余,s‎必须为整型‎,将余数逐‎个放入数组‎t able‎2中‎t‎a ble2‎[n]=y‎;‎s=‎s/10;‎‎n++‎;‎}‎‎n--;‎‎ if(‎f lag1‎4==1)‎‎ //除‎法‎ {‎‎if(n‎==1) ‎‎// 分子‎小于分母,‎扩大100‎倍有两位有‎效数字‎‎{ f‎l ag3=‎1; } ‎‎‎‎i‎f(n==‎0) ‎// ‎分子小于分‎母,扩大1‎00倍有一‎位有效数字‎‎{ ‎flag‎4=1; ‎}‎if‎(b==0‎)‎//分母‎为零,输出‎错误,为什‎么结果多输‎出一个/?‎有待解决‎‎{ ‎math‎_erro‎r(); ‎}‎‎‎‎ }‎‎w hile‎(n>=0‎)‎/‎/将数组倒‎序输出**‎*****‎*****‎*****‎*****‎*****‎**‎{‎‎del‎a y(2)‎;‎i‎f(fla‎g3==1‎)‎ //相‎除的数小于‎3位数‎‎{‎‎flag‎3=0;‎‎wr‎i te_d‎a t('0‎');‎‎del‎a y(2)‎;‎‎w rite‎_dat(‎'.');‎‎}‎‎if(‎(flag‎4==1)‎&(b!=‎0)) ‎/‎/相除的数‎小于2位数‎,排除分母‎为0的情况‎‎{‎‎fl‎a g4=0‎;‎‎w rite‎_dat(‎'0');‎‎d‎e lay(‎2);‎‎wri‎t e_da‎t('.'‎);‎‎writ‎e_dat‎('0')‎;‎‎d elay‎(2);‎‎}‎‎writ‎e_dat‎(0x30‎+tabl‎e2[n]‎); ‎//倒序显‎示结果‎‎n--;‎‎i‎f(fla‎g14==‎1)‎‎{‎‎if(n‎==2) ‎/‎/如果按/‎键,结果保‎留两位小数‎‎‎{ wr‎i te_d‎a t('.‎'); }‎‎‎‎‎‎}‎‎‎‎}‎ } ‎‎}‎}/‎*****‎*****‎*****‎清除显示*‎*****‎*****‎*****‎*/vo‎i d de‎l ete(‎){‎i‎f(fla‎g16==‎1)‎{‎w rite‎_com(‎0x01)‎;‎f lag1‎=flag‎2=fla‎g3=fl‎a g4=0‎;‎f lag1‎1=fla‎g12=f‎l ag13‎=flag‎14=fl‎a g15=‎f lag1‎6=0;‎s=‎0;‎a=0;‎b‎=0;‎}}‎/****‎*****‎开机屏幕显‎示****‎*****‎*/vo‎i d be‎g in()‎{u‎c har ‎n um;‎writ‎e_com‎(0x91‎);d‎e lay(‎2);‎f or(n‎u m=0;‎n um<1‎1;num‎++)‎{‎writ‎e_dat‎(tabl‎e3[nu‎m]);‎de‎l ay(2‎);‎}wr‎i te_c‎o m(0x‎88);‎dela‎y(2);‎for‎(num=‎0;num‎<14;n‎u m++)‎{‎wr‎i te_d‎a t(ta‎b le4[‎n um])‎;‎d elay‎(2);‎}‎d elay‎(8000‎);w‎r ite_‎c om(0‎x01);‎}/*‎*****‎*****‎输出数学错‎误,分母为‎0****‎**/v‎o id m‎a th_e‎r ror(‎){‎‎u char‎num;‎wr‎i te_c‎o m(0x‎90);‎del‎a y(2)‎;f‎o r(nu‎m=0;n‎u m<10‎;num+‎+)‎{‎wri‎t e_da‎t(tab‎l e5[n‎u m]);‎‎d elay‎(2);‎}‎}/**‎*****‎*****‎**延时*‎*****‎*****‎*****‎*****‎*****‎*****‎****/‎void‎dela‎y(uin‎t x) ‎/‎/毫秒{‎uin‎t i,j‎;fo‎r(i=x‎;i>0;‎i--)‎for‎(j=11‎0;j>0‎;j--)‎;}‎。

数码管显示简易计算器说明书

数码管显示简易计算器说明书

目录一、原理图设计说明 (1)1.1数码管硬件电路设计 (1)1.2矩阵键盘电路设计: (2)二、程序设计说明 (3)2.1键盘扫描程序设计 (3)2.2算术运算程序设计 (4)2.3显示程序设计 (5)三、工作原理图及程序流程图 (6)四、程序清单 (9)五、参考文献 (15)一、原理图设计说明1.1数码管硬件电路设计数码管数据显示的硬件电路由单片机、4 位共阳极数码管、位驱动电路、限流电阻等组成。

实验板中用杜邦线将P7 与单片机IO 口相连(这里以P0 口为例)。

用跳线将P8 与单片机P2 低四位相连,P0 口送出数码管段选码,P2 送出位选码。

图1-1 数码管硬件电路原理图1.2矩阵键盘电路设计:4*4 矩阵键盘行输入接单片机P1.0-P1.3,列输入接单片机P1.4-P1.7,通过扫描方式检测是否有键按下,并确定键值,使用矩阵键盘时注意给P10 矩阵键盘选择端使能。

对键盘进行编号,S3-S18,按下相应按键,在数码管上显示相应键值(0-F)。

例如按下S10 键,显示A,按下S0 键,显示0。

图1-2 矩阵键盘电路原理图二、程序设计说明2.1键盘扫描程序设计键盘扫描程序的过程为:开始时,先判断是否有键闭合,无键闭合时,返回继续判断,有键闭合时,先去抖动,然后确定是否有键按下,若无键按下,则返回继续判断是否有键闭合,若有键按下,则判断键号,然后释放,若释放按键完毕,则返回,若没有释放按键,则返回继续释放。

其流程图如图2-1所示。

图2-1 键盘扫描程序流程图算术运算程序的过程为:先判断输入的运算符是+、-、*、/ 中的哪一个,若是+或-,则要判断运算结果是否溢出,溢出则显示错误信息,没溢出就显示运算结果,若是/,则要先判断除数是否为零,为零就显示错误信息,不为零则显示运算结果,若是-,则直接显示运算结果。

其流程图如图2.2所示。

图2-2 算术运算程序设计流程图先是程序的过程为:显示开始时,先进行LED的初始化,判断是否显示,若不显示,则返回,若显示,则进行相应功能的设置,然后送地址和数据,再判断是否显示完,显示完则返回,没有显示完则继续送地址。

新基于51单片机的简易计算器

新基于51单片机的简易计算器

基于51单片机的简易计算器1、前言:本设计是基于51系列单片机来进展的数字计算器系统设计,可以完成计算器的键盘输入,进展加、减、乘、除根本四则运算,并在LCD上显示相应的结果;设计电路采用STC90C51单片机为主要控制电路,利用MM74C922作为计算器4*4键盘的扫描IC读取键盘上的输入;显示采用字符LCD静态显示;软件方面使用C语言编程,并用PROTUES仿真。

2、设计任务:计算器软件程序要完成以下模块的设计:(1)键盘输入检测模块;〔2〕LCD 显示模块;〔3〕算术运算模块;〔4〕错误处理及提示模块。

3、主体设计局部:〔1〕、系统模块图:2〕、系统总流程图:4、硬件局部单片机局部+矩阵键盘+1602显示如下列图为简易计算器的电路原理图。

P3口用于键盘输入,接4*4矩阵键盘,键值与键盘的对应表如表----所示,p0口和p2口用于显示,p2口用于显示数值的高位,po口用于显示数值的低位。

简易计算器电路原理图矩阵键盘有16个按键,满足对简易计算器的计算实现,显示局部采用LCD1602,第一行显示计算的数值符号,第二行显示计算结果。

LCD显示模块:本设计采用LCD液晶显示器来显示输出数据。

通过D0-D7引脚向LCD写指令字或写数据以使LCD实现不同的功能或显示相应数据。

5、软件局部*include<reg52.h>*include<intrins.h>*define uchar unsigned charsbit lcden=P2^7;sbit lcdrs=P2^6;sbit lcdrw=P2^5;sbit lcdbf=P0^7;uchar temp,key,i,j,flag,fh,k;long a,b,c;uchar code table[]={1,2,3,0,4,5,6,0,7,8,9,0,0,0,0,0};uchar code table2[]="123+456-789*000/"; void delay(uchar ms){uchar *,y;for(*=ms;*>0;*--)for(y=110;y>0;y--);}/*-------------对LCD1602的操作-----------*/ bit busy(void)//判断忙碌{bit res;lcdrs=0;lcdrw=1;lcden=1;_nop_();_nop_();res=lcdbf;lcden=0;return res;}void write_inst (uchar cmd)//写命令{while(busy()==1); //忙碌就等待lcdrs=0;.lcdrw=0;lcden=0;_nop_();_nop_();P0=cmd;_nop_();_nop_();lcden=1;_nop_();_nop_();lcden=0;}void write_(uchar )//写地址{write_inst(|0*80);}void write_date(uchar dat) //写数据{while(busy()==1);lcdrs=1;lcdrw=0;lcden=0;P0=dat;_nop_();_nop_();lcden=1;_nop_();_nop_();lcden=0;}void init() //初始化{lcden=1;write_inst(0*38);//显示8位2行delay(5);write_inst(0*0c);//显示开,光标关,不闪烁delay(5);write_inst(0*06);//增量方式不位移delay(5);write_inst(0*80);//检测忙碌信号delay(5);write_inst(0*01);//delay(5);}/*------------键盘扫描-----------*/void keyscan()//键盘扫描{P3=0*fe;if(P3!=0*fe){delay(100);if(P3!=0*fe){temp=P3&0*f0;switch(temp){case 0*e0:key=0;break;case 0*d0:key=1;break;case 0*b0:key=2;break;case 0*70:key=3;break;}}while(P3!=0*fe);if(key==0||key==1||key==2){if(j!=0){write_inst(0*01);j=0;}if(flag==0){a=a*10+table[key];}if(flag==1){b=b*10+table[key];}write_date(table2[key]);}else{if(k==0){flag=1;k=1;fh=1;write_date(table2[key]);}}}P3=0*fd;if(P3!=0*fd){delay(100);if(P3!=0*fd){temp=P3&0*f0;switch(temp){case 0*e0:key=4;break;case 0*d0:key=5;break;case 0*b0:key=6;break;case 0*70:key=7;break;}}while(P3!=0*fd);if(key==4||key==5||key==6){if(j!=0){write_inst(0*01);j=0;}if(flag==0){a=a*10+table[key];}if(flag==1){b=b*10+table[key];}write_date(table2[key]);}else{if(k==0){flag=1;k=1;fh=2;write_date(table2[key]);}}}P3=0*fb;if(P3!=0*fb){delay(100);if(P3!=0*fb){temp=P3&0*f0;switch(temp){case 0*e0:key=8;break;case 0*d0:key=9;break;case 0*b0:key=10;break;case 0*70:key=11;break;}}while(P3!=0*fb);if(key==8||key==9||key==10) {if(j!=0){write_inst(0*01);j=0;}if(flag==0){a=a*10+table[key];}if(flag==1){b=b*10+table[key];}write_date(table2[key]);}else{if(k==0){flag=1;k=1;fh=3;write_date(table2[key]);}}}P3=0*f7;if(P3!=0*f7){delay(100);if(P3!=0*f7){temp=P3&0*f0;switch(temp){case 0*e0:key=12;break;case 0*d0:key=13;break;case 0*b0:key=14;break;case 0*70:key=15;break;}}while(P3!=0*f7);.switch(key){case 12:{write_inst(0*01);a=0;b=0;flag=0;fh=0;j=0;k=0;} break;case 13:{if(flag==0){a=a*10;write_date(0*30);P1=0;}else if(flag==1){b=b*10;write_date(0*30);}.} break;case 14:{j=1;if(fh==1){write_(0*4f);write_inst(0*04);c=a+b;while(c!=0){write_date(0*30+c%10);c=c/10;}write_date(0*3d);a=0;b=0;flag=0;fh=0;k=0;}else if(fh==2){write_(0*4f);write_inst(0*04);if((a-b)>0)c=a-b;elsec=b-a;if(c==0)write_date(0*30+0);while(c!=0){write_date(0*30+c%10);c=c/10;}if((a-b)*(-1)>0)write_date(0*2d);write_date(0*3d);a=0;b=0;flag=0;fh=0;k=0;}else if(fh==3){write_(0*4f);write_inst(0*04);c=a*b;if(c==0)write_date(0*30+0);while(c!=0){write_date(0*30+c%10);c=c/10;}write_date(0*3d);a=0;b=0;flag=0;fh=0;k=0;}else if(fh==4){write_(0*4f);write_inst(0*04);i=0;c=(long)(((float)a/b)*1000); //计算c的数据if(c==0)write_date(0*30+0);while(c!=0){write_date(0*30+c%10);c=c/10;i++;if(i==3)write_date(0*2e); //写数据}if((a/b)<=0)write_date(0*30);write_date(0*3d);a=0;b=0;flag=0;fh=0;k=0;}} break;case 15:{if(k==0).{write_date(table2[key]);flag=1;k=1;fh=4;}} break;}}}void main(){init();i=0;j=0;.a=0;b=0;c=0;k=0;flag=0;fh=0;while(1){keyscan();}}6、总结通过该计算器的设计我深入学习数码管扫描和键盘控制,提高对了51系列单片机的实际应用能力。

【实用】矩阵键盘系统设计与制作PPT文档

【实用】矩阵键盘系统设计与制作PPT文档
其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。
只只要要有 有一一列列的的电电平平为为低低,,2则则、表表示示去键键除盘盘中中键有有键键抖被被动按按下下。,,而而当且且检闭闭合合测的的键键到位位有于于低低键电电平平按线线下与与44后根根行行,线线相相延交交叉叉时的的一44个个段按按键键时之之中中间。。再做下一步的检测判断。 3按下述4种组合依次输出3:、若有键被按下,应识别出是哪一个键闭合。方法是对键盘的行线进行扫描。 具 任体务的描识 述别 :及 在编ProP程te方1us.法软0如件-P下和所1单.述片3。机按实下训板述上,4采种用组单片合机P依3口次连接输数码出管:的数据端口,P2口与4×4矩阵键盘相连; P1.0 0 1 1 1 3、若有键被按下,应识别出是哪一个键闭合。
《单片机综合实训》课程
矩阵键盘系统设计与制作
任课教师:杨黎 副教授
地址:广东省河源市东环路大学城 邮政编码:517000
目录
CONTENTS
1 矩阵键盘识别按键方法 2 实现任意数字输入 3 实现简易计算器
11 矩阵键盘识别按键方法
在键盘中按键数量较多时,为了减少I/O口的占用,通常将 按键排列成矩阵形式,一个端口(如P1口)就可以构成 4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且 线数越多,区别越明显。由此可见,在需要的键数比较多时, 采用矩阵法来做键盘是合理的。
21 实现任意数字输入
任务1 实现任意数字输入 任务描述:在Proteus软件和单片机实训板上,采用单片机P3口 连接数码管的数据端口,P2口与4×4矩阵键盘相连;实现0~F 任意数字输入并在数码管上显示。
21 实现任意数字输入
21 实现任意数字输入

c51的简易计算器-单片机课程设计

c51的简易计算器-单片机课程设计

单片机课程设计题目名称基于51单片机的简易计算器学生学院____ 信息工程学院_______专业班级信息工程(应用电子方向)12(2)班姓名______虞君权__________学号**********指导教师_ _____李优新 ___2015年1月151一、课程设计的内容本次课程设计的内容从下面两个方面任选一个:一是在学院的单片机实验平台上进行,开发一个基于单片机与PWM技术的灯光调节系统,主要开发内容为按键定义、输入与防抖动技术、PWM调节技术以及显示技术等程序设计。

二是利用51系列单片机及必要的外围芯片、输入输出等接口电路设计开发一个简易的单片机系统,在此基础上,自行设计一个单片机应用程序来实现一些实用的功能。

通过这些内容的设计、开发、安装、调试等一系列工作,熟练掌握单片机系统的开发流程与工作机理,加深对所学课程知识的理解与把握,为将来相关的研究开发工作打下坚实的基础。

二、设计内容本次实验的任务就是要以51系列单片机为核心实现一个简易计算器计算器,它的结构非常简单,外部主要由4*4矩阵键盘和一个液晶显示屏构成,内部由一块AT89C51单片机构成,通过软件编程可实现简单加减乘除。

三、方案论证经分析,计算器电路包括三个部分:显示电路、4*4键扫描电路、单片机微控制电路。

具体如下:⒈)LCD显示电路LCD1602作为一个成熟的产品,使用简单,模式固定,便于移植到各种类型的程序,但是初学者往往要注意结合LCD本身的时序图来完善初始化程序。

又以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,故采用LCD.⒉)4*4键盘扫描电路(中断式,扫描式,反转式)用户设计行列键盘接口,一般常采用 3 种方法读取键值。

一种是中断式,外两种是扫描法和反转法。

中断式:在键盘按下时产生一个外部中断通知CPU,并由中断处理程序通过不同的地址读取数据线上的状态,判断哪个案件被按下。

本实验采用中断式实现用户键盘接口。

扫描法:对键盘上的某一行送低电平,其他行为高电平,然后读取列值。

智能控制电路项目四-任务五 简易计算器设计

智能控制电路项目四-任务五 简易计算器设计
智能控制电路项目实践
学习项目
一 单片机最小应用系统构建 二 单片机开发工具的使用 三 LED流水灯设计制作 四 简易计算器的设计制作 五 里程表的设计制作 六 秒表的设计制作 七 LED电子显示屏的设计制作 八 简易仪器仪表设计制作
项目四 简易计算器设计制作
任务1 一位数码管显示
任务2 四位数码显示
P0=DSY_CODE[number%10];
for(m=0;m<t;m++) for(n=0;n<110;n++);
}
P2=0xf7; delay(2); P2=0xff; }
显示函数
任务5 简易计算器设计实现
键盘扫描函数
uchar keyscan(void) { uchar sccode, recode, a; Key_Port = 0xf0; if((Key_Port & 0xf0) != 0xf0) {delay(5); if((Key_Port & 0xf0) != 0xf0) {sccode = 0xfe; while((sccode & 0x10) != 0) {Key_Port = sccode; if((Key_Port & 0xf0) != 0xf0) {recode = Key_Port & 0xf0; a = sccode&0x0f + recode; while((Key_Port & 0xf0) != 0xf0);
}else if(keyID==10) {numID=0;
switch(keytemp) {case 12:num[0]=num[0]+num[1]; num[1]=0;break; case13:num[0]=num[0]-num[1]; num[1]=0;break; case 14:num[0]=num[0]*num[1]; num[1]=0;break; case15:num[0]=num[0]/num[1]; num[1]=0;break;} }

矩阵键盘键值的计算方法

矩阵键盘键值的计算方法

矩阵键盘键值的计算方法矩阵键盘是一种常见的输入设备,广泛应用于计算机、手机、电子器件等。

它通过将按下的键映射为一个特定的键值,实现对应用程序的输入控制。

本文将介绍矩阵键盘键值的计算方法,帮助读者了解矩阵键盘的工作原理和键值计算的方法。

一、矩阵键盘的基本原理矩阵键盘由多个行和列的按键构成,这些按键被排列成一个矩阵,行与列之间形成交叉点。

按下某个按键时,会使得对应行和列之间形成闭合电路。

矩阵键盘通过扫描行和列,检测到闭合电路,从而确定所按下的按键。

二、矩阵键盘键值计算的方法1. 扫描行和列矩阵键盘首先需要扫描行和列,以检测闭合电路。

这个过程可以通过控制行和列的输入输出来实现。

首先将所有行设置为高电平输出状态,然后逐行将其设置为低电平状态,同时检测列的输入状态。

如果某一列为低电平,则说明该行和列之间的按键闭合,即键盘检测到按键按下的动作。

2. 确定键值在检测到按键闭合后,需要进一步确定对应的键值。

这个过程需要根据键盘的布局和键盘的编码规则来实现。

一般情况下,我们可以以行列号的方式对键盘按键进行编码。

假设有N 行M 列的键盘,按下的按键位于第i 行第j 列,则键值可表示为(i-1)*M + j。

通过这种方式,我们可以根据按下的行和列号计算出对应按键的键值。

假设有一个4 行4 列的矩阵键盘,按下的按键位于第3 行第2 列。

按照上述计算方法,我们可以得到键值为(3-1)*4 + 2 = 10。

因此,按下的按键对应的键值为10。

3. 键值的应用计算出按键的键值后,我们可以将其应用于对应的应用程序中。

键值可以作为输入信号传递给应用程序,根据键值的不同,应用程序可以执行相应的操作。

例如,将键值与预先定义的按键映射表进行匹配,可以实现不同按键对应的功能,如快捷键、功能键等。

矩阵键盘键值的计算方法涉及到扫描行和列,确定键值等关键步骤。

通过扫描行和列,可以检测到按键的闭合电路;通过确定键值,可以识别所按下的按键。

这种计算方法可以广泛应用于矩阵键盘的设计和开发中,帮助我们理解矩阵键盘的工作原理和键值计算的方法,并将其应用到实际的应用程序中。

4x4矩阵键盘计算器

4x4矩阵键盘计算器

4x4矩阵键盘计算器西华大学电气信息学院智能化电子系统设计报告目录1前言 (1)1.1设计背景 ............................................................1 1.2系统设计目的和意义 .................................................. 1 2 总体方案 .............................................................. 2 2.1方案论证 (2)2.3 最终方案 ............................................................3 3单元模块设计 .......................................................... 4 3.1各单元模块功能介绍及电路设计 ........................................ 4 3.2系统元器件选择 (7)4软件设计 ..............................................................8 4.1系统程序流程 ....................................................... 8 5系统调试 ............................................................. 10 5.1 硬件调试 .. (10)5.2 软件调试 ...........................................................10 5.3 软硬件调试 ......................................................... 10 7 总结 (12)8 参考文献 .............................................................13 附录 ...................................................................14第 0 页西华大学电气信息学院智能化电子系统设计报告1前言1.1设计背景计算器是一种在日常生活中应用广泛的电子产品,无论是在超市商店,还是在办公室,或是家庭都有着它的身影。

简易计算器的设计

简易计算器的设计

辽宁工业大学单片机原理及接口技术课程设计(论文)题目:简易计算器的设计院(系):电气工程学院专业班级:自动化132班学号: 4学生姓名:**指导教师:(签字)起止时间:课程设计(论文)任务及评语院(系):电气工程学院教研室:自动化注:成绩:平时20% 论文质量60% 答辩20% 以百分制计算摘要计算器是日常生活中比较的常见的电子产品之一。

在各种智能化产品中也常常会用到计算器,而且在现代化系统中人们对计算器技术要求更加的严格和精确,因此计算器已成为生产中必不可少的设备。

本设计的硬件包括4*4键盘、单片机最小系统、液晶显示器,软件包括C语言编程和Keil uVision5。

简易计算器的设计使得计算器的技术更加的成熟、简单。

简易计算器设计是以AT89C52单片机为核心的,输入采用4*4矩阵键盘,简易计算器不仅可以进行加、减、乘、除带符号数字运算(八位整数),还可以进行负数运算和错误提示,并在液晶显示器LCD1602上显示操作结果。

计算器的出现不仅使计算数据越来越方便,而且在算术方面节省了大量的计算时间。

关键词:单片机;矩阵键盘;液晶显示;计算器目录第1章绪论................................ 错误!未定义书签。

第2章课程设计的方案...................... 错误!未定义书签。

概述............................................ 错误!未定义书签。

系统组成总体结构................................ 错误!未定义书签。

第3章硬件设计............................ 错误!未定义书签。

单片机最小系统设计.............................. 错误!未定义书签。

AT89S52单片机简介 .......................... 错误!未定义书签。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
当无按键闭合时,P1.0-P1.3与P1.4-P1.7之间开路;当有键闭合时,与闭合键相连的两条I/O口线之间短路。判断有无按键按下的方法是:第一步,置行线P1.4-P1.7为输入状态,从列线P1.0-P1.3输出高电平,读入列线数据,若某一列线为高电平,则该列线上有键闭合。合一二两步的结果,最后键盘最后组合码值可确定按键编号。但是键闭合一次只能进行一次键功能操作,因此须等到按键释放后,再进行键功能操作,否则按一次键,有可能会连续多次进行同样的键操作。
4
这次设计共涉及到了处理器、矩阵键盘、独立键盘、数码管显示等主要的模块,在软件主程序中,通过函数的调用实现相应的功能模块处理。通过num=KeyPro()函数的调用实现了将通过4*4矩阵行列反转扫描法得到的数据送入单片机,用于处理器进一步处理数据。因为该课程实践要求计数器具有2位小数的加减乘除运算,所以我们在读取矩阵键盘之后,使用语句sscanf(temp,"%f",&a),该语句的意思是将字符串数组temp中的字符以浮点数的形式输出到变量a,因此键盘输的的数据都被转换成了浮点数,所以可以很方便的实现带小数的加减乘除运算,运算所得结果也是浮点数的形式。在对输出结果输出到数码管的过程中,使用语句sprintf(temp,"%f",a);,该语句的意思是把浮点数变量a输出到字符串数组temp中,此时就可以调用显示函数对字符形式的计算结果进行输出。
5
在程序设计方法上,模块化程序设计是单片机应用中最常用的程序设计方法。设计的中心思想是把一个复杂应用程序按整体功能划分成若干相对独立的程序模块,各模块可以单独设计、编程和调试,然后组合起来。这种方法便于设计和调试,容易实现多个程序共存,但各个模块之间的连接有一定的难度。根据需要我们可以采用自上而下的程序设计方法,此方法先从主程序开始设计,然后再编制各从属程序和子程序,层层细化逐步求精,最终完成一个复杂程序的设计。这种方法比较符合人们的日常思维,缺点是一级的程序错误会对整个程序产生影响。
图3 键盘按键
4
每个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码。矩阵的行线和列线分别通过两并行接口和CPU通信。键盘的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么?还要消除按键在闭合或断开时的抖动。两个并行口中,一个输出扫描码,使按键逐行动态接地;另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。
(1)矩阵键盘将十六进制编码的数字送到单片机。
(2) 单片机扫描键盘信号并接收,对输入的键盘信号进行处理
(3) LED以动态扫描的方式移位显示每次输入的数据和最后的运算结果。实践设计的具体流程图如下图2所示:
图3 整体流程图
4
(处理器型号型号:Intel MCS-51系列8051AH)
计算器设计原理图
本次课程设计的计算器主要完成了矩阵键盘的数据或符号输入、数码管动态显示输入值、单片机处理输入的数据、数码管动态显示计算结果。在整个的设计电路中,输入输出的数据均采用字符的形式(temp[i]=num+'0'(键盘输入)sprintf(temp,"%f",a)(数码管输出));使用在单片机进行数值运算的过程中,数据使用函数sscanf(temp,"%f",&a),即将数据缓冲区的字符型数据转换成浮点型并存到a变量所对应的地址,这样之后在对变量进行加减乘除运算。因为是浮点数运算,所以结果也是浮点数,在输出的时候,小数点也能够输出,从而免去在运算结果中对小数的定位工作。
本次实践所设计的计算器的操作数为浮点型,当两个数参与运算之后,运算结果如果出现小数部分全为0的情况,根据实际应该只显示整数部分,但是实验结果是小数0全显示。但是由于时间关系我们没有调试成功。现提供一个思路:在显示小数点的时候,设置一个for循环,将小数点后的各位与'0'进行比较,如果该位等于0,设置一个新变量自加一次,之后依次比较,新变量记录小数点后0的个数。循环结束之后,将变量值与小数点后的总位数进行比较,如果相等说明小数点后全为0.之后设置一个for循环将小数点后的数据的ASCII全部赋值0。部分程序如下:
4.1
计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O口资源,因此在很多情况下都不采用这种方式。为此,我们引入了矩阵键盘的应用,采用四条I/O线作为行线,四条I/O线作为列线组成键盘。在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为4×4个。这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率,如图3所示:
《微处理器系统与接口技术》课程实践报告
计算器
班级:
学号:
学生姓名:
指导老师:
日期:2014.7.5
******电子与信息工程学院
1
2
此次课程实践题目是基于单片机简单计数器的设计,本此设计使用的是Intel公司MCS-51系列的8051AH单片机。设计的计算器可以实现2位小数的加、减、乘、除运算以及整数的乘方运算,其中用4*4矩阵键盘来输入待参与运算的数据和运算符;八位数码管动态显示输入待参与运算的数据以及运算后产生的结果,每个硬件模块的调用过程中涉及到了函数入口及出口参数说明,函数调用关系描述等。
按照上面的思想,在进行小数运算时,输入输出小数并不能正常显示。后来通过和组员一起仔细研究,发现数码管段码中并没有小数点,所以我们在输入数据时将每一个输入的与小数点的ASCII码进行比较(if(num=='.')),一旦条件成立,将小数点存入数据缓冲temp[8]数组中,同时也将小数点的ASCII码存入显示缓冲区TempData[8]中(定义小数点的段码0x98)。这样之后关于小数点显示问解决题。
3
计算器以MCS-51系列的8051AH单片机作为整个系统的控制核心,应用其强大的I/O功能和计算速度,构成整个计算器。通过矩阵键盘输入运算数据和符号,送入单片机进行数据处理。经单片机运算后控制LED数码管的输出。整体框图如图1所示:
图3 整体框图
本系统硬件主要由矩阵键盘、独立键盘I/O输入输出、数码管显示等主要部分组成。各模块的主要功能如下:
相关文档
最新文档