矩阵按键做计算器C程序

合集下载

矩阵键盘计算器

矩阵键盘计算器

#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++; //输入数值累加}}}}}。

矩阵计算器

矩阵计算器
if(arow<M.mu) tp=Mrpos[arow+1];
else tp=M.tu+1;
for(p=Mrpos[arow];p<tp;++p)
{brow=M.data[p].j;
if(brow<N.mu) t=Nrpos[brow+1];
for(p=1;p<=M.tu;++p){
col=M.data[p].j; q=cpot[col];
T->data[q].i=M.data[p].j; T->data[q].j=M.data[p].i;
T->data[q].e=M.data[p].e; ++cpot[col];
Print(N);
getch();break;
case 2:CreatSMatrix(&M);
FastTransposeSMatrix(M,&N);
Print(N);
{ int p;
printf("Matrix's row is %d\nMatrix's line is %d\nMatrix's element munber is %d\n",M.mu,M.nu,M.tu);
for(p=1; p<=M.tu; ++p)
printf("%4d%4d%4d\n",M.data[p].i,M.data[p].j,M.data[p].e);
#include<iostream>
#include<conio.h>
#include<stdlib.h>

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

【免费下载】单片机中用矩阵键盘实现计算器

【免费下载】单片机中用矩阵键盘实现计算器

col_1=1;
col_2=1;
col_3=1;
col_4=0;
keyfind(12);
col_1=0;
col_2=0;
col_3=0;
col_4=0;
//第一列输出'0'
//第二列输出'0'
//第三列输出'0'
//第四列输出'0'
//列线输出全为'0'
flag++; //每按一下标志位加 1
while(((P1&0x0f)!=0x0f)); //等待按键释放
break; case 2:
keynum=2+col_dat; break; case 4: keynum=3+col_dat; break; case 8: keynum=4+col_dat; break; }
} void keyprocess(void) {
switch(keynum) {
case 1:if(flag==1) //flag=1 表示是第一次按下,按得是被除数 num1=7; //第一个键按下对应是数字 7 if(flag==3) //flag=3 表示是第三次按下,按的是除数 num2=7; break;
计算器
1.程序要求:
用矩阵按键实现简单的加减乘除运算。
2.程序代码:
#include <reg51.h> #include <stdio.h> sbit col_1=P1^4; sbit col_2=P1^5; sbit col_3=P1^6; sbit col_4=P1^7;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极数 码管 unsigned char keynum,flag; unsigned char num1,num2,flag1,flag2,flag3,flag4; void keyscan(void); void display(); void keyfind(unsigned char); void keyprocess(void);

基于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单片机的简易计算器设计

基于单片机的简易计算器设计摘要2关键字:80C51 LCD1602 4*4矩阵键盘计算器2第一章绪论21。

1系统开发背景21。

2系统开发意义21.3设计目的21。

4设计任务2第二章单片机发展现状22.1目前单片机的发展状况22。

1。

1单片机的应用场合32.2计算器系统现状42.3简易计算器系统介绍4第三章系统硬件设计及说明43。

1系统组成及总体框图53.2AT89S52单片机介绍63。

3其它器件介绍及说明83.3.1 LCD1602液晶显示83。

3.2 4*4矩阵扫描按键9第四章 PROTEUS模拟仿真11第五章系统硬件设计及说明11第六章软件设计116.1汇编语言和C语言的特点及选择116.2源程序代码12摘要近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。

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

计算机在人们的日常生活中是比较常见的电子产品之一.可是它还在发展之中,以后必将出现功能更加强大的计算机,基于这样的理念,本次设计主要以80C51单片机为控制芯片,用C语言进行编程实现,通过4*4矩阵键盘控制,输出用液晶屏LCD1602显示,该计算器可以实现一般的加减乘除四则混合运算。

关键字:80C51 LCD1602 4*4矩阵键盘计算器第一章绪论1.1 系统开发背景随着社会的发展,科学的进步,人们的生活水平在逐步的提高,尤其是微电子技术的发展,犹如雨后春笋般的变化。

电子产品的更新速度快就不足惊奇了。

计算器在人们的日常中是比较的常见的电子产品之一。

如何使计算器技术更加的成熟,充分利用已有的软件和硬件条件,设计出更出色的计算器,使其更好的为各个行业服务,成了如今电子领域重要的研究课题.1.2 系统开发意义今天,人们的日常生活中已经离不开计算器了,社会的各个角落都有它的身影,比如商店,办公室,学校……。

51单片机矩阵键盘C语言编程

51单片机矩阵键盘C语言编程

X1
19 X1
P20 P21 P22 P23 P24 P25 P26 P27
21 22 23 24 25 26 27 28
+5V
RES X1
+5V
C3 1uF
R1
C1
1K
X2
18 X2
RES
9 RESET
EA/VPP RD/P37 WR/P36 ALE/PRDG
PSEN
31 17 16 30 29
1
}
/****************************************************************************** 函数名称:void keyscan() 函数功能:键盘扫描及按键处理
******************************************************************************/
//如果有按键闭合
{ keyvalue=(~HSM)+(~(LJC|0x0f));
//计算键盘值
return(keyvalue);
//返回键值
} else HSM=(HSM<<1)|0x01;
//行扫描左移 1 位,准备扫描下一行}} Nhomakorabea}
return(0x00);
}
break;
case 0x12: P0=0x66; //4
break;
case 0x22: P0=0x6d; //5
break;
case 0x42: P0=0x7d; //6
break;
case 0x82: P0=0x07; //7
break;

用c语言设计一个多功能计算器

用c语言设计一个多功能计算器

用C语言设计一个多功能计算器实现功能:1)具备整型数据、浮点型数据的算术(加、减、乘、除)运算功能。

