51单片机 简单计算机实现

news2024/12/24 20:28:41

书接上回;http://t.csdnimg.cn/T4b0W

键盘位置如上

效果图

因为是四位,就没显示等于号, 而且段数比较少 显示不出来加号 所以 A = + ;   B = - ;  C = *; D =/ 基本原来都一样.

代码奉上

#include <reg51.h>

#include <STRING.H>


//利用矩阵键盘按键按下依次在数码管显示0-F。

/*
	接线:
	矩阵键盘:P3端口
	数码管:  P0端口
*/
#define KEY P3
#define DIG P0

void delay10ms(void);
unsigned char GetKey(void);
void CheckKeyValue(unsigned char);
unsigned char StrToNum(unsigned char);
void Refresh(); //刷新
void Equal();   //等于
//void ShowNum(); //显示数码管


void delay(unsigned int t)
{
    unsigned int i, j;
    for (i = 0; i < t; i++) {
        for (j = 0; j < 1275; j++) {
            ; // 空循环,等待时间过去
        }
    }
}

//计算机显示数组
unsigned char numShow[] = {0x01,0x02,0x03,0x04};
unsigned char numKey = 0;
unsigned char operationKey;
//独立数码管的显示0-F
unsigned char leddata[]={
	0x3F,  //"0"
    0x06,  //"1"
    0x5B,  //"2"
    0x4F,  //"3"
    0x66,  //"4"
    0x6D,  //"5"
    0x7D,  //"6"
    0x07,  //"7"
    0x7F,  //"8"
    0x6F,  //"9"
    0x77,  //"A"
    0x7C,  //"B"
    0x39,  //"C"
    0x5E,  //"D"
    0x79,  //"E"
    0x71,  //"F"
    0x76,  //"H"
    0x38,  //"L"
    0x37,  //"n"
    0x3E,  //"u"
    0x73,  //"P"
    0x5C,  //"o"
    0x40,  //"-"
    0x00  //熄灭
};

unsigned char keynum = 0;
unsigned char keyBool = 1;
void main(void)
{
	unsigned char Key = 0;
	unsigned char i  = 0;

	//P2=0;

	while(1)
	{	 
		Key = GetKey();
		if ((KEY == 0x0e || KEY == 0x0d||KEY == 0x0b||KEY == 0x07||KEY == 0xe0
		||KEY == 0xd0||KEY == 0xb0||KEY == 0x70)&&keyBool == 0 )
		{
			//keyBool = 1 ;
		}
		else
		{
			keyBool = 1 ;
		}

		
		for ( i = 0; i < 5; i++)
		{
			switch (i)
			{
			case 0:
				P0 =leddata[numShow[0]];
				P2 =0xFE;  //1111 1110
				break;
			case 1:
				P0 = leddata[numShow[1]];
				P2 =0xFD;//1111 1101  
				break;
			case 2:
				P0 =leddata[numShow[2]];
				P2 =0xFB;//1111 1011  
				break;
			case 3:
				P0 =leddata[numShow[3]];
				P2 =0xF7;//1111 0111 
				break;
			
			default:
				break;			
			}
				
			delay(1);
			P0=0x00;	
	}
	}
}
	
void delay10ms(void)   //误差 0us
{
    unsigned char a,b,c;
    for(c=5;c>0;c--)
        for(b=4;b>0;b--)
            for(a=248;a>0;a--);
}


