4X4按键实现计算器功能

合集下载

4x4键盘程序

4x4键盘程序
数码管采用共阴数码管,接p1口,接口顺序如下:
a--p1.0
b--p1.1
c--p1.2
d--p1.3
e--p1.4
f--p1.5
g--p1.6
cp--p1.7
#include<reg51.h>
#defineucharunsigned char
#defineuintunsignedint
//sbitkey1=P3^4;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb: num=9;break;
case 0xdb: num=10;break;
case 0xbb: num=11;break;
case 0x7b: num=12;break;
default: break;
while(temp!=0xf0)
{
delay(5);//消抖
temp=P3;//再次读P3口的数据
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7: num=13;break;
case 0xd7: num=14;break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P1=table[num-1];
P3=0xf7;//将第四行电平拉低
temp=P3;//扫面P3口的数据,送给temp

基于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功能和计算速度,构成整个计算器。

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

简易计算器

简易计算器

做的一个简易计算器,4X4键盘,1602液晶,一个最小系统,原理图就不给了,看程序也应该知道怎么接线除加减乘除外,有sin,tan,cos,N!,。

等10个附加功能,使用自己摸索。

开始复制了。

对了,是拿别的程序改得,下面是包涵的几个c文件/*-----------------------------------------------名称:LCD1602论坛:编写:shifang日期:2009.5修改:无内容:引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK------------------------------------------------*/#include "1602.h"#include "delay.h"#define CHECK_BUSYsbit RS = P1^0; //定义端口sbit RW = P1^1;sbit EN = P2^5;#define RS_CLR RS=0#define RS_SET RS=1#define RW_CLR RW=0#define RW_SET RW=1#define EN_CLR EN=0#define EN_SET EN=1#define DataPort P0/*------------------------------------------------判忙函数------------------------------------------------*/bit LCD_Check_Busy(void){#ifdef CHECK_BUSYDataPort= 0xFF;RS_CLR;RW_SET;EN_CLR;_nop_();EN_SET;return (bit)(DataPort & 0x80);#elsereturn 0;#endif}/*------------------------------------------------写入命令函数------------------------------------------------*/ void LCD_Write_Com(unsigned char com) {while(LCD_Check_Busy()); //忙则等待RS_CLR;RW_CLR;EN_SET;DataPort= com;_nop_();EN_CLR;}/*------------------------------------------------写入数据函数------------------------------------------------*/ void LCD_Write_Data(unsigned char Data) {while(LCD_Check_Busy()); //忙则等待RS_SET;RW_CLR;EN_SET;DataPort= Data;_nop_();EN_CLR;}/*------------------------------------------------清屏函数------------------------------------------------*/ void LCD_Clear(void){LCD_Write_Com(0x01);DelayMs(5);}/*------------------------------------------------写入字符串函数------------------------------------------------*/void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) {while (*s){LCD_Write_Char(x,y,*s);s ++; x++;}}/*------------------------------------------------写入字符函数------------------------------------------------*/void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) {if (y == 0){LCD_Write_Com(0x80 + x);}else{LCD_Write_Com(0xC0 + x);}LCD_Write_Data( Data);}/*------------------------------------------------初始化函数------------------------------------------------*/void LCD_Init(void){LCD_Write_Com(0x38); /*显示模式设置*/DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);LCD_Write_Com(0x08); /*显示关闭*/LCD_Write_Com(0x01); /*显示清屏*/LCD_Write_Com(0x06); /*显示光标移动设置*/DelayMs(5);LCD_Write_Com(0x0C); /*显示开及光标设置*/}延时程序的#include "delay.h"/*------------------------------------------------uS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned char t){while(--t);}/*------------------------------------------------mS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}按键扫描的/*-----------------------------------------------名称:矩阵键盘论坛:编写:shifang日期:2009.5修改:无内容:------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include"keyboard.h"#include"delay.h"#define KeyPort P3/*------------------------------------------------按键扫描函数,返回扫描键值------------------------------------------------*/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 0x7d:return '2';break;//1case 0x7b:return '3';break;//2case 0x77:return '+';break;//3case 0xbe:return '4';break;//4case 0xbd:return '5';break;//5case 0xbb:return '6';break;//6case 0xb7:return '-';break;//7case 0xde:return '7';break;//8case 0xdd:return '8';break;//9case 0xdb:return '9';break;//acase 0xd7:return 'x';break;//bcase 0xee:return '0';break;//ccase 0xed:return '.';break;//dcase 0xeb:return '=';break;//ecase 0xe7:return '/';break;//fdefault:return 0xff;break;}}主程序/*-----------------------------------------------名称:液晶显示计算器论坛:编写:shifang日期:2009.5修改:无内容:由于单片机浮点数限制,可以计算6位数字运算,大于这个长度,用科学计数法表示小数位精度后6位,大于6位按四舍五入------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include<stdio.h>#include"1602.h"#include"delay.h"#include"keyboard.h"#include"math.h"unsigned char num,ii,pp,fuhao,i;unsigned char temp[10]; //最大输入16个unsigned char shu[6];unsigned char shu1[6];unsigned char mima[5]={'1','2','3','4','5'};bit firstflag;double n=0,m=0;unsigned char s;bit K,G; //K是两种运算的变换标志位,G是sin元算和加减运算的转换标志bit flag1; //需输入两个数的标志位bit flag2; //输入第二个数的标志位void fuyunsuan (void);void suanshu (void);/*------------------------------------------------阶乘------------------------------------------------*/double jiecheng (unsigned int x )//求阶乘{unsigned int j;double p=1;for (j=1 ; j<=x ; j++ ){p=p*j;}return p ;}/*------------------------------------------------阶和------------------------------------------------*/unsigned int jiehe (float x,float y )//求阶和{unsigned int j,p=0;for (j=x ; j<=y ; j++ ){p=p+j;}return p ;}/*------------------------------------------------输出SIN,COS,TAN....符号并计算------------------------------------------------*/void fuyunsuan (void)//{if(('+'==num)|| ('-'==num) || ('x'==num)|| ('/'==num) || ('.'==num))//判断第一个是否为符号{K=~K; //取反是为了,没按一次键,转换一次运算LCD_Clear(); //清屏if(num=='+') //‘+’复用的功能改变,下面的同理{if(K==0){LCD_Write_String(0,0,"SIN :"); fuhao=1;flag1=0;}if(K==1){LCD_Write_String(0,0,"COS :"); fuhao=2;flag1=0;}}if(num=='-'){if(K==0){LCD_Write_String(0,0,"TAN :"); fuhao=3;flag1=0;}if(K==1){LCD_Write_String(0,0,"LOG :"); fuhao=4; flag1=1;}}if(num=='x'){if(K==0){LCD_Write_String(0,0,"N^M :"); fuhao=5;flag1=1;}if(K==1){LCD_Write_String(0,0,"root:"); fuhao=6;flag1=0;}}if(num=='/'){if(K==0){LCD_Write_String(0,0,"E^ :"); fuhao=7;flag1=0;}if(K==1)LCD_Write_String(0,0,"LG E:");fuhao=8;flag1=0;}}if(num=='.'){if(K==0){LCD_Write_String(0,0,"N+ :");fuhao=9;flag1=1;}if(K==1){LCD_Write_String(0,0,"N! :");fuhao=10;flag1=0;}}LCD_Write_Com(0x80 + 5);//为了输入的数据定好位置}else{if('='!=num) //判定是否为‘=‘号,不是就取数据,是就进行运算{if(flag2!=1) //取第一个数据{shu[ii]=num-0x30;LCD_Write_Data(num);num=0xff;ii++;}else //取第二个数据,前提的是要输入第二个,并且按过一次等号{shu1[pp]=num-0x30;LCD_Write_Data(num);num=0xff;pp++;}}else //这边的else已经是为=号的情况了if(flag1==1&&shu[0]!=0) //这是判定第二次=号的功能的,flag=1就是要输入第二个数,并且已经输入第一个数{ //这里让flag2=1,看上面,是不是就可以去第二个数了flag2=1;flag1=0;if(fuhao==4)LCD_Write_Data('-');if(fuhao==5)LCD_Write_Data('^');if(fuhao==9)LCD_Write_Data('~');}else //这边当然是搞结果的啦{for(s=0;s<ii;s++) //n=n+shu[s]*pow(10,ii-s-1); //把前面输入的数据,处理一下,赋值给nfor(s=0;s<pp;s++) //m=m+shu1[s]*pow(10,pp-s-1); //把输入的第二组数据给mfor(ii=0;ii<6;ii++) //赋值完成后把缓冲区清零,防止下次输入影响结果shu[ii]=0;for(pp=0;pp<6;pp++) //赋值完成后把缓冲区清零,防止下次输入影响结果shu[pp]=0;ii=0;pp=0;switch(fuhao) //通过符号的值运算,前面的fuhao终于有用了吧{case 1 :n=sin((3.1415926/180)*n);break;case 2 :n=cos((3.1415926/180)*n);break;case 3 :n=tan((3.1415926/180)*n);break;case 4 :n=log(m) / log(n);break;case 5 :n=pow(n,m);break;case 6 :n=sqrt(n);break;case 7 :n=exp(n);break;case 8 :n=log(n);break;case 9 :n=jiehe(n,m);break;case 10 :n=jiecheng(n);break;default:break;}for(s=0;s<10;s++) //赋值完成后把缓冲区清零,防止下次输入影响结果temp[s]=0;LCD_Write_Char(0,1,num);sprintf(temp,"%g",n); //输出浮点型,无用的0不输出LCD_Write_String(1,1,temp);//显示到液晶屏for(s=0;s<16;s++) //赋值完成后把缓冲区清零,防止下次输入影响结果temp[s]=0;flag1=0;flag2=0; n=0;m=0;G=0; //输出完之后,以后还要混的,清理现场先LCD_Write_Com(0x0C);}}}}/*------------------------------------------------加减乘除------------------------------------------------*/void suanshu (void){if(i==0) //输入是第一个字符的时候需要把改行清空,方便观看LCD_Clear();if(('+'==num)|| (i==16) || ('-'==num) || ('x'==num)|| ('/'==num) || ('='==num))//输入数字最大值16,输入符号表示输入结束{i=0; //计数器复位if(firstflag==0) //如果是输入的第一个数据,赋值给a,并把标志位置1,到下一个数据输入时可以跳转赋值给b{sscanf(temp,"%f",&n);firstflag=1;}elsesscanf(temp,"%f",&m);for(s=0;s<16;s++) //赋值完成后把缓冲区清零,防止下次输入影响结果temp[s]=0;LCD_Write_Char(0,1,num);///////////////////////if(num!='=') //判断当前符号位并做相应处理fuhao=num; //如果不是等号记下标志位else{firstflag=0; //检测到输入=号,判断上次读入的符合switch(fuhao){case '+':n=n+m;break;case '-':n=n-m;break;case 'x':n=n*m;break;case '/':n=n/m;break;default:break;}sprintf(temp,"%g",n); //输出浮点型,无用的0不输出LCD_Write_String(1,1,temp);//显示到液晶屏fuhao=0;n=m=0; G=0; //用完后所有数据清零for(s=0;s<16;s++)temp[s]=0;shu[0]=0;shu1[0]=0;LCD_Write_Com(0x0C);}}else if(i<16){if((1==i)&& (temp[0]=='0') )//如果第一个字符是0,判读第二个字符{if(num=='.') //如果是小数点则正常输入,光标位置加1{temp[1]='.';LCD_Write_Char(1,0,num);//输出数据i++;} //这里没有判断连续按小数点,如0.0.0else{temp[0]=num; //如果是1-9数字,说明0没有用,则直接替换第一位0LCD_Write_Char(0,0,num);//输出数据LCD_Write_Com(0x0e);}}else{temp[i]=num;LCD_Write_Char(i,0,num);//输出数据i++; //输入数值累加}}}/*------------------------------------------------输入密码------------------------------------------------*/void mimashuru (void){while(K){for(i=0;i<5;){num=KeyPro(); //扫描键盘if(num!=0xff){shu[i]=num;LCD_Write_Data('*');i++;}}for(i=0;i<5;i++){if(shu[i]==mima[i])pp++;}if(pp==5){K=0;}else{LCD_Clear();pp=0;LCD_Write_String(0,0," NO! NO! NO!"); //写入第一行信息,主循环中不再更改此信息,所以在while之前写入LCD_Write_String(0,1,"Password:"); //写入第二行信息,提示输入密码}}for(s=0;s<25;s++)//延时5sDelayMs(200);LCD_Clear();LCD_Write_Com(0x0C);LCD_Write_String(0,0," Well done"); //写入第一行信息,主循环中不再更改此信息,所以在while之前写入i=0;pp=0;shu[0]=0;for(s=0;s<25;s++)//延时5sDelayMs(200);LCD_Clear();}/*------------------------------------------------主程序------------------------------------------------*/main(){K=1;ii=0;pp=0;flag1=0;flag2=0;i=0;G=0;LCD_Init(); //初始化液晶屏DelayMs(10); //延时用于稳定,可以去掉LCD_Clear(); //清屏LCD_Write_String(0,0,"Welcome2 my work"); //写入第一行信息,主循环中不再更改此信息,所以在while之前写入LCD_Write_String(0,1,"HYJ Productions"); //写入第二行信息,提示输入密码for(s=0;s<75;s++)//延时5sDelayMs(200);LCD_Clear();LCD_Write_String(0,0,"Please enter your"); //写入第一行信息,主循环中不再更改此信息,所以在while之前写入LCD_Write_String(0,1,"Password:"); //写入第二行信息,提示输入密码LCD_Write_Com(0x0f);//光标开,光标闪烁开mimashuru();LCD_Write_Com(0x0f);//光标开,光标闪烁开while (1) //主循环{num=KeyPro(); //扫描键盘if(num!=0xff){LCD_Write_Com(0x0f);//光标开,光标闪烁开if((('+'==num)||('-'==num) || ('x'==num)|| ('/'==num) || ('.'==num))&&shu[0]==0&&shu1[0]==0&&temp[0]==0)G=1; //判定第一个按键是否为功能键if(G==1){fuyunsuan ();}else{suanshu();}}}}结束语,初学者的劳动成果啊,不容易啊,我试过,程序没问题,就是有些小瑕疵,不过懒得弄了,这程序也很容易仿真,那I/O自己改吧,得。

4X4矩阵按键原理和代码解析(老伙计)

4X4矩阵按键原理和代码解析(老伙计)

4X4 矩阵按键原理和代码解析目录1 键盘概述 (1)2 矩阵按键工作原理 (2)3、4X4 矩阵按键代码解析 (2)1 键盘概述键盘分编码键盘和非编码键盘。

键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘。

而靠软件编程来识别的称为非编码键盘。

在一般嵌入式应用中,用的最多的是非编码键盘,也有用到编码键盘的。

非编码键盘又分为独立键盘和行列式(又称为矩阵式)键盘。

所谓独立式键盘,即嵌入式CPU (或称MCU)的一个GPIO 口对应一个按键输入,这个输入值的高低状态就是键值。

矩阵键盘用于采集键值的GPIO 是复用的,一般分为行和列采集,例如4*4 矩阵键盘就只需要行列各4 个按键就可以了,矩阵键盘的控制较独立键盘要复杂得多,本实验未涉及,所以对其原理不做详细介绍。

独立按键一般有2 组管脚,虽然市面上我们常常看到有4个管脚的按键,但它们一般是两两导通的,这2 组管脚在按键未被按下时是断开的,在按键被按下时则是导通的。

基于此原理,我们一般会把按键的一个管脚接地,另一个管脚上拉到VCC,并且也连接到GPIO。

这样,在按键未被按下时,GPIO 的连接状态为上拉到VCC,则键值为1;按键被按下时,GPIO虽然还是上拉到VCC,但同时被导通的另一个管脚拉到地了,所以它的键值实际上是0。

我们的开发板上有一组4*4 矩阵键盘。

通过P12 的PIN1-2 短接时,其实S1/S2/S3/S4 可以作为独立按键使用,它的一端接地,另一端在上拉的同时连接到FPGA 的I/O 口。

当I/O 口的电平为高(1)时,说明按键没有被按下,当I/O口的电平为低(0)时,说明按键被按下了。

我们不再只局限于独立按键这么low 的应用了,这里我们将要把所有16 个按键都使用起来,实现我们真正的矩阵按键功能。

要做矩阵按键,那么大家首先要确认把自己的SF-CY4 开发板上插座P12 的PIN2-3用跳线帽短接。

4X4按键实现计算器功能

4X4按键实现计算器功能

;4X4 按键实现计算器功能; 当按0-9 时显示数值;当按A-F 时将其除以10 ;如商为0 就是0-9 数字输入;如商为 1 就是+,-,*,/,= ;跟据余数转到相应的功能处; 因为8 位数最取值为255 ;可扩展到16 位或32 位; ok;硬件连接POUT EQU P2KPIN EQU P1PDIG1 EQU P3.0VAL DATA 30HKID DATA 31HKTMP DATA 32HPDIG EQU P3NO EQU 4 ;N 位要显示的;内部使用的变量DIG DATA 33H;DID DATA 34HKFH DATA 35HDAT1 DATA 36HDAT2 DATA 37HBUF DATA 38HMTM EQU 1000MTH EQU HIGH(65536-MTM) MTL EQU LOW(65536-MTM)MSYS BIT 2FH.0KEFL BIT 20H.0・**************************;主调度程序;每1MS 中断一次,所有程序都在期间执行;主程序调度标志位:MSYSORG 0000HSJMP MAINORG 0BHSJMP MTM030HORGMAIN:ACALL MINITMLP:JNB MSYS,$CLR MSYSACALL KEYSACALL DISPSJMPMLPMINIT:;用户变量初始化CLR MSYSMOV R0,#30HMOV R2,#16CLR AMILP:MOV @R0,AINC R0DJNZ R2,MILPMOV DIG,#0FEHCLR KEFL; 系统变量初始化,并开启定时器0 MOV SP,#60HMOV IE,#82HMOV TMOD,#01HMOV TH0,#MTHMOV TL0,#MTLSETBTR0RET;定时器0 中断程序,置系统标志为 1 MTM0:MOV TH0,#MTHMOV TL0,#MTLMSYSSETBRETI;显示功能程序・****************・************************ J ・*************************J;按键扫描程序 ;;模块应用变量;硬件连接端口 :KPIN;返回按键值 :VAL;按键处理应用功能程序 :KEYPFUN・***********************J;内部使用变量定义 :KID=0,KTMP=0・**********************JKEYS:MOV DPTR,#KJMP MOV A,KIDRL AJMP @A+DPTRKJMP:AJMP KEYENAJMP KEYDELAJMP KEYSCANAJMP KEYUP MOVA,#BUF ADDA,DID MOVR0,A MOVA,@R0 MOVDPTR,#TAB MOVCA,@A+DPTR CPLA MOVPOUT,A MOVA,DIG MOVPDIG,A RRA MOVDIG,A INCDID MOVA,DID CJNEA,#NO,DSEXT MOVDID,#0 MOVDIG,#07FH PDIG,#0FFH RET DISP:MOVDSEXT:AJMP KEYFUNMOV KID,#0RETKS: MOV KPIN,#0FHNOPNOPMOV A,KPINANL A,#0FHXRL A,#0FHRETKEYEN:ACALL KSJZ KENEXTMOV KTMP,#0INC KIDKENEXT: RETKEYDEL:INC KTMPMOV A,KTMPCJNE A,#30,KDEXTMOV KTMP,#0INC KIDKDEXT: RET・*******************************;KPIN: D7 - D0 =0EFH; D7 D6 D5 D4 ; D0 3 2 1 0 ; D1 7 6 5 4 ; D2 B A 9 8 ; D3 F E D CKEYSCAN:ACALL KSJZ KSCEXTMOV R2,#0EFHMOV R3,#0KS1:MOVKPIN,R2NOPNOPJB KPIN.0,KSL1MOV A,#0SJMP KVALKSL1:JB KPIN.1,KSL2MOV A,#4SJMP KVALKSL2:JB KPIN.2,KSL3MOV A,#8SJMP KVALKSL3:JB KPIN.3,KS2MOV A,#12 KVAL:ADD A,R3MOV VAL,AINC KIDRETKSCEXT:MOV KID,#0RETKS2:MOV A,R2JNB ACC.7,KSCEXTRL AINC R3MOV R2,ASJMP KS1KEYUP:ACALL KSJNZ KUPEXTINC KIDKUPEXT: RET・*************************・J J KEYFUN:MOV KID,#0MOV A,VALMOV B,#10DIV ABJZ KNUMMOV A,BRL AMOV DPTR,#KFUNJMP KFUN:AJMPAJMPAJMPAJMPAJMPAJMPMOVRET @A+DPTR KAFUN KBFUN KCFUN KDFUN KEFUN KFFUNVAL,#0KNUM:MOV R0,#BUFMOV R2,#4 KNLP:MOV A,@R0MOV R4,AMOV A,BMOV @R0,AINC R0MOV A,@R0MOV B,AMOV A,R4MOV @R0,AINC R0DJNZ R2,KNLPSETB KEFLRETDTOH:MOV R1,#BUFMOV R2,#3MOV R5,#0MOV R4,#1 DHLP:MOV A,@R1MOV B,R4MUL ABADD A,R5MOV R5,AMOV A,R4MOV B,#10MUL ABMOV R4,AINC R1DJNZ R2,DHLPRETKAFUN:MOV KFH,#1 CLBUF:ACALL DTOHMOV DAT1,R5MOV R0,#BUFMOV R2,#3CLR ACLBUF1:MOV @R0,AINC R0DJNZ R2,CLBUF1CLR KEFLRET KBFUN:MOV KFH,#2SJMP CLBUFKCFUN:MOV KFH,#3SJMP CLBUFKDFUN:MOV KFH,#4CLBUFSJMPKEFUN:MOV R0,#35HMOV R6,#9CLR AKELP:MOV @R0,AINC R0DJNZ R6,KELPKEFLCLRRETKFFUN:JNB KEFL,KFEXTCLR KEFLACALL DTOHMOV DAT2,R5ACALL CLRBUFMOV A,KFHRL AMOV DPTR,#KEQUJMP @A+DPTR KEQU:AJMP KNULLAJMP KADDAJMP KSUBAJMP KMULAJMP MOV KDIV fKFH,#0KFEXT: RETKNULL:NOPRETHTOD:MOV R0,#BUF+2MOV B,#100DIV ABMOV @R0,ADEC R0MOV A,BMOV B,#10DIV ABMOV @R0,ADEC R0MOV A,BMOV @R0,ARETKADD:MOV A,DA T1ADD A,DA T2MOV DAT1,AACALL HTODRETKSUB:MOV A,DA T1CLR CSUBB A,DAT2JC CLRBUFACALL HTODRETCLRBUF:MOV R0,#BUFMOV R2,#3CLR ACLB:MOV @R0,AINC R0DJNZ R2,CLBRETKMUL:MOV A,DA T1MOV B,DAT2MUL ABCLR CSUBB A,#255JC CLRBUFACALLRETHTODKDIV:MOV A,DA T2JZ CLRBUFMOV A,DA T1CLR CSUBB A,DAT2JC CLRBUFMOV A,DA T1MOV B,DAT2DIV ABACALL RET HTOD・******************************JTAB: DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0BFH END。

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 课题概述随着当今时代的电子领域的发展,尤其是自动化的控制领域,传统的分立元件或数字逻辑电路构成的控制系统正被智能化的单片机所取代。

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数码管显示工作方式。

单片机实践简易计算器实验报告

单片机实践简易计算器实验报告

单片机实践简易计算器实验报告本次实验的目的是通过单片机实现一个简易计算器,实现加减乘除四则运算。

在实验过程中,我们使用了STC89C52单片机,通过编写程序实现计算器的功能。

实验步骤:1. 确定硬件电路连接我们需要确定硬件电路连接。

本次实验使用的是STC89C52单片机,需要将其与LCD1602液晶屏、4x4矩阵键盘、蜂鸣器等硬件连接。

具体连接方式如下:STC89C52单片机:P0口:连接LCD1602液晶屏的数据线D0-D7P1口:连接LCD1602液晶屏的控制线RS、RW、EP2口:连接4x4矩阵键盘的行线R1-R4P3口:连接4x4矩阵键盘的列线C1-C4P4口:连接蜂鸣器2. 编写程序接下来,我们需要编写程序实现计算器的功能。

程序主要分为以下几个部分:(1)LCD1602液晶屏初始化(2)4x4矩阵键盘扫描(3)计算器功能实现(4)LCD1602液晶屏显示结果3. 调试程序编写完程序后,我们需要进行调试。

在调试过程中,我们需要注意以下几点:(1)检查硬件连接是否正确(2)检查程序是否有语法错误(3)检查程序是否能够正常运行4. 实验结果经过调试,我们成功实现了一个简易计算器。

在使用过程中,用户可以通过4x4矩阵键盘输入数字和运算符,计算器会自动进行计算,并在LCD1602液晶屏上显示结果。

同时,计算器还具有清零、退格等功能,方便用户进行操作。

总结:通过本次实验,我们学习了单片机的基本原理和编程方法,掌握了如何使用单片机实现一个简易计算器。

同时,我们还学习了如何进行硬件电路连接和程序调试,提高了我们的实践能力和动手能力。

4x4矩阵键盘工作原理

4x4矩阵键盘工作原理

4x4矩阵键盘工作原理
4x4矩阵键盘是一种常见的输入设备,它由16个按键组成,通
常用于嵌入式系统中。

其工作原理是利用矩阵的方式将16个按键映
射到单一的输入口上,从而减少了引脚的数量。

在4x4矩阵键盘中,按键排列成4行4列的矩阵形式。

每一行的按键都共用一根引脚,每一列的按键也共用一根引脚。

当按下某一个按键时,会在对应的行和列上形成短暂的电路通路,此时矩阵键盘会将这个按键的行和列位置保存下来,通过扫描算法得出该按键的编号,然后将其传输到处理器中进行处理。

具体来说,矩阵键盘的扫描算法通常采用轮询的方式进行。

处理器按照一定的时间间隔扫描矩阵键盘的每一行和每一列,从而得出哪个按键被按下了。

同时,为了防止按键的抖动影响输入的精度,还需要进行消抖处理。

总的来说,4x4矩阵键盘工作原理相对简单,但需要合理设计矩阵排布和扫描算法,以确保输入的准确性和稳定性。

- 1 -。

51单片机实现的简易计算器

51单片机实现的简易计算器

51单片机实现的简易计算器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) / 1112.3+5.4=/0.1+ 77 等号后直接按 / ,则将前面的运算结果作为第一个操作数1/0= E 错误显示 9. 不足使用3字节的浮点数表示,不可避免的带来了数表示的不精确,加上有效数字比较少,因此计算结果很容易产生误差,尤其是进行连续多次运算后,结果和精度较高的科学计算器的误差会很快达到0.01以上,当然这个差距和所测试的用例也有关系,4位有效数字导致了数字123456只能表示为123400,最后两位有效数字被摒弃了。