依次输入第一个运算数、运算符(+,-,*,/),第二个运算数,然后输出结果。

结果可以作为下一个运算的第一运算数。

按‘C’清屏,按‘X’退出。

例如:输入:2+5输出:72)实现单运算符表达式计算的功能。

输入的操作数可以包含整数或浮点数。

如果遇到错误的表达式,应输出错误提示信息。

输入表达式如下:例如:输入:2+5输出:7目录摘要 (1)第一章引言 (3)1.1 计算器概述 (3)第二章设计任务及要求 (5)2.1 设计任务 (5)2.2 设计要求 (6)第三章计算器硬件设计 (7)3.1 方案说明 (7)3.2 设计单片机主体电路图 (8)第四章软件设计 (9)4.1 模块介绍 (9)4.2 程序流程图 (10)4.3 程序部分 (11)第五章总结 (16)参考文献 (17)摘要:[目录]一、课程设计题目及任务要求二、设计思路三、部分程序介绍四、程序框图五、汇编程序六、参考资料[原文]一、课程设计题目及任务要求请设计十进制加减法计算器。

要求能(不同时)显示3位输入和4位输出。

二、设计思路1、操作显示设备显示设备采用八片七段共阴极LED显示器,共设置16 个键,其中数字键0~9 共十个,接下来依次是加号键、减号键、等于号、清除键。

操作设备是两行八列共16键的简单键盘。

第一行从左至右分别为0、1、2、3、4、5、6、7,第二行分别为8、9、A(+)、B(-)、C(=)、D(清除键)、E (清除键)、F(清除键),“清除键”表示程序初始化,为下次输入准备。

2、程序实现功能(1)十进制加减法计算:输入范围为(1~999),该程序输入两个定点数,每个3位,输出4位;A为加,B为减,C为等于,输出为四位计算结果。

数据输入采用规范化输入,即必须输入3个数才算完成一个运算数的输入,两个运算数之间输入运算符A或者B,输入完成按C显示计算结果;(2)计算机复位功能:DEF均为清零重启,任何时候按下DEF中一个将重新开始;三、部分程序介绍(1)主程序(START)程序开始运行初始化程序,设置输入输出口PA、PB、PC,扫描键盘,输入两个待求数据和运算符,存入寄存器,等待输入等号同时显示第二个数,运行计算程序,并将计算结果分离,输出到显示器;(2)读键子程序(RD_KB)程序分别扫描两行键盘,若有键按下则通过移位的方式计算键码;若无键按下,则将键码缓存设置为10H,判断后进行相应的跳转。

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

C语言实现矩阵计算

C语言实现矩阵计算

C语言实现矩阵计算C语言是一种广泛使用的编程语言,也是实现矩阵计算的一种常用工具。

在C语言中,我们可以使用数组来表示矩阵,并通过循环结构和算术运算符来实现矩阵计算的各种功能。

首先,我们需要实现矩阵的输入和输出功能。

在C语言中,我们可以使用二维数组来表示矩阵。

下面是一个示例代码,用来输入和显示一个矩阵:```c#include <stdio.h>//定义最大矩阵的大小#define MAX_SIZE 100//函数用于输入一个矩阵void inputMatrix(int matrix[MAX_SIZE][MAX_SIZE], int rows, int cols)printf("请输入矩阵元素:\n");for (int i = 0; i < rows; i++)for (int j = 0; j < cols; j++)scanf("%d", &matrix[i][j]);}}//函数用于显示一个矩阵void displayMatrix(int matrix[MAX_SIZE][MAX_SIZE], int rows, int cols)printf("矩阵元素为:\n");for (int i = 0; i < rows; i++)for (int j = 0; j < cols; j++)printf("%d ", matrix[i][j]);}printf("\n");}```上述代码定义了两个函数:`inputMatrix`用于输入一个矩阵,`displayMatrix`用于显示一个矩阵。

我们可以通过调用这两个函数来输入和显示矩阵。

接下来,我们可以实现矩阵的加法、减法和乘法等功能。

以下是一个示例代码,用于实现矩阵的加法:```c//函数用于计算两个矩阵的加法void addMatrix(int matrix1[MAX_SIZE][MAX_SIZE], intmatrix2[MAX_SIZE][MAX_SIZE], int result[MAX_SIZE][MAX_SIZE], int rows, int cols)for (int i = 0; i < rows; i++)for (int j = 0; j < cols; j++)result[i][j] = matrix1[i][j] + matrix2[i][j];}}```上述代码中,我们定义了一个`addMatrix`函数,该函数接受两个输入矩阵和一个结果矩阵,将两个输入矩阵的对应元素相加,并将结果存储在结果矩阵中。