unsigned char GetKey(void)
{
	unsigned char KeyValue = 0;
	unsigned char hang = 0,lie = 0;
	unsigned char flag = 0;

	KEY = 0x0f;
	
	if(KEY != 0x0f && keyBool == 1 )	
	{
		keyBool = 0;
	    delay10ms();
		
		 switch (KEY)
		{
			case 0x0e: hang = 1; break; //0000  1110  
			case 0x0d: hang = 2; break; //0000  1101  
			case 0x0b: hang = 3; break; //0000  1011
			case 0x07: hang = 4; break; //0000  0111
			default:break;
		}
		KEY = 0xf0;
		if(KEY != 0xf0)
		{	
			switch (KEY)
			{
				case 0xe0: lie = 1; break;//1110  0000  
				case 0xd0: lie = 2; break;//1101  0000  
				case 0xb0: lie = 3; break;//1011  0000  
				case 0x70: lie = 4; break;//0111  0000  
				default:break;
			}			
	    	KeyValue = (hang - 1)*4 + lie;	
			CheckKeyValue(KeyValue);		   
		}
		return KeyValue;
	}
   return 0;
}
void CheckKeyValue(unsigned char keyvalue)
{
	switch (keyvalue)
	{
	    case 1:
		numShow[keynum] = 1;
		break;
		case 2:
		numShow[keynum] = 2;
		break;
		case 3:
		numShow[keynum] = 3;
		break;
		case 4:
		operationKey = 10;//+
		numShow[keynum] = 10;
		break;
		case 5:
		numShow[keynum] = 4;
		break;
		case 6:
		numShow[keynum] = 5;
		break;
		case 7:
		numShow[keynum] = 6;
		break;
		case 8:
		operationKey = 11;// /
		numShow[keynum] = 11;
		break;
		case 9:
		numShow[keynum] = 7;
		break;
		case 10:
		numShow[keynum] = 8;
		break;
		case 11:
		numShow[keynum] = 9;
		break;
		case 12:
		operationKey = 12;// /
		numShow[keynum] = 12;// *
		break;
		case 13:
		//刷新
		Refresh();
		break;
		case 14:
		numShow[keynum] = 0;
		break;
		case 15:
		//等于
		Equal(); 
		break;
		case 16:
		operationKey = 13;// /
		numShow[keynum] = 13; //   /
		break;
	
	default:
		break;
	}
	 ++keynum;
	//ShowNum();
}
void Refresh()
{
	keynum = -1;
	numShow[0] = 0x00;
	numShow[1] = 0x00;
	numShow[2] = 0x00;
	numShow[3] = 0x00;
}
void Equal()
{
	switch (operationKey)
	{
	case 10:
		numShow[3]  =numShow[0] + numShow[2];
		break;
	case 11:
		numShow[3]  = numShow[0] - numShow[2];
		break;
	case 12:
		numShow[3]  = numShow[0] * numShow[2];
		break;
	case 13:
		numShow[3]  = numShow[0] / numShow[2];
		break;
	default:
	numShow[3] = operationKey;
		//Refresh();
		break;
	}
	//ShowNum();

}

//字符串转化为数字
unsigned char StrToNum(unsigned char dig){

unsigned int num = 0;
switch (dig)
{
	case '0':
	num = 0;
	break;
case '1':
	num = 1;
		break;
	case '2':
	num = 2;
		break;
	case '3':
	num = 3;
		break;
	case '4':
	num = 4;
		break;
	case '5':
	num = 5;
		break;
	case '6':
		num = 6;	
		break;
	case '7':
		num = 7;	
		break;
	case '8':
		num = 8;	
		break;
	case '9':
		num = 9;	
		break;

	default:
		break;
}
return(num);

}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1693572.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

九、OpenAI之图片生成(Image generation)

学习用DALL.E的API怎样生成和操作图片 1 介绍 图片API提供3个方法来和图片进行交互&#xff1a; 从0开始基于文字提示创建图片(DALL.E 3 and DALL.E2)基于一个新的提示词&#xff0c;通过让模型替换已有图像的某些区域来创建图像的编辑版本;&#xff08;DALL.E2&#xff09;…

2024洗地机哪个牌子好?洗地机十大品牌

洗地机在不同家庭环境中都能发挥其独特的优势&#xff0c;无论是大面积的地板还是狭小的角落&#xff0c;都能轻松应对。 对于有孩子或宠物的家庭&#xff0c;地面上经常会有各种杂物和污渍&#xff0c;洗地机强大的吸力和深度清洁功能&#xff0c;可以迅速清理掉这些脏东西&a…

嵩山为什么称为三水之源

三水指黄河、淮河、济河&#xff0c;这三条河流环绕在嵩山周边。 黄河横亘在嵩山北部&#xff0c;其支流伊洛河从西南方环绕嵩山&#xff0c;然后汇入黄河。济河&#xff0c;古称济水&#xff0c;源自济源王屋山&#xff0c;自身河道在东晋时代被黄河夺占&#xff0c;从此消失。…

C#_库的引用

类库的引用 还可以自己引用类库&#xff1a;解决方案-添加-新建项目 主程序 using System; using System.Windows.Forms; using Tools;namespace ConsoleApp2 {class Program{static void Main(string[] args){//Console.WriteLine("helloword");// Form form ne…

“腾讯云 AI 代码助手”体验

一、“腾讯云 AI 代码助手”体验 1、注册账号并进行实名认证 2、进入开发环境 3、体验javascript简单函数 代码如下&#xff1a; //请写一个两个日期计算的函数 function dateDiff(date1, date2) {return date2.getTime() - date1.getTime(); } var date1 new Date("2…

基于JAVA GUI体育馆管理系统的会员功能

Java GUI即Java图形用户界面&#xff0c;是一种使用图形化元素&#xff08;如窗口、按钮、文本框等&#xff09;来构建用户界面的技术。它基于Java的Swing框架&#xff0c;可以用于创建各种复杂的用户界面&#xff0c;包括窗口、对话框、菜单、按钮、文本框、复选框、下拉列表等…

安卓实现5个底部导航栏切换fragment

步骤&#xff0c;写 5 个 fragment 自定义的类5个布局文件&#xff1a; package com.xmkjsoft.xhgh.fragment;import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup;import androidx.annotation.NonNul…

焦化超低排平台选哪家好?(已解答)

在环保政策日益严格的背景下&#xff0c;焦化行业的超低排放改造成为企业转型升级的必经之路。朗观视觉小编建议&#xff0c;选择合适的焦化超低排平台对于确保改造效果和实现可持续发展具有重要意义。本文将从多个维度为您提供一份全面的评估与选择指南&#xff0c;帮助您在众…

Python_文件操作_学习

目录 一、关于文件的打开和关闭 1. 文件的打开 2.文件的关闭 二、文件的读取 1. 文件的读_r 2. 使用readline 3.使用readlines 三、文件的写入 1. 文本的新建写入 2.文本的追加写入 四、文件的删除和重命名 1.文件的重命名 2.文件的删除 五、文件的定位读写 1.t…

java: 无法访问org.springframework.ldap.core.LdapTemplate

完整错误&#xff1a; java: 无法访问org.springframework.ldap.core.LdapTemplate错误的类文件: /E:/apache-maven-3.6.3/repository/org/springframework/ldap/spring-ldap-core/3.2.3/spring-ldap-core-3.2.3.jar!/org/springframework/ldap/core/LdapTemplate.class类文件具…

微火问答:全域外卖和本地生活服务是同个项目吗?

当前&#xff0c;本地生活赛道火爆程度不断升级&#xff0c;作为其主要板块之一的团购外卖也持续迸发出新的活力。而全域运营的出现无疑是给团购外卖这把正在熊熊燃烧的烈火&#xff0c;又添了一把新柴&#xff01; 所谓全域运营&#xff0c;简单来说&#xff0c;就是指所有领…

英语学习笔记25——Mrs. Smith‘s kitchen

Mrs. Smith’s kitchen 史密斯太太的厨房 词汇 Vocabulary Mrs. 夫人【已婚】 复习&#xff1a;Mr. 先生 全名 / 姓    Mrs. 夫人 全名 / 丈夫的姓    Miss 小姐&#xff08;未婚&#xff09; 全名 / 姓    Ms. 女士 全名 / 姓 查看婚姻状况&#xff0c;可以观察…

【从C++到Java一周速成】章节13:多线程

章节13&#xff1a;多线程 【1】程序、进程、线程【2】创建线程 【1】程序、进程、线程 程序&#xff1a;是为了完成特定任务、用某种语言编写的一组指令的集合&#xff0c;是一段静态的代码。进程&#xff1a;是程序的一次执行过程。正在运行的一个程序&#xff0c;进程作为资…

如何找到docker的run(启动命令)

使用python三方库进行 需要安装python解释器 安装runlike安装包 pip3 install runlike 运行命令 runlike -p <container_name> # 后面可以是容器名和容器id&#xff0c;-p参数是显示自动换行实验 使用docker启动一个jenkins 启动命令为 docker run -d \ -p 9002:80…

初学者都能掌握的操作符(中)

&#xff08;1&#xff09;位操作符&#xff08;& | ^&#xff09; &&#xff1a;&#xff08;按二进制位“与”&#xff09; 也就是两个数的每一位二进制数按照 “与” 的算法&#xff0c;如下&#xff1a; int a 3 ,b 5 ; c a & b; 我们首先写出a和b的二进…

@JsonFormat注解出现日期序列化以及反序列化问题(日期比实际日期少一天)

文章目录 前言一、场景如下所示二、问题分析三、JsonFormat注解是什么以下是 JsonFormat 注解的一些常用属性&#xff1a; 四、解决问题解决方式&#xff1a;只需要指定对应的时区就好效果如下&#xff1a; 五、JsonFormat 注解时出现日期问题总结 前言 在一次的偶然机会下发现…

jmeter服务器性能监控分析工具ServerAgent教程

ServerAgent介绍&#xff1a;支持监控CPU&#xff0c;memory&#xff0c;磁盘&#xff0c;网络等&#xff0c;和JMeter集成&#xff0c;在JMeter的图形界面中&#xff0c;可以实时看到监控的数据&#xff0c;但是&#xff0c;它只能监控硬件资源使用情况。 不能监控应用服务 S…

【正点原子Linux连载】 第四十六章 M.2硬盘驱动实验摘自【正点原子】ATK-DLRK3568嵌入式Linux驱动开发指南

1&#xff09;实验平台&#xff1a;正点原子ATK-DLRK3568开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id731866264428 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/docs/boards/xiaoxitongban 第四十…

数据结构:二叉树与树

一 树的基本概念&#xff1a; 1.树的形状&#xff1a; 2.树的定义&#xff1a; 树是一种非线性的数据结构&#xff0c;它是n(n > 0)个结点的有限集。当n 0时&#xff0c;称为空树。在任意一棵非空树中应满足&#xff1a; 2.1 有且仅有一个特定的称为根的结点。 2.2 当n …