#C51按键处理(外部中断的应用)

发布者:量子启示最新更新时间:2022-09-15 来源: csdn关键字:C51  按键处理  外部中断 手机看文章 扫描二维码
随时随地手机看文章

前言

了解外部中断触发方式及响应处理

样例:外部中断INT0 && INT1处理按键事件


提示:以下是本篇文章正文内容,下面案例可供参考


一、场景

样例功能:INT0按下计数+1,INT1按下计数-1,显示范围0~9999

在这里插入图片描述

二、编程实现

1.主函数:

开机界面显示默认初值1234,3s后进入按键检测,默认0000

变量PowerOnTimeCnt 在T0定时中断服务函数中执行++


void main()

{

INIT();

EA = 1;

while(PowerOnTimeCnt < 3000) //开机画面1234后开始显示0000,按键处理

{

P1 = 0Xfe; //test

}

while(1)

{

// ADC_Convert();

// Uart_Function();

Dis_Function();

Key_Exchange();

}

}


2.外部中断初始化


void EX0Init(void)

{

IT0 = 1; //外部中断0触发方式 0:电平触发(低电平有效)1:边沿触发(高->低负跳变)

EX0 = 1; //允许外部中断0中断

}


void EX1Init(void)

{

IT1 = 1; //外部中断1触发方式 0:电平触发(低电平有效)1:边沿触发(高->低负跳变)

EX1 = 1; //允许外部中断1中断

}


3.外部中断服务函数


void Ex0_ISR() interrupt 0

{

// fKeyEx0 = 1;

// if(vKeyEx0Cnt > 1) //消抖,有时按键检测不到

// {

// vKeyEx0Cnt = 0;

// fKeyEx0 = 0;

Delay_xms(4); //简单延时消抖

if(!KeyIn_Ex0)

{

KeyCnt_Ex++;

if(KeyCnt_Ex > 9999)

{

KeyCnt_Ex = 0;

}

}

// }

}


void Ex1_ISR() interrupt 2

{

// fKeyEx0 = 1;

// if(vKeyEx0Cnt > 1) //消抖,有时按键检测不到

// {

// vKeyEx0Cnt = 0;

// fKeyEx1 = 0;

Delay_xms(4); //简单延时消抖

if(!KeyIn_Ex1)

{

KeyCnt_Ex--;

if(KeyCnt_Ex > 9999)

{

KeyCnt_Ex = 9999;

}

}

// }

}


4.显示处理


SEG_DisBuf[0]  = KeyCnt_Ex / 1000;

SEG_DisBuf[1]  = KeyCnt_Ex / 100 % 10;

SEG_DisBuf[2]  = KeyCnt_Ex / 10 % 10;

SEG_DisBuf[3]  = KeyCnt_Ex % 10;


P.S.:若是不想显示高位的0,可以做成由高到低判断显示,如:


if(KeyCnt_Ex >= 1000)

SEG_DisBuf[0]  = KeyCnt_Ex / 1000;

else

SEG_DisBuf[0] = 23; //熄灭

if(KeyCnt_Ex >= 100)

……… ………… ………


5.测试结果

在这里插入图片描述

总结

1.样例1中外部中断下的按键消抖一定要处理。仿真环境下不明显,实际电路下,按键按下一次会被加/减多个1。

@1@ 数码管扫描在T0定时中每1ms刷新一次,调试发现选择定时T0/T1中断服务函数中计数vKeyEx0Cnt的方法,此时无论选择延时1~10ms消抖,显示屏稳定,但是按键有时会被漏掉。怀疑是外部中断优先级最高,T0/T1未正常计数ms级,此时按键已经松开。

@2@ 样例中最终选择了占CPU时间的Delay_Xms()软件延时。缺点是按下时界面抖动,但未漏掉按键。(这里后续再优化)


关键字:C51  按键处理  外部中断 引用地址:#C51按键处理(外部中断的应用)

上一篇:#C51中断定时(PWM输出+外部中断频率检测)
下一篇:#C51按键处理(初阶基础)

推荐阅读最新更新时间:2024-11-13 11:10

