单片机:按键(使用中断)控制数码管的数字加减(c语言实现)

2023-10-26

本实验的目的:

使用中断实现通过编号为8和C的按键控制数码管数字的加减,加至15之后再循环到0,减到0之后保持0不变。

#include <reg52.h>


sbit WEI=P2^7;
sbit DUAN=P2^6;

void delay(int t)
{
    while(t--);
}
unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码



unsigned char KeyScan(void)  //键盘扫描函数,使用行列逐级扫描法
{
 unsigned char Val;
 P3=0xf0;//高四位置高,低四位拉低
 if(P3!=0xf0)//表示有按键按下
   {
    //DelayMs(10);  //去抖
	if(P3!=0xf0)
	  {           //表示有按键按下
    	P3=0xfe; //检测第一行
		if(P3!=0xfe)
	  		{
			  Val=P3&0xf0;
	  	      Val+=0x0e;
	  		  while(P3!=0xfe);
		
			  while(P3!=0xfe); 
	     	  return Val;
	        }
        P3=0xfd; //检测第二行
		if(P3!=0xfd)
	  		{
			  Val=P3&0xf0;
	  	      Val+=0x0d;
	  		  while(P3!=0xfd);
		
			  while(P3!=0xfd);
	     	  return Val;
	        }
    	P3=0xfb; //检测第三行
		if(P3!=0xfb)
	  		{
			  Val=P3&0xf0;
	  	      Val+=0x0b;
	  		  while(P3!=0xfb);
		
			  while(P3!=0xfb);
	     	  return Val;
	        }
    	P3=0xf7; //检测第四行
		if(P3!=0xf7)
	  		{
			  Val=P3&0xf0;
	  	      Val+=0x07;
	  		  while(P3!=0xf7);
		
			  while(P3!=0xf7);
	     	  return Val;
	        }
     }
   }
  return 0xff;
}

/*------------------------------------------------
         按键值处理函数,返回扫键值
------------------------------------------------*/
unsigned char KeyPro(void)
{
 switch(KeyScan())
 {
  case 0xee:return 0;break;//0 按下相应的键显示相对应的码值
  case 0xde:return 1;break;//1
  case 0xbe:return 2;break;//2
  case 0x7e:return 3;break;//3
  case 0xed:return 4;break;//4
  case 0xdd:return 5;break;//5
  case 0xbd:return 6;break;//6
  case 0x7d:return 7;break;//7
  case 0xeb:return 8;break;//8
  case 0xdb:return 9;break;//9
  case 0xbb:return 10;break;//a
  case 0x7b:return 11;break;//b
  case 0xe7:return 12;break;//c
  case 0xd7:return 13;break;//d
  case 0xb7:return 14;break;//e
  case 0x77:return 15;break;//f
  default:return 0xff;break;
 }
}
  
//第一个参数i代表控制第几个数码管,n代表要显示的数字
void Screen1(int i,int n)
{
    int high;
     P0=0;
     DUAN=1;
	 DUAN=0;
     
	 
	 high=n/10;
    
      WEI=1;
     P0=dofly_WeiMa[i];
     WEI=0;
     
	 DUAN=1;
     P0=dofly_DuanMa[high]; 
         
     DUAN=0;

}

void Screen2(int i,int n)
{
      int lower;
      P0=0;
      DUAN=1;
	  DUAN=0;
     
	  lower=n%10;
	  WEI=1;  
     P0=dofly_WeiMa[i];
       
     WEI=0;
      
	 DUAN=1; 
     P0=dofly_DuanMa[lower]; 
        
     DUAN=0;

	
}

int num;
int Key_push;
int flag;
int main()
{
  	num=0;
  	WEI=0;
  	DUAN=0;

	EA=1;          
  	EX0=1;        
  	IT0=0;
        
    EX1=1;        
  	IT1=0;
	
	flag=0;
   while(1)
   {
        if(flag && num>9)
        {
		  Screen1(6,num);
		  flag=0;
		 }
		else
		{
		  Screen2(7,num);
		  flag=1;
		 }
        Key_push=KeyPro();
	}
   
      return 0;
}

//外部中断处理
void inter_sub() interrupt 0 using 1
{

   if(Key_push==8)
   {
     if(num>0)
	 num--;
   }
   Key_push=0;

}

void inter_add() interrupt 2 using 1
{

   if(Key_push==12)
   {
     num++;
	 if(num==16)
	 num=0;

   }
   Key_push=0;
}







