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

发布者:晴天7777最新更新时间:2018-05-07 来源: eefocus关键字:单片机  控制数码管  数字加减 手机看文章 扫描二维码
随时随地手机看文章

本实验的目的:

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

#include  

  

  

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;  

}  


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

上一篇:单片机C语言实现数码管控制
下一篇:51单片机:在2位数码管上循环显示00-99,间隔0.5秒

推荐阅读最新更新时间:2024-03-16 16:01

单片机编程中C语言和汇编的差异
最近对比了下C语言和汇编两种语言在单片机领域的差异。汇编作为低级语言,是仅次于机器语言和硬件联系最紧密的语言;而C语言,严格的说也只能算是半个高级语言,相对于其他高级语言来说。这两者比较直观的差异是:汇编语言的实时性非常好,但可读性差,可移植性不强;相反,C语言的可读性强,可移植性高,但实时性比较差。 利用C语言编写单片机程序,不用考虑程序的初始化地址,不用考虑ACC,PSW以及工作寄存器的保护,不用考虑溢出进位CY。而汇编这些都需要考虑到。 今天在编写温度计程序的时候遇到了这个问题,因为以前是用汇编写的,现在翻译成C,在处理负数转换的时候遇到了问题。因为如果温度计转换芯片读出来的是负数,他是以反码的形式表示的,需
[单片机]
基于ARM高速闪存MCU应对广泛嵌入式需求
  由于采用了ARM7TDMI-S内核,LPC2000系列MCU工作频率达60MHz,与其他8-bit产品相比具有更强的功能延展性。同时它借助片上存储器加 模块实现了“零等待访问”高速闪存功能,提高了指令执行的效率。   此外,LPC2000的外设接口非常丰富,包括UART、SPI、I2C、CAN、ADC、 PWM、RTC等。LPC2000系列MCU应用领域非常广泛,从网络通信、 马达控制,到汽车和消费电子都适合于涉足。   嵌入式系统是面向用户、面向产品、面向应用的,它是将先进计算机技术、半导体技术和电子技术以及各行业的具体应用相结合的产物,因此它是一个高度密集、不断创新的知识集成系统。作为嵌入式系统,它必须能够根据应用的需
[嵌入式]
51单片机的内部资源和最小系统解读
1、单片机内部资源 STC89C52:8KFLASH、512字节RAM、32个IO口、3个定时器、1个UART、8个中断源 (1)Flash(硬盘)——程序存储空间 —— 擦写10万次,断电数据不丢失,读写速度慢 (2)RAM(内存)——数据存储空间 —— 断电数据丢失,读写速度快,无限次使用 (3)SFR —— 特殊功能寄存器 2、单片机最小系统 最小系统:最少组件组成单片机可以工作的系统。 三要素: (1)、 电源电路:5V (2)、 晶振电路:11.0592MHZ、两个30PF (3)、 复位电路: P0:开漏输出,必须加上拉电阻 准双向口: 强推挽输出:电流驱动能力强 高阻态 上下拉电阻:上拉电路就是
[单片机]
51<font color='red'>单片机</font>的内部资源和最小系统解读
如何利用单片机从LCD显示屏上读出所测得电阻值
1 前 言 在 电路 测试过程中常常会碰到由于忽略某些小 电阻 的影响引起实验数据与理论值之间存在较大误差,从而影响测试效果例如电感器变压器中往往存在铜电阻,地铁铁轨的电阻;由于其数值较小,一般的指针万用表无法测量出来;通常实验室里会用电桥进行测量,但电桥操作手续较烦,又不能直接读出被测电阻阻值鉴于此,我们采用了单片机,利用单片机的优势设计了该测量仪该测量仪可直接从LCD显示屏上读出所测得的电阻值,测量范围为10~2.9999k,同时可以把测试的数据进行储存,然后经串行口送入上位机,通过上位机的强大功能,可以对所测得的数据进行分析处理该测试仪的测量精度高达±0.1%,并采用四端测量法,电阻值不受引线长短及接触电阻的影响不仅
[单片机]
如何利用<font color='red'>单片机</font>从LCD显示屏上读出所测得电阻值
【51单片机快速入门指南】3.2.1:PWM、呼吸灯与舵机
普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 硬知识 PWM(脉冲宽度调制) 摘自百度百科。 基本原理 控制方式就是对逆变电路开关器件的通断进行控制,使输出端得到一系列幅值相等但宽度不一致的脉冲,用这些脉冲来代替正弦波或所需要的波形。按一定的规则对各脉冲的宽度进行调制,既可改变逆变电路输出电压的大小,也可改变输出频率。 (SPWM)例如,把正弦半波波形分成N等份,就可把正弦半波看成由N个彼此相连的脉冲所组成的波形。这些脉冲宽度相等,都等于 π/n ,但幅值不等,且脉冲顶部不是水平直线
[单片机]
【51<font color='red'>单片机</font>快速入门指南】3.2.1:PWM、呼吸灯与舵机
手把手教学51单片机 | 第五课 独立键盘 矩阵键盘
编码键盘 电脑的键盘 非编码键盘 (1)硬件消抖 (2)软件消抖 独立键盘 线与的关系 先给IO口高电平 用一个if检测IO口高低电平,若按键按下IO口为0(1&0=0)没按下则继续保持高电平 按键在闭合和断开开始 触电会存在抖动的现象 2.矩阵键盘 #include reg52.h #define uint unsigned int #define uchar unsigned char sbit dula=P2^6; sbit wela=P2^7; sbit key1=P3^4; uchar code table ={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7
[单片机]
手把手教学51<font color='red'>单片机</font> | 第五课 独立键盘 矩阵键盘
单片机控制系统的可靠性及电磁兼容
  一般来说,完成单片机的功能设计与制作过程并不非常复杂,系统功能的设计不过是应用系统设计的起点,系统能否在实用中完好无误地实现这些功能是该系统设计更困难的内容。由于实际的工作环境充满各种电磁干扰,极易使控制系统接收干扰信号而产生误动作,从而使整个控制系统陷于混乱乃至瘫痪,导致实验失败和设备损失。因此,一个在实际工程环境中运行的微机应用系统必须具有较强的抗干扰能力,具有电磁兼容(NEC)的性质。所谓电磁兼容是指两个方面的含义:(1)电子系统或设备之间在电磁环境中的相互兼顾。(2)电子系统或设备在电磁环境中能按设计要求正常工作 。既要防止干扰别的系统,又要防止被干扰。      一、电磁干扰的来源      构成干扰必须具备三个主要
[单片机]
<font color='red'>单片机</font><font color='red'>控制</font>系统的可靠性及电磁兼容
Cygnal在片系统单片机的特点与应用
1引言   Cygnal C8051F系列是全集成混合信号在片系统单片机。 在片系统随着半导体生产技术的不断发展,集成度越来越高,对嵌入式控制技术可靠性要求也越来越高而产生的新概念,即 SOC(System on chip),意思是整个系统都高度集成在一个 芯片上。本文通过使用 Cygnal C8051F000制作一个智能故障分析报警仪,介绍Cygnal C8051Fxxx系列全集成混合信号在片系统单片机的特点,及其在智能仪器中的一般使用方法,和一 些需要注意的问题。   故障分析报警仪的原理:从 4个不同点采集电压和电流数据,综合分析,得出故障的原因 和位置,相应地提供报警、显示和电路切除。 2C8051F00
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved