单个独立按键依次输入控制数据

2023-10-11 05:04

本文主要是介绍单个独立按键依次输入控制数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

/*-----------------------------------------------

  内容:如计算器输入数据形式相同 从左往右
------------------------------------------------*/
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
/*------------------------------------------------
                    定义按键
------------------------------------------------*/
sbit KEY1=P3^0;  //定义按键输入端口
sbit KEY2=P3^1;
sbit KEY3=P3^2;
sbit KEY4=P3^3;
sbit KEY5=P3^4;
sbit KEY6=P3^5;
sbit KEY7=P3^6;
sbit KEY8=P3^7;

/*------------------------------------------------
                   定义数码管接口
------------------------------------------------*/
#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
sbit LATCH1=P2^2;//定义锁存使能端口 段锁存
sbit LATCH2=P2^3;//                 位锁存

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 TempData[8]; //存储显示值的全局变量
/*------------------------------------------------
                   函数声明
------------------------------------------------*/
void DelayUs2x(unsigned char t);//us级延时函数声明 
void DelayMs(unsigned char t); //ms级延时
void Display(unsigned char FirstBit,unsigned char Num);//数码管显示函数
unsigned char KeyScan(void);//键盘扫描
void Init_Timer0(void);//定时器初始化
/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main (void)
{
unsigned char num,i,j;                  

Init_Timer0();

while (1)         //主循环
  {


 num=KeyScan();
 if(num)
   {
  if(i<8)
    TempData[i]=dofly_DuanMa[num];
    i++;
    if(i==9)//多出一个按键输入为了清屏 原本应该为8
      {
      i=0;
      for(j=0;j<8;j++)//清屏
         TempData[j]=0;
       }
   }    
  }
}
/*------------------------------------------------
 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--)
 {
     //大致延时1mS
     DelayUs2x(245);
     DelayUs2x(245);
 }
}
/*------------------------------------------------
 显示函数,用于动态扫描数码管
 输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示
 如输入0表示从第一个显示。
 Num表示需要显示的位数,如需要显示99两位数值则该值输入2
------------------------------------------------*/
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;          //重新赋值 2ms
 TL0=(65536-2000)%256;
 
 Display(0,8);       // 调用数码管扫描

}

/*------------------------------------------------
            按键扫描函数,返回扫描键值
------------------------------------------------*/
unsigned char KeyScan(void)
{
/********************************************************/  
if(!KEY1)  //如果检测到低电平,说明按键按下
    {
     DelayMs(10); //延时去抖,一般10-20ms
     if(!KEY1)     //再次确认按键是否按下,没有按下则退出
       {
        while(!KEY1);//如果确认按下按键等待按键释放,没有则退出
           {
           return 1;
             }
       }
    }
/********************************************************/  
else if(!KEY2)  //如果检测到低电平,说明按键按下
    {
     DelayMs(10); //延时去抖,一般10-20ms
     if(!KEY2)     //再次确认按键是否按下,没有按下则退出
       {
        while(!KEY2);//如果确认按下按键等待按键释放,没有则退出
           {
           return 2;
             }
       }
    }
/********************************************************/  
else if(!KEY3)  //如果检测到低电平,说明按键按下
    {
     DelayMs(10); //延时去抖,一般10-20ms
     if(!KEY3)     //再次确认按键是否按下,没有按下则退出
       {
        while(!KEY3);//如果确认按下按键等待按键释放,没有则退出
           {
           return 3;
             }
       }
    }
/********************************************************/  
else if(!KEY4)  //如果检测到低电平,说明按键按下
    {
     DelayMs(10); //延时去抖,一般10-20ms
     if(!KEY4)     //再次确认按键是否按下,没有按下则退出
       {
        while(!KEY4);//如果确认按下按键等待按键释放,没有则退出
           {
           return 4;
             }
       }
    }
/********************************************************/  
else if(!KEY5)  //如果检测到低电平,说明按键按下
    {
     DelayMs(10); //延时去抖,一般10-20ms
     if(!KEY5)     //再次确认按键是否按下,没有按下则退出
       {
        while(!KEY5);//如果确认按下按键等待按键释放,没有则退出
           {
           return 5;
             }
       }
    }
/********************************************************/  
else if(!KEY6)  //如果检测到低电平,说明按键按下
    {
     DelayMs(10); //延时去抖,一般10-20ms
     if(!KEY6)     //再次确认按键是否按下,没有按下则退出
       {
        while(!KEY6);//如果确认按下按键等待按键释放,没有则退出
           {
           return 6;
             }
       }
    }
/********************************************************/  
else if(!KEY7)  //如果检测到低电平,说明按键按下
    {
     DelayMs(10); //延时去抖,一般10-20ms
     if(!KEY7)     //再次确认按键是否按下,没有按下则退出
       {
        while(!KEY7);//如果确认按下按键等待按键释放,没有则退出
           {
           return 7;
             }
       }
    }
/********************************************************/  
else if(!KEY8)  //如果检测到低电平,说明按键按下
    {
     DelayMs(10); //延时去抖,一般10-20ms
     if(!KEY8)     //再次确认按键是否按下,没有按下则退出
       {
        while(!KEY8);//如果确认按下按键等待按键释放,没有则退出
           {
           return 8;
             }
       }
    }
/********************************************************/  
else
    return 0;
}
 