本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单片机:按键(使用中断)控制数码管的数字加减(c语言实现) 的相关文章

  • 基于卷积的图像分类识别(一):AlexNet

    本专栏介绍基于深度学习进行图像识别的经典和前沿模型 将持续更新 包括不仅限于 AlexNet ZFNet VGG GoogLeNet ResNet DenseNet SENet MobileNet ShuffleNet Eifficient
  • 对一个多维数组随机添加高斯噪音

    这是对上一篇对一个数组随机赋零的提升版 mu 0 sigma 0 12 for i in range 17 有17列数据 a date iloc i i 1 取出某一列 a np array a index np arange len a
  • CUnit例子

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 关于CUnit的安装请自行百度 我的系统 fedora22 64bit 我的CUnit的头文件在 usr include CUnit 库文件在 usr lib64 文件 l
  • Scene窗口—Scene视图导航

    Scene 视图导航 Scene 视图具有一组可用于快速有效移动的导航控件 场景视图辅助图标 场景视图辅助图标 Scene Gizmo 位于 Scene 视图的右上角 此控件用于显示 Scene 视图摄像机的当前方向 并允许快速修改视角和投
  • 部署CNI网络插件 The connection to the server raw.githubusercontent.com was refused - did you specify the r

    访问不了 解决方案 1 找到域名对应的ip地址 域名ip查询链接链接 http ip tool chinaz com 2 etc hosts中添加主机ip映射信息 3 重新获取 kubectl apply f https raw githu
  • Android 13.0 Launcher3定制之双层改单层(去掉抽屉式三)

    1 概述 在13 0的系统产品开发中 对于在Launcher3中的抽屉模式中 系统默认的就是抽屉单层模式 但是在很多产品中需要默认为 单层模式 就是要求去掉双层抽屉模式 接下来看下如何继续实现去掉抽屉双层模式 来变成单层模式第三节 2 La
  • Centos彻底删除文件夹、文件命令

    centos彻底删除文件夹 文件命令 centos彻底删除文件夹 文件命令 centos 新建 删除 移动 复制等命令 1 新建文件夹 mkdir 文件名 新建一个名为test的文件夹在home下 view source1 mkdir ho
  • 谷歌身份验证器二维码

    otpauth totp ACCOUNT secret SECRET issuer NAME ACCOUNT账户名称 SECRET密钥 NAME发布者 公司 网站的名称 e g otpauth totp yimcarson secret V