c的简易计算器(已通过实测)初学者参考

c的简易计算器(已通过实测)初学者参考

void LCD_init(void);//初始化函数
void delay_nms(unsigned int n);//延时函数
void LCD_write_command(unsigned char command);//写入指令函数
void LCD_write_dat(unsigned char dat);//写入数据函数
产生原因:液晶根本就没有进行初始化操作,需要检查连线或者程序。运气不好的情况 下就是整块 LCD 是坏的。 状态 2 屏上显示两排灰格
产生原因:程序中对液晶初始化不正常,应是部分初始化指令没有正常接收,建议按照 标准初始化步骤调整程序,或者调整指令之间的延时(加大一些试试)----补充:也有 可能是对比度太大,建议优先调整对比度电阻 状态 3 显示乱码
/*********************************




************************************/
void inter0() interrupt 0
{
unsigned char n;
delay_10ms();//延时
if(INT0==0)//没键按下
数量 1 17 1 9 1 1 1 2 1
--
--
2.3 硬件设计电路图 将 4*4 的键盘直接接在 P1 口上,用 P0 口作为 LCD 的显示输出,
P3.2 口的 INT0 作为外部中断位。
LCD1
LM016L
D0 D1 D2 D3 D4 D5 D6 D7
RS RW E
VSS VDD VEE
7 控制电路
微控制电路就是以AT89C51为核心的控制核心,主要注意晶振电路的接法和复

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

矩阵键盘的键值计算及编程
P1口低四位是指:P1.3 P1.2 P1.1 P1.0
2 读取I/O口值的练习
.j
用程序控制单片机P2口工作,让高四位全高电平,低四位全低电平。 即:P2=0xf0; 具体实现见操作,结果如图。
P1口高四位是指:P1.7 P1.6 P1.5 P1.4
一般都是自高到低读出一个端口各脚电平 ,得到8位二进制数,再将8位二进制转换成2位十六进数。
P3口值= P3.7 P3.6 P3.5 P3.4P3.3 P3.2 P3.1 P3.0 =1111 1010=0xfa
2 读取I/O口值的练习
.j
当 程序使P2=0x0f; 外接一个两脚开关到P2口只能让P2产生如下四个新的值: 0x0e, 0x0d,0x0b,0x07 0x0d 0x0b
找出行线值 置行线所处端口位置高电平
找出列线值 置列线所处端口位置高电平
行线值+列线值=键值
计算键值一般方法
3 键盘的键值
.j
先找出行线值,再找出列线值,最后绘出矩阵键盘的键值。
总结
4×4矩阵键盘的键值 共有16个,计算键值时总是:
4 键盘扫描编程__线反转法
.j
/************键盘扫子描函数*******************/ char keyscan(void) //键盘扫描函数,键盘使用P2口 { char value_h,value_l; //value_h行值变量,value_l列值变量 P2=0xf0; //将行线所处位置置高电平 if((P2&0xf0)!=0xf0) //判断是否有键按下 { delay(10); //延时防抖 if((P2&0xf0)!=0xf0) //仍有键按下 { value_h=P2&0xf0; //读出P2口值给变量value_h P2=0x0f; //将列线所处位置置高电平 value_l=P2&0x0f; //读出P2口值给变量value_l return(value_l+value_h); //找到的键值返回给调用函数 } } }

一维数组矩阵计算器

一维数组矩阵计算器

#include<stdlib.h>#include<iostream>using namespace std;void wellcome(){cout<<"* * * * * * * * * * * * * * * * * * * *"<<endl;cout<<"*---**** * * * * * * * * * * * ****---*"<<endl;cout<<"* * * *"<<endl;cout<<"* * * *"<<endl;cout<<"* * * * * * * * * * * * * * * *"<<endl;cout<<"* * 欢迎使用矩阵计算器!* *"<<endl;cout<<"* * * * * * * * * * * * * * * *"<<endl;cout<<"* * * *"<<endl;cout<<"* * * *"<<endl;cout<<"*---**** * * * * * * * * * * * ****---*"<<endl;cout<<"* * * * * * * * * * * * * * * * * * * *"<<endl<<endl;cout<<"\t回车继续";getchar();system("CLS");}void chose(){cout<<"* * * * * * * * * * * * * * * *"<<endl;cout<<"*---***选择要进行的运算***---*"<<endl;cout<<"* 输入| 运算*"<<endl;cout<<"* ---- | ---- *"<<endl;cout<<"* A | 加法*"<<endl;cout<<"* B | 减法*"<<endl;cout<<"* C | 乘法*"<<endl;cout<<"* D | 转置*"<<endl;cout<<"* E | 乘幂*"<<endl;cout<<"* 其他| 不做运算*"<<endl;cout<<"* * * * * * * * * * * * * * * *"<<endl;}void putout1(double *x,int *q1,int *p1,double *y,int *q2,int *p2,double *z,int *q,int *p,char *r) {int i,j,i1,j1,n1,m1,i2,j2,n2,m2,i3,j3,n3,m3;char c=*r;n3=*q,m3=*p,n1=*q1,m1=*p1,n2=*q2,m2=*p2;for(i=0;i<n1||i<n2||i<n3;i++){if(i<n1)for(j=0;j<m1;j++){cout<<x[i*m1+j]<<"\t";}else for(j=0;j<m1;j++)cout<<"\t";if(i==n1/2){switch(c){case'A':cout<<"+\t";break;case'B':cout<<"-\t";break;case'C':cout<<"x\t";break;}}elsecout<<"\t";if(i<n2)for(j=0;j<m2;j++){cout<<y[i*m2+j]<<"\t";}else for(j=0;j<m2;j++)cout<<"\t";if(i==n1/2)cout<<"=\t";elsecout<<"\t";if(i<n3)for(j=0;j<m3;j++){cout<<z[i*m3+j]<<"\t";}else for(j=0;j<m3;j++)cout<<"\t";cout<<endl<<endl;}}void putout(double *x,int *q1,int *p1,double *y,int *q,int *p,char *r,int std) {int i,j,n1,m1;char c=*r;n1=*q,m1=*p;for(i=0;i<n1;i++){for(j=0;j<m1;j++){cout<<x[i*m1+j]<<"\t";}if(i==n1/2-1){switch(c){case'D':cout<<"转置=>\t";break;case'E':cout<<"的"<<std<<"次幂\t";break;}}elsecout<<"\t";for(j=0;j<m1;j++){cout<<y[i*m1+j]<<'\t';}cout<<endl;}}void transpose(int *q1,int *p1,double *x,char *r)//转置{int n1,m1,n,i,j,std=0;n1=*p1;m1=*q1;double *z;n=8*n1*m1;z=new double[n];for(i=0;i<n1;i++)for(j=0;j<m1;j++){z[i*m1+j]=x[j*n1+i];}putout(x,q1,p1,z,p1,q1,r,std);}void power(double *x,int *q1,int *p1,char *r)//矩阵幂运算{int n1,m1,n,i,j,k,std;n1=*q1;m1=*p1;if(m1==n1){double *z,*y;n=8*n1*m1;z=new double[n];y=new double[n];cout<<"输入要求幂数:";cin>>std;if(std==0){for(i=0;i<n1;i++)for(j=0;j<m1;j++)z[i*m1+j]=1;}else{for(i=0;i<n1;i++){for(j=0;j<m1;j++){z[i*m1+j]=x[i*m1+j];y[i*m1+j]=0;}}for(int s=1;s<std;s++){for(i=0;i<n1;i++){for(j=0;j<m1;j++){for(k=0;k<n1;k++)y[i*m1+j]+=z[i*m1+k]*x[k*m1+j];}}for(i=0;i<n1;i++){for(j=0;j<m1;j++){z[i*m1+j]=y[i*m1+j];}}}}putout(x,q1,p1,z,q1,p1,r,std);}else cout<<"错误,无法运算!!!"<<endl;}void multiply(double *x,int *q1,int *p1,double *y,int *q2,int *p2,char *r) {double *z;int N,n1,m1,n2,m2,i,j,k,n,m;n1=*q1;m1=*p1;n2=*q2;m2=*p2;n=n1;m=m2;N=8*n1*m2;if(m1==n2){z=new double[N];for(i=0;i<n;i++){for(j=0;j<m;j++)z[i*m+j]=0;}for(i=0;i<n;i++){for(j=0;j<m;j++){for(k=0;k<m1;k++)z[i*m+j]+=x[i*m1+k]*y[k*m2+j];}}putout1(x,q1,p1,y,q2,p2,z,q1,p2,r);}else cout<<"错误,无法运算!!!"<<endl;}void subtract(double *x,int *q1,int *p1,double *y,int *q2,int *p2,char *r) {double *z;int n,n1,m1,n2,m2,i,j;n1=*q1;m1=*p1;n2=*q2;m2=*p2;n=8*n1*m1;if(n1==n2&&m1==m2){z=new double[n];for(i=0;i<n1;i++){for(j=0;j<m1;j++)z[i*m1+j]=x[i*m1+j]-y[i*m1+j];}putout1(x,q1,p1,y,q2,p2,z,q1,p1,r);}else cout<<"错误,无法运算!!!"<<endl;}void add(double *x,int *q1,int *p1,double *y,int *q2,int *p2,char *r) {double *z;int n,n1,m1,n2,m2,i,j;n1=*q1;m1=*p1;n2=*q2;m2=*p2;n=8*n1*m1;if(n1==n2&&m1==m2){z=new double[n];for(i=0;i<n1;i++){for(j=0;j<m1;j++)z[i*m1+j]=x[i*m1+j]+y[i*m1+j];}putout1(x,q1,p1,y,q2,p2,z,q1,p1,r);}else cout<<"错误,无法运算!!!"<<endl;}void main(){wellcome();char c='\n',d='y',*r;r=&c;int i,j,k,N1,N2,N3,n1,m1,n2,m2,*q1,*q2,*p1,*p2,n,std=2,s;int tmp=1;q1=&n1;q2=&n2;p1=&m1;p2=&m2;double *x,*y,*z;cout<<"输入第一个矩阵的行列数(n1×m1):";cin>>n1>>m1;N1=8*n1*m1;x=new double[N1];z=new double[N1];for(i=0;i<n1;i++)for(j=0;j<m1;j++)cin>>x[i*m1+j];while(d=='y'||d=='Y'){chose();cin>>c;if(c=='A'||c=='B'||c=='C'){if(tmp==1){tmp=0;cout<<"输入第二个矩阵的行列数(n2×m2):";cin>>n2>>m2;N2=8*n2*m2;y=new double[N2];for(i=0;i<n2;i++)for(j=0;j<m2;j++)cin>>y[i*m2+j];}}system("CLS");switch(c){case'A':add(x,q1,p1,y,q2,p2,r);break;case'B':subtract(x,q1,p1,y,q2,p2,r);break;case'C':multiply(x,q1,p1,y,q2,p2,r);break;case'D':transpose(q1,p1,x,r);break;case'E':power(x,q1,p1,r);break;default:cout<<"输入有误!!!"<<endl;}cout<<"是否继续(Y or N)"<<endl;cin>>d;system("CLS");}}。

模拟计算器

模拟计算器

智能仪器仪表课程设计报告摘要 (3)关键词 (3)说明 (3)一.设计功能及工具 (4)1.1设计功能 (4)1.2单片机AT89C51简介 (4)1.3 LED数码显示管简介 (7)1.4输入设备键盘 (7)二.电路设计 (8)2.1时钟电路 (8)2.2复位电路 (9)2.3显示驱动电路 (9)2.4蜂鸣器提示电路 (10)2.5总电路原理图 (10)三.C设计和运行 (12)3.1 C程序代码 (12)3.2 Keil C调试运行 (18)3.3 Proteus 操作运行 (19)四.Proteus 仿真演示 (20)4.1加法演示 (20)4.2减法演示 (21)4.3乘法演示 (22)4.4除法演示 (23)五.总结 (24)参考文献 (24)摘要本设计一简易的模拟计算器程序,实现基本的加减乘除的运算并将结果显示在相应的LED上,且在数字信息输入完毕时有声音提示。

此次设计利用proteus 7 professional 软件绘制电路原理图,在Keil C平台上实现C语言程序编制,最后联立proteus和Keil C实现仿真设计成果。

采用了4X4矩阵式键盘输入,8位LED动态显示,避免了I/O口扩展使程序简化。

利用的AT89C51单片机,八个引脚用来扫描键盘的输入,八个引脚用来驱动八位LED显示,八个引脚用作八位LED的位选信号。

当显示器输出大于八位时,可在剩下的I/O口中任意选一个用来使扬声器发出声音警报。

关键词:AT89C51 、计算器、proteus、Keil C说明本次模拟计算器程序小组共2人:耿莎莎(我)和黄洁雯。

其中,我主要负责Proteus 和Keil C软件的下载并学习用法;利用Proteus绘制电路原理图;成功无错误地运行C程序并联立Proteus仿真计算器成果。

鉴于程序运行无错误无警告,然而仿真徒有信号无法输入显示,遂求教于指导老师,以期发现并改正按键键盘输入程序来使仿真成果实现。

C++课设1、设计一个能够实现n×n矩阵操作的类2、计算器程序

C++课设1、设计一个能够实现n×n矩阵操作的类2、计算器程序

课程设计任务书目录PART I1 需求分析 (2)2 算法基本原理 (2)3 类设计 (3)4 详细设计 (4)4.1类的接口设计 (4)4.2类的实现 (5)4.3主函数设计 (11)5 运行结果与分析 (12)5.1程序运行结果 (12)5.2运行结果分析 (14)PART Ⅱ1 需求分析 (24)2 算法基本原理 (24)3 类设计 (14)4 详细设计 (15)4.1类的实现 (15)4.2主函数设计 (19)5 运行结果与分析 (27)5.1程序运行结果 (27)5.2运行结果分析 (27)6 参考文献 (15)PART I1 需求分析矩阵是线性代数里一个重要的概念,在这里采用C++语言实现一个简单的n ×n矩阵类,类中包括一些简单的运算等操作具体要求如下:(1)使用构造函数完成方阵的初始化赋值(动态内存分配);(2)使用析构函数完成矩阵动态内存的释放;(3)重载加法运算符+,实现两个矩阵的和;(4)重载加法运算符-,实现两个矩阵的差;(5)重载加法运算符*,实现两个矩阵的积;(6)重载加法运算符=,实现两个矩阵之间的赋值;(7)使用函数实现矩阵的转置;(8)使用函数求矩阵中的最大值;(9)使用函数求矩阵中的最小值;(10)添加函数Det以得到矩阵对应行列式的值;(11)重载加法运算符<<,实现矩阵按照行列的格式输出;(12)编写一个主函数测试上述功能。

2 算法基本原理矩阵进行加法,减法,乘法运算时,必须满足两个矩阵阶数相同的条件。

加法,减法计算是把矩阵对应的各行各列的每一对数值分别进行加减法运算,结果组成一个新的同阶矩阵。

矩阵乘法是这样定义的,只有当矩阵A的列数与矩阵B的行数相等时A×B才有意义。

一个m×n的矩阵a(m,n)左乘一个n×p的矩阵b(n,p),会得到一个m×p的矩阵c(m,p),满足矩阵乘法满足结合率,但不满足交换率3 类设计从上面的算法分析可以看到,本设计面临的计算问题的关键是矩阵运算。

矩阵计算器代码实现 C语言

矩阵计算器代码实现 C语言

#include<iostream>#include<stdlib.h>#include<math.h>#define N 10 //定义方阵的最大阶数为10#include <iomanip>using namespace std;double MatDet(double *p, int n); //求矩阵的行列式double Creat_M(double *p, int m, int n, int k); //求矩阵元素A(m, n)的代数余子式void print(double *p, int n); //输出矩阵n*nclass Matrix{private:int row,col;double **eM ;public:creatM();//创造矩阵outM(Matrix A);//输出矩阵add(Matrix A,Matrix B);//矩阵相加minus(Matrix A,Matrix B);//矩阵相减transpose(Matrix A);//矩阵转置mutiply(Matrix A,Matrix B);//矩阵相乘h(Matrix A);//求行列式,和上三角inverse(Matrix A);//矩阵的逆};void main(){cout<<"******矩阵计算器******"<<endl;cout<<"请选择你要进行的操作"<<"\n"<<"1:相加2:相减3:转置4:相乘5:求行列式和上三角6:求逆"<<endl;int c;cin>>c;switch(c){case 1:{Matrix m1,m2;cout<<"请输入第一个矩阵"<<endl;m1.creatM();cout<<"请输入第二个矩阵"<<endl;m2.creatM();m1.add(m1,m2);break;}case 2:{Matrix m1,m2;cout<<"请输入第一个矩阵"<<endl;m1.creatM();cout<<"请输入第二个矩阵"<<endl;m2.creatM();m1.minus(m1,m2);break;}case 3:{Matrix A;A.transpose(A);break;}case 4:{Matrix m1,m2;cout<<"请输入第一个矩阵"<<endl;m1.creatM();cout<<"请输入第二个矩阵"<<endl;m2.creatM();m1.mutiply(m1,m2);break;}case 5:{Matrix m;cout<<"请输入矩阵"<<endl;m.creatM();m.h(m);break;}case 6:{double *buffer, *p; //定义数组首地址指针变量int row, num; //定义矩阵的行数和矩阵元素个数int i, j;double determ; //定义矩阵的行列式double a[N][N], b[N][N];int n;cout << "采用逆矩阵的定义法求矩阵的逆矩阵!\n";cout << "请输入矩阵的行数: ";cin >> row;num = 2 * row * row;buffer = (double *)calloc(num, sizeof(double)); //分配内存单元p = buffer;if (NULL != p){for (i = 0; i < row; i++){cout << "Please input the number of " << i+1 << " row: ";for (j = 0; j < row; j++){cin >> *p++;}}}else{cout << "无法分配内存\n";}cout << "The original matrix : \n";print(buffer, row); //打印该矩阵determ = MatDet(buffer, row); //求整个矩阵的行列式p = buffer + row * row;if (determ != 0){cout << "The determinant of the matrix is " << determ << endl;for (i = 0; i < row; i++) //求逆矩阵{for (j = 0; j < row; j++){*(p+j*row+i) = (double)Creat_M(buffer, i, j, row)/determ;}}cout << "The inverse matrix is: " << endl;print(p, row); //打印该矩阵}else{cout << "The determinant is 0, and there is no inverse matrix!\n"; }free(buffer); //释放内存空间getchar();break;}}}Matrix::creatM(){cout<<"请依次输入矩阵的行和列"<<endl;cin>>row>>col;eM=(double**) malloc(row*sizeof(double*)) ;for(int i=0; i<row; i++)eM[i] = (double *)malloc(col * sizeof(double));cout<<"请输入矩阵"<<endl;for( i=0;i<row;i++){for(int j=0;j<col;j++)cin>>eM[i][j] ;}}Matrix::outM(Matrix A){for(int i=0;i<row;i++){for(int j=0;j<col;j++)cout<<eM[i][j]<<" ";cout<<endl;}}Matrix::add(Matrix A, Matrix B){if(A.col!=B.col || A.row!=B.row){cout<<"行列不同"<<endl;}else{for(int i=0;i<A.row;i++){for(int j=0;j<A.col;j++){A.eM[i][j]=A.eM[i][j]+B.eM[i][j];}}cout<<"结果为:\n";A.outM(A);}}Matrix::minus(Matrix A, Matrix B){if(A.col!=B.col || A.row!=B.row){cout<<"行列不同"<<endl;}else{for(int i=0;i<A.row;i++){for(int j=0;j<A.col;j++){A.eM[i][j]=A.eM[i][j]+B.eM[i][j];}}cout<<"结果为:\n";A.outM(A);}}Matrix::transpose(Matrix A){int i,j;cout<<"请输入矩阵"<<endl;A.creatM();cout<<"原矩阵为:\n";A.outM(A);Matrix R;R.row=A.col;R.col=A.row;R.eM=(double**) malloc(R.row*sizeof(double*)) ;for( i=0; i<R.row; i++)R.eM[i] = (double *)malloc(R.col * sizeof(double));for(i=0;i<R.row;i++){for(int j=0;j<R.col;j++){R.eM[i][j]=0;}}for(i=0;i<R.row;i++){for(int j=0;j<R.col;j++){R.eM[i][j]=A.eM[j][i];}}cout<<"结果为:"<<endl;R.outM(R);}Matrix::mutiply(Matrix A, Matrix B){if(A.col!=B.row){cout<<"不能相乘"<<endl;}else{int i;Matrix R;R.row=A.row;R.col=B.col;R.eM=(double**) malloc(R.row*sizeof(double*)) ;for( i=0; i<row; i++)R.eM[i] = (double *)malloc(R.col * sizeof(double));for(i=0;i<R.row;i++){for(int j=0;j<R.col;j++){R.eM[i][j]=0;}}for(i=0;i<R.row;i++){for(int j=0;j<R.col;j++){for(int k=0;k<A.col;k++){R.eM[i][j]+=A.eM[i][k]*B.eM[k][j];}}}cout<<"结果为:\n"<<endl;R.outM(R);}}Matrix::h(Matrix A){if(A.col!=A.row){cout<<"不是方阵"<<endl;}else{int ii,jj,k,u;int iter = 0; //记录行变换的次数(交换)double det1=1,yin;int n=A.row;for(ii=0 ; ii<n; ii++){if(A.eM[ii][ii] == 0)for(jj=ii; jj<n; jj++){if(A.eM[jj][ii] != 0){double temp1;for(int i=0 ; i<n ; i++);{temp1 = A.eM[ii][i];A.eM[ii][i] = A.eM[jj][i];A.eM[ii][i] = temp1;}iter ++;}}for(k=ii+1; k<n; k++){yin = -1 * A.eM[k][ii] / A.eM[ii][ii] ;for(u=0; u<n; u++){A.eM[k][u] = A.eM[k][u] + A.eM[ii][u] * yin;}}}for(ii=0; ii<n; ii++) //求对角线的积即行列式的值det1 = det1 * A.eM[ii][ii];//行变换偶数次符号不变if(iter%2 == 1)det1= -det1;cout<<"矩阵的行列式的值为:"<<det1<<endl;cout<<"转换的上三角矩阵为:"<<endl;for(int i=0; i<n; i++){for(int j=0; j<n; j++){cout<<" "<<A.eM[i][j];}cout<<endl;}cout<<endl;}}double MatDet(double *p, int n){int ii,jj,k,u;int iter = 0; //记录行变换的次数(交换)double det1=1,yin;for(ii=0 ; ii<n; ii++){if(*(p+ii*n+ii) == 0)for(jj=ii; jj<n; jj++){if(*(p+jj*n+ii) != 0){double temp1;for(int i=0 ; i<n ; i++){temp1 = *(p+ii*n+i);*(p+ii*n+i) = *(p+jj*n+i);*(p+ii*n+i) = temp1;}iter ++;}}for(k=ii+1; k<n; k++){yin = -1 * (*(p+k*n+ii)) / (*(p+ii*n+ii)) ;for(u=0; u<n; u++){*(p+k*n+u) = *(p+k*n+u) + *(p+ii*n+u) * yin;}}}for(ii=0; ii<n; ii++) //求对角线的积即行列式的值det1 = det1 * (*(p+ii*n+ii));//行变换偶数次符号不变if(iter%2 == 1)det1= -det1;return det1;}//----------------------------------------------------------------------------//功能: 求k*k矩阵中元素A(m, n)的代数余之式//入口参数: k*k矩阵的首地址,矩阵元素A的下标m,n,矩阵行数k//返回值: k*k矩阵中元素A(m, n)的代数余之式//----------------------------------------------------------------------------double Creat_M(double *p, int m, int n, int k){int len,t;int i, j;double mid_result = 0;int sign = 1;double *p_creat, *p_mid;len = (k-1)*(k-1); //k阶矩阵的代数余之式为k-1阶矩阵p_creat = (double*)calloc(len, sizeof(double)); //分配内存单元p_mid = p_creat;for (i = 0; i < k; i++){for (j = 0; j < k; j++){if (i != m && j != n) //将除第i行和第j列外的所有元素存储到以p_mid为首地址的内存单元{*p_mid++ = *(p+i*k+j);}}}sign = ((m+n)%2 == 0 ? 1 : -1);//代数余之式前面的正、负号t=MatDet(p_creat, k-1);mid_result = sign*t;return mid_result;free(p_creat);}//-----------------------------------------------------//功能: 打印n*n矩阵//入口参数: n*n矩阵的首地址,矩阵的行数n//返回值: 无返回值//-----------------------------------------------------void print(double *p, int n){int i, j;for (i = 0; i < n; i++){cout << setw(4);for (j = 0; j < n; j++){cout << setiosflags(ios::right) << *p++ << setw(10);}cout << endl;}}。

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

智能控制电路项目四-任务五 简易计算器设计
智能控制电路项目实践
学习项目
一 单片机最小应用系统构建 二 单片机开发工具的使用 三 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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void delay(unsigned char n)
{
unsigned char i,j;
for(i=0;i<n;i++)
for(j=0;j<115;j++);
}
void display()
{
unsigned char i;
// disdata[1]=table[dat%10];
if((keyboard&0xf0)!=0xf0)
{
delay(10);
if((keyboard&0xf0)!=0xf0)
{
scode=0xfe;
while((scode&0x10)!=0)
{
keyboard=scode;
if((keyboard&0xf0)!=0xf0)
}
}
}*/
main()
{
unsigned char key,i,j,add;
while(1)
{
// scankeyboard();
// checkkeycode();
// calculate_handle();
// display();
key=keyscan();
{
rcode=keyboard&0xf0;
scode=scode&0x0f;
while((keyboard&0xf0)!=0xf0);
keytimes++;
if(keytimes==5)
keytimes=1;
return(rcode|scode);
case 0xed: keynum=1 ;break;
case 0xdd: keynum=2 ;break;
case 0xbd: keynum=3 ;break;
case 0xeb: keynum=4 ;break;
case 0xdb: keynum=5 ;break;
}
else datA=dat; //如果不是连加,将输入的第一个数保存起来,
}
void equ(void)
{
if(addflag)
case 0x90:dat1=9;break;}
case 0xde: keynum=15 ;break; //清零
}
checkok=1; //查完后,checkok置1.
}
}
void add(void)
{
addflag++; //加法标志置1
case 0xb0:dat1=3;break;case 0x99:dat1=4;break;case 0x92:dat1=5;break;
case 0x82:dat1=6;break;case 0xf8:dat1=7;break;case 0x80:dat1=8;break;
if(key!=0)
{
switch(key)
{
case 0xee:disdata[keytimes]=table[7];break;
case 0xde:disdata[keytimes]=table[8];break;
case 0xbe:disdata[keytimes]=table[9];break;
}
else
scode=(scode<<1)|0x01;
}
}
}
return(0);
}
/*
void scankeyboard() //scankeyboard()键值扫描
{ //扫描法测键值
// disdata[2]=table[dat/10%10];
// disdata[3]=table[dat/100%10];
// disdata[4]=table[dat/1000];
for(i=keytimes;i>0;i--)
{
bitsel=~(0x08>>(keytimes-i));
switch (keynum)//如果是+,-,*,/,=则进入相应函数
{
case 10 : add(); break; //如果按了"+",则进入加法函数
// case 11 : sub(); break; //如果按了"-",则进入减如果按了"*",则进入乘法函数
if(addflag>1)
{
dat=dat+datA;
datA=dat;
#include<reg51.h> /*可加减乘除*/
#define dataport P0
#define keyboard P3
#define bitsel P2
unsigned char code table[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8c};
// if(divflag&&!dat) illegal=1; //如果做除法时除了0,则非法标志置1,供显示程序查询
}
}
void calculate_handle(void)//计算函数
{
if(checkok)//如果检测键值完。。。则执行以下程序
{
checkok=0;//检测键值标志置0
unsigned char disdata[5];
unsigned char key,keytimes/*,keynum,keycode,checkok,scanok*/;
//unsigned char clrflag; //数据处理标志位
unsigned char addflag=0; //加法标志位
{
scanok=0; //scanok清零,为下次使用准备
switch(key) //用开关语句查找键值对应的逻辑功能
{
case 0xee: keynum=0 ;break; //数字键
dat=datA/dat;
}
addflag=subflag=mulflag=divflag=0; //运算一次完成后将所有标志清零,为下次运算做准备
}
void datpros(void) //数据处理函数
{
if(keynum==15) //如果是15 则认为是清零的 进行清零
// case 13 : div(); break; //如果按了"/",则进入除法函数
case 14 : equ(); break; //如果按了"=",则进入相应函数
default : datpros(); //如果不是,计算符(即为数字),则进入数据处理函数
{
dat=0;
}
else //否则认为是数字键 进行显示 存储 并运算
{
if(clrflag) //清除标志为1,则执行以下
{
dat=0;
key=keyscan();
scanok=1; //键值测完后。。scanok置1
}
void checkkeycode(void)
{
if(scanok) //如果键值测完后,则执行一以下
subflag=mulflag=divflag=0; //将其他运算标志清零(一次只能做一种运算)
clrflag=1; //清零标志置1,(当加号键按下后,再按第二个加数时,这是应显示第二加数,所以要清掉第一个加数)
case 0xbb: keynum=6 ;break;
case 0xe7: keynum=7 ;break;
case 0xd7: keynum=8 ;break;
case 0xb7: keynum=9 ;break;
case 0x77: keynum=10 ;break; // +
dataport=disdata[i];
delay(20);
dataport=0xff;
//P2=0x0f;
}
}
unsigned char keyscan()
{
unsigned char rcode;
unsigned char scode;
keyboard=0xf0;
clrflag=0; //为下次使用做准备
}
dat=dat*10+keynum; //将每次按的数字合成整体 比如按下"1","2","3"后就会把他们合成"123"
// if(dat>1000000000) overflow=1; //如果输入值大于65535(所用的为int型数据,最大为65535)则溢出标志置1,可供显示程序查询并显示"EEEEEEE"
{
dat=dat+datA;
}
if(subflag)
{
dat=datA-dat;
}
if(mulflag)
{
dat=datA*dat;
}
if(divflag)
{
case 0x7e: {i++;keytimes=0;dat1=disdata[1];addflag=1; //+ 10
switch(dat1)
相关文档
最新文档