数电实验简易计算器

数电实验简易计算器

北京邮电大学数电综合实验报告题目:简易计算器学院:信息与通信工程学院班级:学号:班内序号:姓名:数字电路综合实验报告简易计算器一、实验课题及任务要求设计并实现一个简易计算器。

基本要求:1.利用4X4 小键盘作为输入,包括:数字键0-9,清除键,等号键及‘+’‘-’‘*’运算符号键;2.实现输入为99 以内自然数的加、减、乘运算;3.能够实现多次连续计算(无优先级,从左到右计算结果),如:12+34×2-78=14;4.最大结果为99999(五位),溢出报警;5.用数码管显示输入的数字和结果,最左侧数码管用来表示数字的正负,其他五位数码管表示结果;结果的绝对值大于99999时,数码管显示‘Error’。

提高要求:1.实现输入为9999 以内自然数的加、减法;2.除法运算,不能除尽时小数保留1 位有效数字;3.能够区分运算优先级(先乘除,后加减),如:12+34×2-78=2 ;4.自拟其他功能。

二、系统设计2.1系统总体框图2.2逻辑流程图2.3MDS图2.4分块说明程序主要分为6个模块:分频器模块,键盘扫描模块,防抖模块,控制模块,数码管模块,报警模块。

VHDL文件devider包括分频器模块,keyboard包括键盘扫描模块,datain 包括防抖模块,控制模块,数码管模块,报警模块。