单片机IO口模拟rs232串口通讯C51程序
此程序已经应用在本人的一个项目中非常稳定,编写过程中参考了51hei网站里面的 http://www.51hei.com/mcu/1541.html 这篇文章.部分子程序节选于此. #include reg52.h #include intrins.h #include math.h #include stdio.h sbit BT_SND =P1^5; sbit BT_REC =P1^6; sbit LED =P1^7; bit LED_flage=1; //单片机IO 口模拟232串口通讯程序 //使用两种方式的C程序 占用定时器0 #define MODE_QUICK #define F_TM F0 #defi
[单片机]
Keil C51使用教程---C51 vs 标准C(三)
深入理解并应用C51对标准ANSIC的扩展是学习C51的关键之一。因为大多数扩展功能都是直接针对8051系列CPU硬件的。大致有以下8类: ●8051存储类型及存储区域 ●存储模式 ●存储器类型声明 ●变量类型声明 ●位变量与位寻址 ●特殊功能寄存器(SFR) ●C51指针 ●函数属性 具体说明如下(8031为缺省CPU)。 第一节 Keil C51扩展关键字 C51 V4.0版本有以下扩展关键字(共19个): _at_ idata sfr16 alien interrupt small bdata large _task_
[单片机]
课程设计:矩阵键盘(c51,使用扫描法实现)
//可以比较一下和以前发表的一篇用反转法实现的不同(感觉一下那个更简单) //这种方法是用只用P3口的前高四位来比较,看改变了么(由于比较仓促,没有proteus仿真,不过这是个比较经典的方法,网上有很多这个代码,源自郭天祥的视频和书籍) #include reg52.h #define uchar unsigned char #define uint unsigned int sbit wela=P2^7; sbit dula=P2^6; uchar num,num1; unsigned char code table ={0x3f,0x06,0x5b,0x4f,0x66,0x6d, 0x7d,0x07,0
[单片机]
keilC51 idata xdata pdata code bdata的意思
从数据存储类型来说,8051系列有片内、片外程序存储器,片内、片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类型,分别对应code、data、xdata、idata以及根据51系列特点而设定的pdata类型,使用不同的存储器,将使程序执行效率不同,在编写C51程序时,最好指定变量的存储类型,这样将有利于提高程序执行效率(此问题将在后面专门讲述)。与ANSI-C稍有不同,它只分SAMLL、COMPACT、LARGE模式,各种不同的模式对应不同的实际硬件系统,也将有不同的编译结果。 在51系列中data,idata,xdata,pdata的区别: data:固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的
[单片机]
Keil C51 中的函数指针和再入函数
概述 函数指针是C语言中几个难点之一。由于8051的C编译器的独特要求,函数指针和再入函数有更多的挑战需要克服。主要由于函数变量的传递。 典型的(绝大部分8051芯片)函数变量通过堆栈的入栈和出栈命令来传递。因为8051只有有限的堆栈空间(128字节或更少的64字节),函数变量必须通过不同的方式进行传递。 8051的PL/M-51编译器,介绍在固定的存储空间存储变量的方式。当使用连接器时,程序建立一个调用树,计算出函数变量的互斥空间,然后覆盖它们。这就是连接器的 OVERLAY 指令。 因为PL/M-51不支持函数指针,所以不能实现间接函数调用。然而,C语言中存在这样的问题。连接器知道哪块空间用于存储间接函数的变量。怎样间接加
[单片机]
c51控制双色点阵左移显示与右移显示
;;c51控制双色点阵左移显示与右移显示.;; ;;;程序显示的为6;; ORG 0 AJMP MAIN MAIN: MOV 30H,#00H MOV 31H,#00H MOV 32H,#0FEH MOV 33H,#92H MOV 34H,#92H MOV 35H,#0F2H MOV 36H,#00H MOV 37H,#00H mov 2fh,#7fh MOV 29H,#00H loopm: acall led ACALL DELAY ;; ACALL DELAY ACALL REDL ajmp loopm led: mov r6,#08h loop1: MOV
[单片机]
C51编程经验三则
在单片机的开发应用中,已逐渐开始引入高级语言,C语言就是其中的一种。用惯了汇编的人,总觉得高级语言 可控性 不好,不如汇编那样随心所欲。以下是笔者在C51编程中的几点经验,希望对初学C51者有所帮助。   一、C51热启动代码的编制   工业控制计算机,往往设有看门狗电路,看门狗动作,计算机复位,这就是热启动。热启动时,一般不允许程序从头开始,因为这将使测量或计算值复位,导致系统工作异常。故程序必须判断是热启动还是冷启动。常用的方法是:设定某内存单位为标志位(如0x7f位和0x7e位),启动时首先读该内存单元的内容,如果它等于一个特定的值(例如两个内存单元的都是0xaa),就认为是热启动,否则就是冷启动,程序执行初始化部分,并将0
[单片机]
C51 WARNING L6: XDATA SPACE MEMORY OVERLAP
最近在公司写个小程序,用C51,这个东东可是以前没有用过,不过都是C,问题倒还是不大,就是需要注意一下C51的特殊语法就好了。 话说这一天编译出现了下面的警告信息: WARNING L6: XDATA SPACE MEMORY OVERLAP 虽说警告信息不影响运行,但是放在那里总是不爽,而且是个隐患。于是请教了一下公司同事,把这个问题给解决了。 从字面上的意思来看,这个警告信息说的是xdata空间的内存被覆盖了。C51对于片外变量,可以使用xdata关键字来标识,对于这些变量的操作,当然要比片内变量要慢一点,但是胜在空间比内部变量的空间要大得多,所以在大多数情况下都是使用xdata变量空间的. 那么xdata空间的内存被覆盖到底
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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