4.1 独立键盘检测

2023-11-17

题目:用数码管的前两位显示一个十进制的数,00~59变化,开始显示00,每按下S2键一次,数值加1;每按下S3键一次,数值减1;每按下S4键一次数值归零;按下S5键一次,利用定时器功能使数值开始自动每秒加1,再按下S5键,数值停止自动加1,保持显示原数。

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1=P3^4;
sbit key2=P3^5;
sbit key3=P3^6;
sbit key4=P3^7;

sbit dula=P2^6;        
sbit wela=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};

void delayms(uint);              //声明延迟函数
uchar numt0, num;
void display(uchar numdis)      

//显示函数,display用的是numdis,实际调用display(num),把num带入替代numdis做说明用keyscan函数一直用的num参数,num连接了keyscan()和display()。
{
    uchar shi,ge;
    shi=numdis/10;
    ge=numdis%10;

    dula=1;
    P0=table[shi];
    dula=0;
    P0=0xff;    
    wela=1;
    P0=0xfe;
    wela=0;
    delayms(5);

    dula=1;
    P0=table[ge];
    dula=0;
    P0=0xff;
    wela=1;
    P0=0xfd;
    wela=0;
    delayms(5);    
}

void delayms(uint xms)             //延迟函数
{
    uint i,j;
    for(i=xms;i>0;i--)
        for(j=110;j>0;j--);
}

void init()                                    //初始化函数
{
TMOD=0x01;                             //设置定时器0为工作方式1 (0000 0001)
TH0=(65536-45872)/256;          //装初值,50ms一次中断
TL0=(65536-45872)%256;
EA=1;
ET0=1;                          

//开总中断,开定时器0中断。是不是少一个启动定时器0 TR0=1?不是,因为这次不是直接开始中断执行的。在按一下时候,才开始显示/执行什么的,所以一开始没开中断。
}

//设置一个扫描函数,把4种按键的情况都在这里进行说明,主函数直接调用该keyscan()函数就好了,用的就是num所以不用加参数。按键延迟10ms,再判断按键==0情况。

void keyscan()               
{
if(key1==0)                      //按下key1的时候,num++,数字不断+1,判断num=60时候置为0。
    {
    delayms(10);
        if(key1==0)
        {
        num++;
            if(num==60)          //当到60时重新归0
            num=0;
            while(!key1);         

//等待按键释放。按键释放后才去执行相应的代码,而不是检测到按键就执行。
        }
    }

if(key2==0)               //按下key2的时候,num--,数字不断-1,判断num=0时候置为60
    {
    delayms(10);
        if(key2==0)
        {
        if(num==0)        //当到0时重新归60
        num=60;
        num--;
        while(!key2);
        }
    }

if(key3==0)               //按下key3的时候,num=0 清零
    {
    delayms(10);
        if(key3==0)
        {
        num=0;
        while(!key3);
        }
    }
if(key4==0)              //按下key4的时候,把TR0取反,也就是开始/结束自动计时功能。
    {
    delayms(10);
    if(key4==0)
        {
        while(!key4);
        TR0=~TR0;         //启动或停止定时器0
        }
    }
}

void main()                //主函数,很简单,一个初始化函数,一个while循环,不断的调用keyscan和display就好了。把任务分解成2大块,第一块是数码管显示一个两位数;第二块是按键操作导致的值的变化情况讨论。
{
init();
while(1)
    {
    keyscan();
    display(num);
    }
}

void T0_time() interrupt 1     //设置一个中断定时器,T0定时器,  1s为单位计数;生成的数num在00-59间循环。
{
TH0=(65536-45872)/256;         //装初值
TL0=(65536-45872)%256;
numt0++;
    if(numt0==20)
    {
    numt0=0;
    num++;
    if(num==60)
    num=0;
    }
}

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

4.1 独立键盘检测 的相关文章

  • System.UnauthorizedAccessException: Access to the path is denied

    这个异常一般是操作文件读写时发生 一般有以下四个原因 调用方没有所需的权限 该文件是一个正在使用的可执行文件 路径是一个目录 该文件只读
  • javascript中的数字校验

    javascript限制输入的只能是数字 判断event keyCode的值 并将它限定只能为数字 如果不是数字 则返回错误 如果是数字 则继续 我先介绍验证javascript是否是数字另一种方式 通过下面的函数来实现 function
  • Unity3D之MonoBehaviour

    Unity3D中的MonoBehaviour是一种基于组件的编程架构 用于开发游戏和应用程序 它是Unity引擎中用于创建行为的基类之一 并且可以让你通过重写其方法来定义对象在游戏运行时的行为 首先 在Unity中创建一个游戏对象并向其添加

