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液晶屏上显示结果。

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

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

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

  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。

相关文档
最新文档