这篇关于单个独立按键依次输入控制数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/185716

相关文章

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

poj 2594 二分图最大独立集

题意: 求一张图的最大独立集,这题不同的地方在于,间接相邻的点也可以有一条边,所以用floyd来把间接相邻的边也连起来。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <sta

poj 3692 二分图最大独立集

题意: 幼儿园里,有G个女生和B个男生。 他们中间有女生和女生认识,男生男生认识,也有男生和女生认识的。 现在要选出一些人,使得这里面的人都认识,问最多能选多少人。 解析: 反过来建边,将不认识的男生和女生相连,然后求一个二分图的最大独立集就行了。 下图很直观: 点击打开链接 原图: 现图: 、 代码: #pragma comment(

最大流=最小割=最小点权覆盖集=sum-最大点权独立集

二分图最小点覆盖和最大独立集都可以转化为最大匹配求解。 在这个基础上,把每个点赋予一个非负的权值,这两个问题就转化为:二分图最小点权覆盖和二分图最大点权独立集。   二分图最小点权覆盖     从x或者y集合中选取一些点,使这些点覆盖所有的边,并且选出来的点的权值尽可能小。 建模:     原二分图中的边(u,v)替换为容量为INF的有向边(u,v),设立源点s和汇点t

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

线性因子模型 - 独立分量分析(ICA)篇

序言 线性因子模型是数据分析与机器学习中的一类重要模型,它们通过引入潜变量( latent variables \text{latent variables} latent variables)来更好地表征数据。其中,独立分量分析( ICA \text{ICA} ICA)作为线性因子模型的一种,以其独特的视角和广泛的应用领域而备受关注。 ICA \text{ICA} ICA旨在将观察到的复杂信号

解决Office Word不能切换中文输入

我们在使用WORD的时可能会经常碰到WORD中无法输入中文的情况。因为,虽然我们安装了搜狗输入法,但是到我们在WORD中使用搜狗的输入法的切换中英文的按键的时候会发现根本没有效果,无法将输入法切换成中文的。下面我就介绍一下如何在WORD中把搜狗输入法切换到中文。

当你输入一个网址后都发生什么

原文:http://igoro.com/archive/what-really-happens-when-you-navigate-to-a-url/  作为一个软件开发者,你一定会对网络应用如何工作有一个完整的层次化的认知,同样这里也包括这些应用所用到的技术:像浏览器,HTTP,HTML,网络服务器,需求处理等等。 本文将更深入的研究当你输入一个网址的时候,后台到底发生了一件件什么样的事~

第四次北漂----挣个独立游戏的素材钱

第四次北漂,在智联招聘上,有个小公司主动和我联系。面试了下,决定入职了,osg/osgearth的。月薪两万一。 大跌眼镜的是,我入职后,第一天的工作内容就是接手他的工作,三天后他就离职了。 我之所以考虑入职,是因为 1,该公司有恒歌科技的freex平台源码,可以学学,对以前不懂的解解惑。 2,挣点素材钱,看看张亮002的视频,他用了6000多,在虚幻商城买的吸血鬼游戏相关的素材,可以玩两年。我

笔记本电脑配置:选择独立显卡还是集成显卡

2.4.1  笔记本电脑配置:选择独立显卡还是集成显卡   一般个人用笔记本电脑划分高低档次的方法主要是看CPU的档次和有无独立显卡。由于笔记本电脑的显卡通常设计成不能升级的部件,一旦选择后,显卡的配置就不能再变,而显卡通常会影响是否能玩哪些游戏或影响3D程序的运行速度,因此需要重点考虑。   集成显卡的特点是功耗小、发热量小、显存从内存中分配、价格便宜,适合上网、办公应用、学习、炒