1.分频器模块系统时钟是50MHz,利用分频器得到25赫兹的时钟用于键盘扫描;100赫兹的时钟用于键盘去抖;1000赫兹的时钟用于数码管显示。

2.键盘扫描模块本模块主要完成是4×4键盘扫描,然后获取其键值,并对其进行编码,从而进行按键的识别。

键盘扫描的实现过程如下:对于4×4键盘,连接为4行、4列,因此要识别按键,只需要知道是哪一行和哪一列即可。

为了完成这一识别过程,在时钟的上升沿输出列扫描信号其中一列输出低电平,另外三列输出高电平;在时钟的下降沿读入行值,当四行全为1时,表明无键按下;若某一列的行值为0,表示该行有键被按下。

4×4矩阵键盘的键值计算及编程

4×4矩阵键盘的键值计算及编程
低。
.j
2 读取I/O口值的练习
❖ 一般都是自高到低读出一个端口各脚电平 ,得到8位二进制 数,再将8位二进制转换成2位十六进数。
P1口值=P1.7 P1.6 P1.5 P1.4P1.3 P1.2 P1.1 P1.0 =1101 1111=0x df P3口值= P3.7 P3.6 P3.5 P3.4P3.3 P3.2 P3.1 P3.0 =1111 1010=0xfa
(4行,1列) 77 (4行,2列) 7b (4行,3列) 7d (4行,4列) 7e
.j
3 键盘的键值
总结
4×4矩阵键盘的键值 共有16个,计算键值时总是: 先找出行线值,再找出列线值,最后绘出矩阵键盘的键
值。
.j
4 键盘扫描编程__线反转法
/************键盘扫子描函数*******************/ char keyscan(void) //键盘扫描函数,键盘使用P2口 {
位置
(1行,1列) (1行,2列) (1行,3列) (1行,4列) (2行,1列) (2行,2列) (2行,3列) (2行,4列)
键值
e0+0e=ee d0+0e=de b0+0e=be 70+0e=7e
e0+0d=ed d0+0d=dd b0+0d=bd 70+0d=7d
(3行,1列) (3行,2列) (3行,3列) (3行,4列)
e0+0b=eb
d0+0b=db b0+0b=bb 70+0b=7b
(4行,1列) (4行,2列) (4行,3列) (4行,4列)
e0+07=e7
d0+07=d7 b0+07=b7 70+07=77