随机推荐

  • 使用vue+echarts世界地图航线路线

    这是一个vue结合echarts做的船舶轨迹运行线路图 一 安装echarts npm install echarts 二 全局引入 在全局引入 需要在main js文件中 引入echarts import echarts from ech
  • Unity3D模型

    SolidWorks建模导入Unity 前言 使用的版本 SolidWorks导入3DMax 3DMax导入Unity 结尾 前言 本篇主要作为个人经验记录 因项目需要将SW的模型导入Unity中使用 但SW中建模为实体而Unity多为面
  • Java中创建对象时内存中的情况

    public class Phone public String brand public double price public String color public void call String name System out p
  • conda 国内源配置

    修改 condarc show channel urls true channels https mirrors tuna tsinghua edu cn anaconda cloud conda forge https mirrors t
  • Unity中的异步编程【1】—— Unity与async 、 await

    新手在Unity里写东西 一个方法的内容如果写复杂了 容易把Uinty写死 就会卡帧 用流行的话来总结就是 在Update里面活生生把天聊死了 此外 如果新手才入门 不擅长使用消息 事件来进行异步的统筹 一门心思在Update里面实现各种有
  • USB PHY

    USB PHY负责最底层的信号转换 作用类似于网口的PHY 有两种接口 一种是ULPI 一种是UTMI 前者PIN少 后者PIN多 所以如果用ULPI PHY一般外部另接 用UTMI PIN多 一般内置 PHY内置或者外置要看芯片资料 PO
  • 搭建区块链底层网络Fisco-Bcos+WeBase+Ubuntu(保姆级别)

    目录 一 前言 1 所需要准备的环境 Ubuntu20 04 2 具体虚拟机教程请参考手把手教会你安装Ubuntu虚拟机 保姆级教程 pjlpjlpjl的博客 CSDN博客 2 本文章主要讲解 3 所需文件 build chain sh c
  • 2022年数维杯数学建模C题 电动汽车充电站的部署优化策略求解全过程文档及程序

    2022年数维杯数学建模 C题 电动汽车充电站的部署优化策略 原题再现 近年来 随着化石能源的逐渐枯竭和环境污染的不断加剧 电动汽车 EV 作为传统燃油车的主要替代品之一 得到了快速的发展 据国际能源署统计 2019年全球电动私家车已达 7
  • 【Python时间复杂度和空间复杂度】

    时间复杂度和空间复杂度 1 测试运行时间示例 2 时间复杂度 2 1列表数据结构时间复杂度计算 2 2 字典数据结构时间复杂度计算 3 空间复杂度 4 参考链接 算法分析是基于每种算法使用的计算资源量来比较算法 我们比较两个算法 说一个比另
  • 解决阿里推送sdk 3.0以上初始化报“init cloudchannel failed -- errorcode:10212 -- errorMessage:静默连接进程未初始化”的问题

    解决方案如下 Override public void onCreate super onCreate 注意 这句要放到最前面执行 必须是 在 android process channel initCloudChannel this 我的
  • 顺序查找(C语言)

    include
  • 一道面试题就能测出你的JavaScript水平

    function Parent this a 1 this b 1 2 this a this c demo 5 this show function console log this a this b this c demo functi
  • 单片机通信数据延迟问题排查

    1 问题说明 笔者在最近的项目中 发现系统的响应延迟较高 经过排查 排除了单片机运行卡死的问题 2 原因分析 具体排查过程这里就不细致说明了 直接给出排查后原因 任务执行周期规划不合理 导致freertos队列发送接收到的命令有延迟 为了便
  • sublime 代码提示插件

    Sublime Text 2是个相当棒的编辑器 这一点异次元和Lucifr的文章都介绍的很充分了 用了一段时间觉得Sublime确实 性感 而 强大 只是Sublime Text 2毕竟是一款 编辑器 而非 集成开发环境 IDE 在很多ID
  • Vue3.0组件—banner轮播图(渐入渐隐效果)

    Vue3 0组件 banner轮播图 渐入渐隐效果 组件产生 最近遇到一个需求 项目首页banner轮播 开始是直接使用element3 0的el carousel走马灯效果 但是产品觉得切换太快 给用户的体验效果不好 经过多次修改产品给出
  • 【网络编程】应用层协议——HTTP协议

    文章目录 一 HTTP协议基本认识 二 URL的认识 2 1 urlencode和urldecode 三 HTTP协议格式 3 1 HTTP请求与响应格式 3 2 如何保证请求和响应被应用层完整读取 3 3 请求和响应如何做到序列化和反序列
  • 查看用户表空间

    权限大的能查询权限小的内容 dba tablespaces 系统级别的管理员查看的数据字典 dba users 系统级别的管理员查看的数据字典 user tablespaces 普通用户以及系统级别管理查看的数据字典 user users
  • 数学:凸包算法详解

    一 概念 凸包 Convex Hull 是一个计算几何 图形学 中的概念 在一个实数向量空间V中 对于给定集合X 所有包含X的凸集的交集S被称为X的凸包 X的凸包可以用X内所有点 X1 Xn 的线性组合来构造 在二维欧几里得空间中 凸包可想
  • 海思芯片(hi3516dv300)uboot镜像生成过程详解

    1 前言 1 本文介绍的uboot编译过程是基于海思提供SDK包里的uboot源码进行编译 具体的编译参数是根据hi3516dv300芯片来设置的 编译生成的uboot烧录镜像也是用于hi3516dv300芯片的uboot镜像 2 对于Ma
  • 4.1 独立键盘检测

    题目 用数码管的前两位显示一个十进制的数 00 59变化 开始显示00 每按下S2键一次 数值加1 每按下S3键一次 数值减1 每按下S4键一次数值归零 按下S5键一次 利用定时器功能使数值开始自动每秒加1 再按下S5键 数值停止自动加1