按键实现加减运算及连续按键检测

发布者:温暖微风最新更新时间:2012-11-10 来源: 21ic 关键字:按键  加减运算  连续按键检测 手机看文章 扫描二维码
随时随地手机看文章

*
注意:如果无法在keil里编译,请删除每一行的所有前导空白
程序效果:若按键0(即7EH)按下,则加1;若按键1(即7DH)按下,
则减1;若按键2(即7BH)按下,则快加,若按键3(77H)按下,则快减。
*/
ORG 0000H
LJMP START
ORG 0030H
START:    MOV 30H,#00  //赋初值
   MOV 31H,#00
   MOV 32H,#01
 
LOOP1:    MOV R2,#04 //循环四次
   MOV R1,#0FEH  //分别为:0FEH ?FDH ?FBH ?F7H
 
LOOP:      MOV A,R1  //赋值,用于暂存A的值
   MOV P0,A   //赋初值
   RL A    //循环左移
   XCH A,R1   //暂存A的值
   MOV A,P0   //读?P0口的值
   LCALL DELAY1  //延时

   CJNE A,#7EH,LOP1  //判断是否有按键按下
   LCALL ADD1    //有,则加1
LOP12:    MOV A,P0   //以下语句是用于判断按键是否松开
   LCALL DELAY1
   CJNE A,#7EH,LOP1
   LCALL DISPLAY
   SJMP LOP12  

LOP1:      CJNE A,#7DH,LOP2
   LCALL SUB1
LOP22:    MOV A,P0
   LCALL DELAY1
   CJNE A,#7DH,LOP2
   LCALL DISPLAY
   SJMP LOP22 
 
LOP2:      CJNE A,#7BH,LOP3  //判断快加的按键按下
   MOV R3,#10   //按下了,下面的语句用于减慢数值变化速度
LOP32:    LCALL DISPLAY
   LCALL DELAY
   DJNZ R3,LOP32
   LCALL ADD1
 
LOP3:      CJNE A,#77H,LOP4
   MOV R4,#10
LOP42:    LCALL DISPLAY
   LCALL DELAY
   DJNZ R4,LOP42
   LCALL SUB1

LOP4:      DJNZ  R2,LOOP
   LCALL DISPLAY
   LJMP LOOP1
//显示子程序   
DISPLAY: MOV DPTR,#TAB  //赋表首地址
   MOV A,#0FFH   
   MOV P1,A    //点亮最右边的数码管
   XCH A,R0   //暂存A的值
   MOV A,30H   //显示个位数
   MOVC A,@A+DPTR
   MOV P2,A
   LCALL DELAY1  //延时
   DEC R0    //减1,用于点亮下一个数码管,准备下次显示
   XCH A,R0

   MOV P1,A
   XCH A,R0
   MOV A,31H
   MOVC A,@A+DPTR
   MOV P2,A
   LCALL DELAY1
   DEC R0
   XCH A,R0

   MOV P1,A
   XCH A,R0
   MOV A,32H
   MOVC A,@A+DPTR
   MOV P2,A
   LCALL DELAY1
   RET
//加子程序
ADD1:      INC 30H  //个位加1
   MOV A,30H //把30H的值赋给A
   CJNE A,#0AH,LAP //判断个位是否加为10
   MOV 30H,#00    //是,则清零

   INC 31H
   MOV A,31H
   CJNE A,#0AH,LAP
   MOV 31H,#00

   INC 32H
   MOV A,32H
   CJNE A,#0AH,LAP
   MOV 32H,#00
LAP:         NOP   //空指令
   RET  //返回
//减子程序
SUB1:      DEC 30H  //个位减1
   MOV A,30H  //把30H的值赋给A
   CJNE A,#0FFH,LSP  //判断30H的值为0后是否在减1
   MOV 30H,#09   //是,则给30H赋9

   DEC 31H
   MOV A,31H
   CJNE A,#0FFH,LSP
   MOV 31H,#09

   DEC 32H
   MOV A,32H
   CJNE A,#0FFH,LSP
   MOV 32H,#09

LSP:         NOP
   RET
//延时子程序,时间大约为2us*20*200=8ms
DELAY:    MOV R6,#20 
DEL2:       MOV R5,#200
DEL3:       DJNZ R5,DEL3
   DJNZ R6,DEL2
   RET
//延时子程序,时间约为:2us*5*250=2.5ms
DELAY1:  MOV R6,#5
DEL4:       MOV R5,#250
DEL5:       DJNZ R5,DEL5
   DJNZ R6,DEL4
   RET
TAB: DB 3FH,06H,5BH,4FH,66H ;数码管显示的数值
      DB 6DH,7DH,07H,7FH,6FH
   END
注意:如果无法在keil里编译,请删除每一行的所有前导空白,

关键字:按键  加减运算  连续按键检测 引用地址:按键实现加减运算及连续按键检测

上一篇:按键与数码管C语言例程
下一篇:用单片机设计15s倒计时器

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