单片机4X4键盘计算器课程设计

单片机4X4键盘计算器课程设计

《单片机课程设计报告》教学院:专业班级:学号:学生:指导教师:时间:地点:单片机课程设计任务书一、课题名称单片机课程设计二、设计目的为了进一步巩固学习的理论知识,增强学生对所学知识的实际应用能力和运用所学的知识解决实际问题的能力,开始为期两周的单片机课程设计。

通过实训使学生在巩固所学知识的基础之上具有初步的单片机系统设计与应用能力。

三、设计容设计基于51单片机的简易计算器系统电路,并以该电路为基础进行编程,要求能够实现0-99之间的数进行加、减、乘、除运算的功能。

四、设计要求1、设计简易计算器,要求能对0-99之间的数进行加、减、乘、除运算。

2、用4×4的键盘作为输入设备。

3、用LED或LCD进行显示。

4、编写无符号数加、减、乘、除运算、输入和显示的程序。

5、对系统的进行综合和调试,使其具有对0-99之间的数进行加、减、乘、除运算的功能。

6、编写课程设计的总结六、设计报告课程设计报告的基本容至少包括封面、正文、附录三部分。

课程设计报告要求统一格式,字体工整规。

1、封面封面包括“《单片机课程设计》课程设计报告”、班级、、学号以及完成日期等。