随机推荐

  • 接口测试时遇到接口加密了该如何处理?

    对明文编码生成信息摘要 以防止被篡改 比如MD5使用的是Hash算法 无论多长的输入 MD5都会输出长度为128bits的一个串 摘要算法不要秘钥 客户端和服务端采用相同的摘要算法即可针对同一段明文获取一致的密文 对称加密 对称加密算法是共
  • 冒泡排序算法的Java实现及优化

    冒泡排序是一种简单但效率较低的排序算法 它通过多次交换相邻元素的位置来实现排序 本篇博客将介绍如何使用Java编程语言实现冒泡排序算法 并对其进行优化 首先 让我们来了解一下冒泡排序的基本原理 冒泡排序的思想是从数组的起始位置开始 比较相邻
  • Java 8 Stream 流用法及语法

    Java 8 Stream 流用法 1 简介 Stream流 最全的用法 Stream 能用来干什么 用来处理集合 通过 使用Stream API 对集合数据进行操作 就类似于使用 SQL 执行的数据库查询 Stream API 提供了一种
  • 统计学——卡方检验和卡方分布

    什么是卡方检验 卡方检验是一种用途很广的计数资料的假设检验方法 它属于非参数检验的范畴 主要是比较两个及两个以上样本率 构成比 以及两个分类变量的关联性分析 其根本思想就是在于比较理论频数和实际频数的吻合程度或拟合优度问题 它在分类资料统计
  • 目标检测标注原则

    算力和数据是影响深度学习应用效果的两个关键因素 在算力满足条件的情况下 为了到达更好的效果 我们需要将海量 高质量的素材数据喂给神经网络 训练出高精度的网络模型 吴恩达在深度学习公开课中提到 在算力满足要求的前提下 模型效果会随着素材数量的
  • vue事件绑定、事件参数、事件修饰符、表单双向绑定、监听器、计算属性

    目录 事件绑定 事件参数 事件修饰符 表单 watch 监听器 监听属性 computed 计算属性 面试题 事件机制 概述 在dom阶段 我们已经讲述了事件机制的特点 事件三要素 事件绑定 事件流 事件对象 事件代理 事件类型 这些概念在
  • ISAKMP - 安全关联协商

    前面说过 ISAKMP主要有三个过程 SA协商 密钥交换和认证 本篇主要讨论SA协商 首先要明白一个问题 为什么需要协商 为什么协议不规定使用某种特定的算法 这样实现上可以变得简单很多 要回答这个问题 我们必须全面的审视网络通信的环境 所有
  • Redis中常用命令:基本+五种基本类型(string、list、hash、set、zset)+三种特殊类型(geospatial、hyperloglog、bitmap)

    redis的命令有很多 命令不区分大小写 如下是一些常用的命令 可以通过官网 命令来学习使用更多的命令 例如 1 基本命令 选择数据库select 编号 redis默认的数据库有16个 编号从0 15 默认使用0号数据库 在配置文件中可查看
  • Elasticsearch(三)使用 Kibana 操作 ES

    文章目录 下载 Kibana 镜像 启动 Kibana 容器 索引 分片和副本 索引 索引分片 索引副本 创建索引 映射 数据结构 字段的数据类型 创建映射 查看映射 添加文档 删除文档 删除索引 下载 Kibana 镜像 docker p
  • Deep Java Library(DJL)上手指南

    Deep Java Library DJL https djl ai 是一个Java语言编写的深度学习库 平台 支持各种已有的模型直接导入 受益于Java的跨平台和高性能 相对Python DJL可以很容易部署和高效率运行 尤其是推理 首先
  • uc3842改可调电源教程_《学习笔记》--DC/DC电源电路设计实例

    1 设计概述 利用LTC3704实现3 3V 1 5V的转换 最大输出电流1A LTC3704是一款支持正向电源电压转换为负向电源电压的DC DC电源芯片 支持的输入端电源电压范围是2 5V 36V 输出端电源电压可调 2 引脚介绍 VIN
  • 若依前端后端框架 分离切换用户问题解决!学不会得找我!!!

    笔者最近遇到一个问题 就是有主账号一个字段 有多个从账号 基于这个目的用户表登录名是从账号得登录名 而有一个字段为主账号 识别是这个人 若依前后端 看了官网 都是用userName去鉴权 然后生成token和JWT数据 所有userName
  • todolist 案例 JavaScript

    css样式 body margin 0 padding 0 font size 16px background CDCDCD header height 50px background 333 background rgba 47 47 4
  • VUE 巧用$attrs和inheritAttrs提高组件的可扩展性

    VUE 巧用 attrs和inheritAttrs提高组件的可扩展性 前言 在平时创建组件时 一般使用的是利用props传值 然后通过传入的值再赋给标签的方式 来控制组件里的 这种方法在使用时的可扩展性不大 很难通过外部来动态的往组件内部添
  • java学习笔记(第7天:形参和返回值)

    目录 一 形参和返回值都是基本类型 二 类名作为形参和返回值 三 抽象类作为形参和返回值 四 接口作为形参和返回值 一 形参和返回值都是基本类型 这里比较简单 放一个不确定参数数量的例子玩玩 package Demo public clas
  • 关于Unity游戏开发场景切换:Time.timeScale的捣乱

    在制作场景切换功能的时候 我用的是SceneManager LoadScene函数 从主界面场景切换到关卡1场景 从关卡1场景切换到关卡2场景都是没有问题的 但是 当我在点击Pause按钮来到暂停界面 点击Back Menu按钮准备回到主界
  • LR和线性回归的区别与联系

    区别 区别 线性回归 liner regression LR logistics regression 构建方法 最小二乘法 似然函数 解决问题 主要解决回归问题 也可以用来分类 但是鲁棒性差 解决分类问题 输出 输出实数域上连续值 输出值
  • 在#define中使用参数

    在 define中使用参数 在 define中使用参数可以创建外形和作用与函数类似的类函数宏 例如 define SQUARE X X X 在程序中可以这样用 z SQUARE 2 这看上去像函数调用 但它的行为与函数调用完全不同 预处理器
  • 网关Gateway-快速上手

    gateway网关官方文档 https docs spring io spring cloud gateway docs current reference html 网关的概念 网关作为流量的入口 常用的功能包括路由转发 权限校验 限流等
  • 单片机:按键(使用中断)控制数码管的数字加减(c语言实现)

    本实验的目的 使用中断实现通过编号为8和C的按键控制数码管数字的加减 加至15之后再循环到0 减到0之后保持0不变 include