STM32中对Key_GPIO_Config()函数的理解之轮询控制按键LED
STM32中对Key_GPIO_Config()函数的理解(自定义)
[单片机]
STM32中对Key_GPIO_Config()函数的理解之轮询控制<font color='red'>按键</font>LED
S3C6410开发板按键驱动代码分析及测试代码分析
在本文中,我们对S3C6410开发板按键驱动代码的实现过程进行分析,然后通过一个实例对按键功能进行测试。在本文的资源中包含了设备驱动的源码和测试的源码。 一、设备驱动源码分析 按键的设备驱动主要实现了模块的初始化、模块的卸载、设备打开、设备关闭、设备读取、设备阻塞功能。 1、模块初始化 模块的初始化的源码如下所示。 static int __init dev_init(void) { int ret; ret = misc_register(&misc); printk (DEVICE_NAME tinitializedn ); return ret; } 这段代码只实现了一个功能,就是使用mi
[单片机]
带中文字库LCD12864按键菜单设置反白单片机实验程序
带中文字库LCD12864 按键菜单设置反白实验分享 制作出来的实物图如下: 用的是普中的开发板 如果你的也是同型号的普中开发板 直接下载也不能显示 因为我的开发板改电路了 你需要改 #include lcd12864.h 里面的 sbit LCD12864_RS=P2^6; //寄存器选择输入 sbit LCD12864_RW=P2^5; //寄存器选择输入 sbit LCD12864_E=P2^7; //液晶使能控制 sbit LCD12864_PSB=P3^0; //串/并方式控制 sbit LCD12864_RES=P3^2; //数据复位 即可 部分程序(还有些程序在 #inclu
[单片机]
带中文字库LCD12864<font color='red'>按键</font>菜单设置反白单片机实验程序
stm32利用oled显示屏与按键进行PID参数调节实现人机交互
上一个学期在学校做四轮车利用PID实现直线走,在调试过程中,我之前是每改一个参数就下载程序进控制板进行调试,观察车是否偏移来确定pid参数,但是后来我发现这样的效率很慢,经别人提醒后,我自己做了一个小小的人机交互界面,来显示pid的参数以及对pid参数进行调整。 以下是显示效果: 接着我在附上主要代码: // 功能描述 : OLED 7针SPI接口演示例程(STM32F103系列) // 说明: // ---------------------------------------------------------------- // GND 电源地 // VCC 3.
[单片机]
stm32利用oled显示屏与<font color='red'>按键</font>进行PID参数调节实现人机交互
PIC单片机按键控制PWM输出LED灯亮度C语言程序
#include pic.h //调用头文件,可以去PICC软件下去查找PIC16F87XA单片机的头文件 __CONFIG(0x3b31); //定义配置字,晶振类型:XT,启动开门狗,禁止低电压编程 //************************************************************************ #define HC138_A RE2 //定义U6、U7、U8的A为RE2端口 #define HC138_B RE1 //定义U6、U7、U8的B为RE1端口 #define HC138_C RE0 //定义U6、U7、U8的C为RE0端口 //***************
[单片机]
C51 编程,要求按照指定的次序按键
//有个题目,要求顺序按下四个按键。 //如果不按照指定的次序来按,将显示出错误提示。 //要求如下: //第一次、SW1 按住时 D1 亮,松开时 D1 灭(如第一次按的不是 SW1,是SW2、3、4的话,D5 常亮); //第二次、SW2 按住时 D2 亮,松开时 D2 灭(如第二次按的不是 SW2,是SW1、3、4的话,D5 常亮); //第三次、SW3 按住时 D3 亮,松开时 D3 灭(如第三次按的不是 SW3,是SW1、2、4的话,D5 常亮); //第四次、SW4 按住时 D4 亮,松开时 D4 灭(如第四次按的不是 SW4,是SW1、2、3的话,D5 常亮)。 //第四次、当 SW4 松开后 D6 常亮。 /
[单片机]
C51 编程,要求按照指定的次序<font color='red'>按键</font>
STM32按键输入、所需要的C语言复习、时钟系统框图
第一部分: STM32按键输入是我的第二个在STM32 平台上有输入的小实例。思路为,先查询硬件图看清按键是低电平有效还是高电平有效,根据我的开发环境得知四个按键有三个按键是低电平有效,有一个按键是高电平有效。然后设计代码,设计代码之前得分析清楚,按键有两种情况,可持续按键和不可持续按键。可持续按键的意思是,按一下放开后,继续按还会有用,而不可持续按键就不行。 分清按键类型就可以照一般运用外设的三步走战略前进,第一步初始化按键输入时钟,第二步初始化所运用的IO时钟,第三步扫描键盘 初始化时钟选择时钟系统中的高速总线挂载的时钟,APB2所包含的时钟函数RCC_APB2PeriphClockCmd()。具体下面的时钟系统分析会清晰的讲
[单片机]
裸奔程序之外部中断检测按键
开发环境:ADS1.2 实验实验功能:在TQ2440开发板上,利用外部中断模式检测按键是否按下, 如果某按键被按下则点亮对应某个LED。 #include 2440addr.h #include option.h //这个文件中定义了中断服务程序的起始地址 #define LED1_ON (rGPBDAT &=~(1 5)) #define LED1_OFF (rGPBDAT |=(1 5) ) #define LED2_ON (rGPBDAT &=~(1 6)) #define LED2_OFF (rGPBDAT |=(1 6)) #defin
[单片机]
裸奔程序之外部中断<font color='red'>检测</font><font color='red'>按键</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

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

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