2、正文正文是实践设计报告的主体,具体由以下几部分组成:(1)课程设计题目;(2)课程设计任务与要求;(3)设计过程(包括设计方案、设计原理、创新点以及采用的新技术等);(4)方案的比较与论证;(5)硬件电路设计,各个模块的设计与器件的选择;(6)软件程序的设计与调试;(7)课程设计总结(包括自己的收获与体会;遇到的问题和解决的方法;技术实现技巧和创新点;作品存在的问题和改进设想等);3.附录附录1:系统设计原理图附录2:系统硬件元器件清单附录3:系统的程序七、考核方式与成绩评定办法格(60分~69分)、60分以下为不及格。

八、参考书目[1] 朝青.单片机原理及接口技术(简明修订版).:航空航天大学,1998[2] 广弟.单片机基础[M].:航空航天大学,1994[3] 阎石.数字电子技术基础(第三版). :高等教育,1989[4] 廖常初.现场总线概述[J].电工技术,1999.[5] 徐仁贵等编著.《单片微型计算机应用技术》.:机械工业.2001年2月第1版[6] 毅刚等编著.《单片机原理及应用》. :高等教育.2004年1月第1版一、课程设计任务与要求设计基于51单片机的简易计算器系统电路,并以该电路为基础进行编程,要求能够实现0-99之间的数进行加、减、乘、除运算的功能,并要求如下:1、设计简易计算器,要求能对0-99之间的数进行加、减、乘、除运算;2、用4×4的键盘作为输入设备;3、用LED或LCD进行显示;4、使用C语言编写无符号数加、减、乘、除运算、输入和显示的程序;5、对系统的进行综合和调试,使其具有对0-99之间的数进行加、减、乘、除运算的功能,还具有清零功能等;6、编写课程设计的总结。

矩阵按键原理

矩阵按键原理

矩阵按键原理
矩阵按键是一种常用的电子组件,它由一组排列成矩阵形式的按键单元组成。

每个按键单元都是一个触点开关,可以通过按下来触发电路连接或断开。

矩阵按键的主要原理是利用行列交叉的结构来实现多个按键的复用,从而减少引脚数量和电路复杂度。

在一个简单的4x4矩阵按键中,有4个行引脚和4个列引脚。

通过控制行引脚和列引脚的状态,就可以检测到每个按键的按下情况。

当某个按键被按下时,它所在的行和列相交的引脚之间形成了电路连接,可以通过检测到的电压信号来判断按键的按下状态。

为了减少干扰和误触发,通常还会在电路中加入外部电阻和电容来对信号进行滤波和去抖动处理。

这些电阻和电容的选择和连接方式可以根据具体的应用需求进行调整。

矩阵按键在很多电子设备中得到了广泛的应用,如计算器、远程控制器、键盘等。

它的设计简单、成本低廉,并且可以同时检测多个按键的按下情况,因此在多功能控制面板等场景下表现出了良好的性能。

嵌入式实验报告-简易计算器

嵌入式实验报告-简易计算器

一目的及要求1实验目的根据计算器的原理设计一个具有加减乘除功能的简易计算器。

2实验要求(1)数字和结果用数码管显示。

(2)数字、+-*/、=、C用4X4键盘实现。

(3)计算结果正确,有出错提示。

二实验原理框图基本工作原理:本设计利用数码管和4*4矩阵式键盘实现了简易计算器的功能。

接通电源,数码管显示全0。

计算时,通过键盘输入需要计算的数字,该数字显示在数码管上,当键入等号时,计算结果显示在数码管上。

进行第二次运算时,按C键清除键盘结果。

当计算出现错误时,LED灯亮报警。

当计算结果超出数码管显示出现溢出时,报警电路也会报警。

报警输出为--。

四系统软件设计1.数据输入模块原理:通过4*4矩阵模块输入数字,在数码管上显示出来。

2.运算模块原理:四种运算同步运行,通过按键加、减、乘、除选择输出对应的计算结果,当按键等号时,将所得结果反馈给运算模块输入端。

3.输出模块原理:通过按键等号来控制显示运算对象还是运算结果,当等号按下时,输出计算结果,否则显示当前输入的数据。

当输出结果溢出是LED亮四次,同时数码管显示都为--。

五实验调试首先按清零键清零。

然后进行调试。

输入数据2,再按乘法键,输入第二个数字6,按等号键,数码管显示12;再按除法键,输入第二个数据3,按等号键,数码管显示4;再按加法键,输入第三个数据7,依次按等号键,数码管显示11;按减法键,输入第四个数据99,依次按等号键,数码管显示-88。

若输入超出显示管的最大值或者超出数码管的位数,结果溢出,LED亮报警,同时数码管显示都为--。

如输入999999加上2 ,结果就溢出,LED灯亮四次报警。

六程序#include "LPC2468.h" /* LPC24xx definitions */ #include "type.h"#include "irq.h"#include "target.h"#include "timer.h"#include "fio.h"#include "keyboard.h"#include "SPI.h"extern BYTE seg_buf[50]; // LPC2468开发板使用此数组的0~5显示六个数码管;LPC2478板使用1~6BYTE seg_copy1[7];BYTE seg_copy2[7];unsigned long Num1 =0;/*第一个输入的数字*/unsigned long Num2 =0;/*第二个输入的数字*/unsigned long Num3 =0;/*第二个输入的数字*/extern BYTE KEY; // LPC2468开发板使用此数组的0~5显示六个数码管;LPC2478板使用1~6enum {Add =1,Dec,Mut,Div,nofuntion}funtion;/******************************************************************** *********** Main Function main()********************************************************************* *********/int main (void){unsigned char counter = 0; /*计算输入的数字的个数,超过6个则报警,运算结果超过6位数也报警*/unsigned char cal_allow = 1; /*允许输入数字标志*/unsigned char input_allow = 1;/*允许输入数字标志*/unsigned char funtion_type = 0;/*运算功能*/unsigned char Ne_num = 0;/*负数标志*/DWORD value=0,i=0;TargetResetInit();enable_timer(1);SPI_Init(8); // SPI总线速率为28.8/8 = 3.6 MHz Seg_Init(); // 数码管初始化LedsInit();for(i=0;i<7;i++){seg_copy1[i]=0;seg_copy2[i]=0;seg_buf[i]=0;}counter = 0;cal_allow = 1;input_allow = 1;funtion_type = nofuntion;while ( 1 ){value = KEY;/*输入数字*/if(value>0 && value<11){if(counter < 6&&input_allow==1){if(counter == 0) seg_buf[1] = value-1;else{for(i=0;i<counter;i++){seg_buf[counter+1-i] = seg_buf[counter-i]; }seg_buf[1] = value-1;}counter++;}if(counter == 6){input_allow = 0;LedOn(1);LedOn(2);LedOn(3);LedOn(4);}}/*如果是“C”键,则清除显示,清除计算标志*/if(value == 11){for(i=0;i<7;i++){seg_copy1[i]=0;seg_copy2[i]=0;seg_buf[i]=0;}counter = 0;Num1 = 0;Num2 = 0;Num3 = 0;cal_allow = 1;input_allow = 1;Ne_num = 0;/*负数标志*/funtion_type = nofuntion;}/*如果是“+”键,则显示结果*/if(value == 13 ){if(cal_allow == 1){for(i=0;i<7;i++){seg_copy1[i] = seg_buf[i];/*备份第一次输入的数字*/seg_buf[i]=0; /*显示清零以准备第二次输入数字*/}funtion_type = Add;counter = 0; /*计数器清零允许第二次计数*/cal_allow =1; /*再等号按下前不能再按第二次*/input_allow = 1; /*允许第二次输入数据*/}else{input_allow = 0; /*禁止按下2次功能键时候输入数据*/}/*如果是“-”键,则显示结果*/if(value == 14&& cal_allow == 1){if(cal_allow == 1){for(i=0;i<7;i++){seg_copy1[i] = seg_buf[i];/*备份第一次输入的数字*/seg_buf[i]=0; /*显示清零以准备第二次输入数字*/}funtion_type = Dec;counter = 0; /*计数器清零允许第二次计数*/cal_allow =1; /*再等号按下前不能再按第二次*/input_allow = 1; /*允许第二次输入数据*/}else{input_allow = 0; /*禁止按下2次功能键时候输入数据*/ }}/*如果是“X”键,则显示结果*/if(value == 15 && cal_allow == 1){if(cal_allow == 1){for(i=0;i<7;i++)seg_copy1[i] = seg_buf[i];/*备份第一次输入的数字*/seg_buf[i]=0; /*显示清零以准备第二次输入数字*/}funtion_type = Mut;counter = 0; /*计数器清零允许第二次计数*/cal_allow =1; /*再等号按下前不能再按第二次*/input_allow = 1; /*允许第二次输入数据*/}else{input_allow = 0; /*禁止按下2次功能键时候输入数据*/ }}/*如果是“/”键,则显示结果*/if(value == 16 && cal_allow == 1){if(cal_allow == 1){for(i=0;i<7;i++){seg_copy1[i] = seg_buf[i];/*备份第一次输入的数字*/seg_buf[i]=0; /*显示清零以准备第二次输入数字*/}funtion_type = Div;counter = 0; /*计数器清零允许第二次计数*/cal_allow =1; /*再等号按下前不能再按第二次*/input_allow = 1; /*允许第二次输入数据*/}else{input_allow = 0; /*禁止按下2次功能键时候输入数据*/ }}/*如果是“=”键,则清除显示,清除计算标志*/if(value == 12){for(i=0;i<7;i++){seg_copy2[i] = seg_buf[i];/*拷贝第二次输入的数字*/}/*把输入的数字串1合成运算数字*/Num1 = seg_copy1[6]*100000+seg_copy1[5]*10000+seg_copy1[4]*1000 +seg_copy1[3]*100+seg_copy1[2]*10 +seg_copy1[1];/*把输入的数字串2合成运算数字*/Num2 = seg_copy2[6]*100000+seg_copy2[5]*10000+seg_copy2[4]*1000 +seg_copy2[3]*100+seg_copy2[2]*10 +seg_copy2[1];switch(funtion_type){case Add:{Num1 = Num1+Num2;/*计算结果存在Num1中*/break;}case Dec:{if(Num1==Num2) Num1 = 0;else if(Num1>Num2){Num3 = Num1-Num2;/*计算结果存在Num1中*/ Num1 = Num3;}else if(Num2 > Num1){Num3 = Num2-Num1;Ne_num =1;Num1 = Num3;}break;}case Mut:{Num3 = Num1*Num2;/*计算结果存在Num1中*/ Num1 = Num3;break;}case Div:{if(Num1>=Num2&&Num2!=0){Num3 = Num1/Num2;/*计算结果存在Num1中*/}Num1 = Num3;break;}default:break;}/*显示结果*/if(Num1>999999||(Ne_num ==1&&Num1>99999)||Num2 ==0) {for(i=0;i<7;i++){seg_copy1[i]=0;seg_copy2[i]=0;seg_buf[i]=10;/*显示横杠表示计算溢出错误!*/}for(i=0;i<5;i++){LedOn(1);LedOn(2);LedOn(3);LedOn(4);delayMs(1,200);LedOff(1);LedOff(2);LedOff(3);LedOff(4);delayMs(1,200);}}else{seg_buf[1] = Num1%10;seg_buf[2] = (Num1%100)/10;seg_buf[3] = (Num1%1000)/100;seg_buf[4] = (Num1%10000)/1000;seg_buf[5] = (Num1%100000)/10000;seg_buf[6] = Num1/100000;if(Ne_num ==1){seg_buf[6] = 10;/*显示负号*/}}}delayMs(1,200);}}/******************************************************************** *********** End Of File********************************************************************* ********/七实验现象(1)运行成功以后的计算机界面如图一:图一(2)正确输入6+6=12的现象如图二和图三:图二图三(3)当进行除操作且除数为0时的现象如图四:图四七实验小结在设计计算机的过程中,我们遇到了很多问题,但是都通过查资料和请教同学得到了解决。

4x4矩阵键盘工作原理

4x4矩阵键盘工作原理

4x4矩阵键盘工作原理
4x4矩阵键盘是一种常见的输入设备,常用于电脑、手机等设备上。

它由4行4列的按键组成,可以输入数字、字母、符号等字符。

它的工作原理是基于键盘按键的电路原理,通过行列扫描的方式来检测按键的状态。

当用户按下键盘上的某个按键时,按键会和矩阵中的某个交叉点相连通,此时该交叉点的电路就会发生变化。

为了检测到按键的状态,需要通过行列扫描的方式来扫描整个矩阵,以确定哪个按键被按下。

具体的工作过程如下:
1. 在未按下任何按键时,所有的行和列都会保持在高电平状态。

2. 当用户按下某个按键时,该按键所在的行和列就会短接,导致该行的电压降低,该列的电压升高。

3. 将行设置为低电平,列设置为高电平,然后逐行扫描矩阵,检测各行的状态。

4. 如果某行的电压降低,说明该行和某列短接,即某个按键被按下。

5. 此时可以通过查找该按键所在的行和列,确定按下的是哪个按键。

通过上述过程,就可以检测到用户输入的按键,并将其转换成对应的字符输出。

4x4矩阵键盘工作原理简单、可靠,是一种常用的输入设备。

- 1 -。

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设计背景计算器是一种在日常生活中应用广泛的电子产品,无论是在超市商店,还是在办公室,或是家庭都有着它的身影。

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

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

基于51单片机的简易计算器设计一、引言计算器是一种执行基本数学运算的电子设备,现在市面上有各种类型的计算器,从小型的手持计算器到大型的科学计算器。

本设计基于51单片机设计了一种简易计算器,可以实现加法、减法、乘法和除法等基本运算。

二、设计思路1.系统硬件设计本设计使用的51单片机芯片选择了常用的STC89C52芯片,具有强大的功能和稳定性。

外设有键盘、数码管和LCD液晶显示屏。

2.系统软件设计系统的软件设计基于C语言进行,使用51单片机的汇编语言和C语言进行编程。

软件主要分为键盘输入处理、运算处理和结果显示三个部分。

三、系统硬件设计1.键盘输入部分使用4x4矩阵键盘作为输入设备,将键盘的4行4列分别接入到51单片机的4个IO口上,通过行列扫描的方式来检测按键的状态。

2.数码管显示部分使用共阳极的数码管来显示结果,通过提供适当的电压和信号控制来显示所需的数字。

3.LCD液晶显示屏为了方便用户查看输入和结果,本设计还使用了LCD液晶显示屏。

通过串口通信将结果传输到液晶显示屏上进行显示。

四、系统软件设计1.键盘输入处理通过行列扫描的方式检测键盘的按键状态,当检测到按键按下时,将对应的按键值存储起来。

2.运算处理根据用户的输入进行相应的运算处理。

根据检测到的按键值进行不同的运算操作,如加法、减法、乘法和除法。

3.结果显示将运算的结果通过串口通信传输到LCD液晶显示屏上进行显示。

五、系统实现1.硬件连接将键盘的行列引脚接到51单片机的对应IO口上,数码管和LCD液晶显示屏也分别连接到单片机的IO口上。

2.软件编码通过C语言编写系统软件,包括键盘输入处理、运算处理和结果显示三个模块。

3.调试测试将编写好的软件烧录到单片机上,通过键盘输入进行测试,并观察数码管和LCD液晶显示屏上的输出结果。

六、总结本设计基于51单片机实现了一个简易计算器,通过键盘输入进行基本的运算操作,并将结果通过数码管和LCD液晶显示屏进行显示。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

;4X4按键实现计算器功能;当按0-9时显示数值;当按A-F时将其除以10;如商为0就是0-9数字输入;如商为1就是+,-,*,/,=;跟据余数转到相应的功能处;因为8位数最取值为255;可扩展到16位或32位; ok;硬件连接POUT EQU P2KPIN EQU P1PDIG1 EQU P3.0V AL DATA 30HKID DATA 31HKTMP DATA 32HPDIG EQU P3NO EQU 4 ;N位要显示的数;内部使用的变量DIG DATA 33H;DID DATA 34HKFH DATA 35HDA T1 DATA 36HDA T2 DATA 37HBUF DATA 38HMTM EQU 1000MTH EQU HIGH(65536-MTM) MTL EQU LOW(65536-MTM)MSYS BIT 2FH.0KEFL BIT 20H.0;**************************;主调度程序;每1MS中断一次,所有程序都在期间执行;主程序调度标志位:MSYS;************************** ORG 0000HSJMP MAINORG 0BHSJMP MTM0ORG 30HMAIN:ACALL MINITMLP:JNB MSYS,$CLR MSYSACALL KEYSACALL DISPSJMP MLPMINIT:;用户变量初始化CLR MSYSMOV R0,#30HMOV R2,#16CLR AMILP:MOV @R0,AINC R0DJNZ R2,MILPMOV DIG,#0FEHCLR KEFL;系统变量初始化,并开启定时器0 MOV SP,#60HMOV IE,#82HMOV TMOD,#01HMOV TH0,#MTHMOV TL0,#MTLSETB TR0RET;定时器0中断程序,置系统标志为1 MTM0:MOV TH0,#MTHMOV TL0,#MTLSETB MSYSRETI;************************;显示功能程序;****************DISP:MOV PDIG,#0FFHMOV A,#BUFADD A,DIDMOV R0,AMOV A,@R0MOV DPTR,#TABMOVC A,@A+DPTRCPL AMOV POUT,AMOV A,DIGMOV PDIG,ARR AMOV DIG,AINC DIDMOV A,DIDCJNE A,#NO,DSEXTMOV DID,#0MOV DIG,#07FH DSEXT: RET;************************;*************************;按键扫描程序;;模块应用变量;硬件连接端口:KPIN;返回按键值:V AL;按键处理应用功能程序:KEYPFUN ;;***********************;内部使用变量定义:KID=0,KTMP=0 ;********************** KEYS:MOV DPTR,#KJMPMOV A,KIDRL AJMP @A+DPTRKJMP:AJMP KEYENAJMP KEYDELAJMP KEYSCANAJMP KEYUPAJMP KEYFUNMOV KID,#0RETKS: MOV KPIN,#0FHNOPNOPMOV A,KPINANL A,#0FHXRL A,#0FHRETKEYEN:ACALL KSJZ KENEXTMOV KTMP,#0INC KIDKENEXT: RET KEYDEL:INC KTMPMOV A,KTMPCJNE A,#30,KDEXTMOV KTMP,#0INC KIDKDEXT: RET;******************************* ;KPIN: D7 - D0 =0EFH; D7 D6 D5 D4 ; D0 3 2 1 0; D1 7 6 5 4; D2 B A 9 8; D3 F E D CKEYSCAN:ACALL KSJZ KSCEXTMOV R2,#0EFHMOV R3,#0KS1:MOV KPIN,R2NOPNOPJB KPIN.0,KSL1MOV A,#0SJMP KVALKSL1:JB KPIN.1,KSL2MOV A,#4SJMP KVALKSL2:JB KPIN.2,KSL3MOV A,#8SJMP KVALKSL3:JB KPIN.3,KS2MOV A,#12KV AL:ADD A,R3MOV V AL,AINC KIDRETKSCEXT:MOV KID,#0RETKS2:MOV A,R2JNB ACC.7,KSCEXTRL AINC R3MOV R2,ASJMP KS1KEYUP:ACALL KSJNZ KUPEXTINC KIDKUPEXT: RET;*************************; KEYFUN:MOV KID,#0MOV A,V ALMOV B,#10DIV ABJZ KNUMMOV A,BRL AMOV DPTR,#KFUNKFUN:AJMP KAFUNAJMP KBFUNAJMP KCFUNAJMP KDFUNAJMP KEFUNAJMP KFFUNMOV V AL,#0RETKNUM:MOV R0,#BUFMOV R2,#4 KNLP:MOV A,@R0MOV R4,AMOV A,BMOV @R0,AINC R0MOV A,@R0MOV B,AMOV A,R4MOV @R0,AINC R0DJNZ R2,KNLPSETB KEFLRETDTOH:MOV R1,#BUFMOV R2,#3MOV R5,#0MOV R4,#1 DHLP:MOV A,@R1MOV B,R4MUL ABADD A,R5MOV R5,AMOV A,R4MOV B,#10MUL ABMOV R4,AINC R1DJNZ R2,DHLPRETKAFUN:MOV KFH,#1 CLBUF:ACALL DTOHMOV R0,#BUFMOV R2,#3CLR ACLBUF1:MOV @R0,A INC R0DJNZ R2,CLBUF1CLR KEFLRETKBFUN:MOV KFH,#2SJMP CLBUFKCFUN:MOV KFH,#3SJMP CLBUFKDFUN:MOV KFH,#4SJMP CLBUF KEFUN:MOV R0,#35HMOV R6,#9CLR AKELP:MOV @R0,AINC R0DJNZ R6,KELPCLR KEFLRETKFFUN:JNB KEFL,KFEXTCLR KEFLACALL DTOHMOV DAT2,R5ACALL CLRBUFMOV A,KFHRL AMOV DPTR,#KEQUJMP @A+DPTR KEQU:AJMP KNULLAJMP KADDAJMP KSUBAJMP KMULAJMP KDIVMOV KFH,#0 KFEXT: RET KNULL:NOPRETHTOD:MOV R0,#BUF+2MOV B,#100DIV ABMOV @R0,ADEC R0MOV A,BMOV B,#10DIV ABMOV @R0,ADEC R0MOV A,BMOV @R0,ARETKADD:MOV A,DA T1ADD A,DA T2MOV DAT1,AACALL HTODRETKSUB:MOV A,DA T1CLR CSUBB A,DAT2JC CLRBUFACALL HTODRETCLRBUF:MOV R0,#BUFMOV R2,#3CLR ACLB:MOV @R0,AINC R0DJNZ R2,CLBRETKMUL:MOV A,DA T1MOV B,DA T2MUL ABCLR CSUBB A,#255JC CLRBUFACALL HTODRETKDIV:MOV A,DA T2JZ CLRBUFMOV A,DA T1CLR CSUBB A,DAT2JC CLRBUFMOV A,DA T1MOV B,DA T2DIV ABACALL HTODRET;******************************TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0BFHEND。

相关文档
最新文档