基于单片机的快速按键识别方法

合集下载

单片机独立按键识别实验报告

单片机独立按键识别实验报告

桂林电子科技‎大学
实验报告
2016-2017 学年第一学期‎
开课单位海洋信息工程‎学院
适用年级、专业 14级机械设‎计制造及其自‎动化
课程名称《单片微型计算‎机与接口技术‎-课内实验》
主讲教师周旋
课程序号 BS1615‎000_03‎
课程代码 BS1615‎000 实验名称《独立按键识别‎》
学号 141601‎0516 - 17 姓名林亦鹏卢炳荣
独立按键识别‎实验报告
电路采用无源‎蜂鸣器,从P1.5口形成脉冲‎来驱动。

因为单片机开‎机初始化瞬间‎,其I/O口为高电平‎,会有误响动作‎。

单片机的独立‎键盘使用的是‎P1口。

当有键按下时‎,P1口相应位‎为低电平。

、查找资料说明‎按键抖动的原‎因。

、延时程序是怎‎么实现延时的‎?
定义蜂鸣器的‎连接端口--//。

基于单片机的快速按键识别方法

基于单片机的快速按键识别方法

基于单片机的快速按键识别方法摘要:在使用单片机实现的智能控制系统中,快速、可靠的按键识别控制非常关键,一定程度上决定了整个系统的高效运行。

本文在分析传统的按键扫描或识别方法的基础上,对比各种方法的优缺点,重点讨论一种高效的按键识别方法,并给出该方法对应的程序设计思路,它可快速识别对按键的一次响应,解决多次冗余响应的缺陷。

关键词:单片机按键识别一次响应中图分类号:tp368.12 文献标识码:a 文章编号:1007-9416(2012)08-0175-021、引言在以单片机为核心控制的应用系统中,键盘按键能实现向单片机输入数据、传送命令等功能,是单片机应用系统中人工干预单片机的主要手段。

而单片机对按键闭合与否的判断,主要是通过其引脚上的电压高低进行的。

本文以51单片机为例说明,所述键盘按键的硬件电路设计也非常简单——轻触开关的一端接地,另一端连接单片机引脚,该引脚同时接10k上拉电阻[1]。

很明显,单片机引脚呈现高电平表示按键开关断开;反之,引脚电压呈现低电平表示按键开关闭合。

因此,对单片机的按键识别只要通过对其引脚电平的高低状态的检测,即可确认按键按下与否[2]。

众所周知,按键为机械弹性开关,加之按键按下或抬起瞬间均会产生抖动现象,因此消除按键抖动也是整个系统的关键。

为更突出本文的讨论重点,这里不再重点讨论按键去抖的方法。

2、传统按键识别方法2.1 简单的按键识别该按键识别方法虽然简单,但当按下按键的瞬间,却可能让系统多次循环处理同一按键事件,造成cpu资源的浪费。

以下为该方法的程序设计思路,下述中的“按键确实按下”表示延迟10ms后,按键仍处于按下状态。

(1)初始化按键;(2)if(按下按键){延迟10ms去抖;if(按键确实按下){事件处理,退出}}else {未按按键,退出}单片机程序可能是一个循环执行的过程,当按键按下闭合,程序进入按键事件,执行完该事件,若按键仍未被抬起,则程序循环又再一次进入同样的按键事件执行。

识别按键的两种常用方法

识别按键的两种常用方法

识别按键的两种常用方法
在计算机编程中,识别按键有两种常用的方法:
1. 硬件扫描法:
- 工作原理:通过直接读取键盘的硬件信号来检测按键的按下和释放。

- 优点:响应速度快,适用于对实时性要求较高的应用。

- 缺点:需要了解底层硬件,编程较为复杂,且不同键盘可能需要不同的驱动程序。

2. 软件扫描法:
- 工作原理:通过不断查询键盘状态来检测按键的按下和释放。

- 优点:编程相对简单,不需要了解具体的硬件细节,适用于大多数常见的应用。

- 缺点:可能会消耗一定的CPU 资源,因为需要不断地查询键盘状态。

这两种方法各有优缺点,需要根据具体的应用场景和需求来选择。

在现代编程中,通常使用操作系统提供的键盘事件处理机制,它会自动将按键事件通知给应用程序,从而简化了按键识别的过程。

单片机按键识别篇---单击---双击----长按

单片机按键识别篇---单击---双击----长按

单⽚机按键识别篇---单击---双击----长按 最近做⼀任务需要使⽤⼀个按键实现三种功能,分别是按键单击功能,按键双击功能和按键长按功能,可能之前没有接触过这类按键复⽤情况,顶多也只是简单识别单击和长按,没有想过双击以上按键功能,也是绞尽脑汁,想了半天,⼜上⽹看了些例程,算是对于按键的识别有点⼩⼩的了解,感觉这个功能挺实⽤,在此做个随笔。

⼀、思路 1.识别长按操作思路:我们使⽤系统定时器定时,然后让系统每过⼀段时间去扫描按键I/O⼝状态,当扫描到按键按下I/O⼝状态超过设定长按时间的阀值,就判定这次按键操作为“长按”操作; 2.识别单击操作思路:当系统扫描按键按下的I/O⼝时间⼩于我们设定的长按阀值,这时就可能出现两种情况,情况1.可能是单击;情况2.可能是双击;⾸先我们来说情况1,单击操作,这时我们可以检测按键按下后,按键弹起的时间到下次按键按下的时间间隔,当按键按下弹起到下次按键按下的时间超过某个值,则我们判定这次操作为“单击”操作; 3.识别双击操作思路:上⾯刚说的情况1,这次来说情况2,:双击操作,当我们检测按键按弹起后在⼀定时间阀值内,⼜检测到按键I/O⼝有电平变化,则我们判断这次操作为“双击”操作⼆、程序部分unsigned char scan_key(){/*值key_return如下:1---------单击2---------双击3---------长按*/static unsigned char key_state=0; //按键状态static unsigned char state=0;static unsigned char time,time1,time2;static unsigned char key_up_flag=0; //按键弹起标志位static unsigned char key_return;if(Key==0) //按键按下消抖{delay(50);if(Key==0){key_state=0;}}else{delay(50); //按键松开消抖if(Key==1){key_state=1;key_up_flag=0;}}if((state==0)&&(key_state==0)&&(key_up_flag==0)) //这⾥主要防⽌,按键在识别长按后,⼜会执⾏⼀遍单击操作{state=1;time=key_time; //记录按键按下的时间为多少,做标记}if(state==1){time1=key_time;time2=time1-time; //计算按键按下时长if(time2>50) //长按判断{state=2;}if(key_state==1) //按键弹起{state=3;time=key_time; //标志什么时间按键弹起的}}if(state==2) //长按{state=0; //重置状态key_up_flag=1;key_return=3;}if((state==3)&&(key_up_flag==0)){time1=key_time;time2=time1-time; //计算按键弹起后时间if(time2>6) //判断按键弹起后的时间,超过300ms,则说明为单击 {state=0;key_return=1;}else if(key_state==0) //按键弹起后,300ms内⼜有按键按下{state=4;}}if(state==4){if(key_state==1) //按键弹起{state=0;key_return=2;}}return key_return;}void timer0() interrupt 1//定时器T0中断函数⼊⼝{TH0=0X9E; //初值重载TL0=0X57; //定时50ms=50000us; 50000/2=25000key_time++; //50MS++}。

项目3__51单片机按键识别的设计

项目3__51单片机按键识别的设计

任务2
多路按键状态指示的设计
• B) 反转法: 1)行输入、列输出,将列输出端全置为0, 通过接口读取行线电平,判断行的位置 2)列输入、行输出,将行输出端全置为0, 通过接口读取列线电平,判断列的位置 综合两步获取按键号。
任务2
多路按键状态指示的设计
• 3.矩阵式键盘的软件设计 • 无论采用哪种方式,都要编制相应的键盘扫描程 序。在键盘扫描程序中一般要完成以下几个功能: • (1)判断键盘上有无按键按下; • (2)去键的机械抖动影响; • (3)求所按键的键号; • (4)转向键处理程序。
任务2
多路按键状态指示的设计
◇ 知识链接
• 一、矩阵式键盘 • 1.结构和工作原理 • 当输入部分有多个按键时,若仍然采用独立键盘, 必然会占用大量的I/O口,采用矩阵键盘是一种比 较节省资源的方法。矩阵式键盘又称行列式键盘, 往往用于按键数量较多的场合。矩阵式键盘的按 键设置在行与列的交点上。
任务3
任务2
单键控制LED的设计
软件消抖流程图
任务2
单键控制LED的设计
1.提出任务 • 用单键(即独立键盘中的按键)实现对LED进行控制, 每按一次按键时,LED 方式变化一次,用以表示按键控 制的结果。
2.任务分析 • (1)硬件电路设计 • 以8051单片机作为控制电路,按键连接至单片机的P1.4 引脚,另一端接地,P2.0口外接1个采用共阳极连接方式 的发光二极管(LED)和 1个限流电阻,硬件电路原理 图所示。
main() { while(1) { key=keyscan( ); if(key!=16) //显示二进制键 值 P2=~key; else P2=0xff; //无按键不显示
} }

PIC单片机按键检测,单双击、长短按识别

PIC单片机按键检测,单双击、长短按识别

硬件PIC16F883芯片,10个按键,4位数码管。

【芯片引脚】【数码管连接】PORTC连接数码管的8段LED,PORTA<3:0>连接数码管的4个共阴极(控制选通位)。

【按键连接】按键扫描程序在上一篇博文里面有说明,现在还是使用上面的扫面方式(代码都是一样的)。

用记录按键按下和弹起的时间判断是不是长按和双击。

TMR1设置,1:4分频、1:8预分频,计数周期为8uS。

TMR1溢出一次时间为0.524288 S keypress记录TMR1溢出的次数。

keypress大于等于2就跳出检测,认为他是长按(时间为1.048576S)。

keypress<1 且keyrelease <1 ,再次按下的keypress<1就认为是双击。

如下图:KP按键按下,KR按键弹起。

【实现代码】1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 #include<p16f883.inc>__CONFIG _CONFIG1, _LVP_OFF & _FCMEN_ON & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF &_INTRC_OSC_NOCLKOUT__CONFIG _CONFIG2, _WRT_OFF & _BOR21Vudata_shrcounter res 1 ;计数个位counter0 res 1 ;计数十位counter1 res 1 ;扫描按键变量counter2 res 1 ;延时程序微调参数key_state res 1 ;按键状态keynum res 1 ;按键标号swap res 1 ;确认按键转换值29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 keypress res 1keypressbak res 1keyrelease res 1LED1 res 1LED2 res 1LED3 res 1LED4 res 1UDATAcounter3 res 1counter4 res 1sign res 1reset code 0x0000pagesel startgoto start;int_vector code 0x0004codestartbanksel ANSEL ;设置PORTA 为数字模式clrf ANSELbanksel ANSELH ;设置PORTB 为数字模式73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 clrf ANSELHbanksel TRISB ;设置PORTB 为输入模式movlw b '11111111'movwf TRISBbanksel WPUB ;设置PORTB 弱上拉movlw b '11111111'movwf WPUBbanksel OPTION_REGmovlw b '01000101' ;TMR0 64分频movwf OPTION_REGbanksel T1CONmovlw b '10010001' ;打开TMR1,设置1:8预分频,内部时钟源1:4分频movwf T1CONbanksel TRISA ;设置PORTA<3:0>为输出,接数码管的共阴极movlw b '11110000'movwf TRISAbanksel PORTAclrf PORTAbanksel TRISCmovlw b '00000000' ;设置PORTC 为输出,接8段数码管movwf TRISCclrf counter1117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159loopmovlw HIGH Table1movwf PCLATHmovf counter1,0call Table1banksel TRISBmovwf TRISBmovf counter1,0call Table1banksel PORTBmovwf PORTBmovf PORTB,0movwf key_statemovlw b '11001000'iorwf key_state,1movf counter1,0call Table1xorwf key_state,0movwf swapcomf swap,1161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 incfsz swap,1goto case1incf counter1,1movf counter1,0call Table1banksel TRISBmovwf TRISBmovf counter1,0call Table1banksel PORTBmovwf PORTBmovf PORTB,0 ;读取I/O 状态movwf key_statemovlw b '11001000'iorwf key_state,1movf counter1,0call Table1xorwf key_state,0movwf swapcomf swap,1incfsz swap,1205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 goto case2incf counter1,1movf counter1,0call Table1banksel TRISBmovwf TRISBmovf counter1,0call Table1banksel PORTBmovwf PORTBmovf PORTB,0 ;读取I/O 状态movwf key_statemovlw b '11001000'iorwf key_state,1movf counter1,0call Table1xorwf key_state,0movwf swapcomf swap,1incfsz swap,1goto case3249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291incf counter1,1movf counter1,0call Table1banksel TRISBmovwf TRISBmovf counter1,0call Table1banksel PORTBmovwf PORTBmovf PORTB,0 ;读取I/O 状态movwf key_statemovlw b '11001000'iorwf key_state,1movf counter1,0call Table1xorwf key_state,0movwf swapcomf swap,1incfsz swap,1goto case4goto continue293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335case1btfsc key_state,4goto key2movlw d '1'movwf keynumcall DealKeyPressgoto continuekey2btfsc key_state,2goto key3movlw d '2'movwf keynumcall DealKeyPressgoto continuekey3btfsc key_state,1goto key4movlw d '3'movwf keynumcall DealKeyPressgoto continue337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 key4btfsc key_state,0goto continuemovlw d '4'movwf keynumcall DealKeyPressgoto continuecase2;-------------------------------------------------;下面代码实现K10\K8\K5的按键处理btfsc key_state,2goto key8movlw d '10'movwf keynumcall DealKeyPressgoto continue;------------------------------------;处理K8381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 key8btfsc key_state,1goto key5movlw d '8'movwf keynumcall DealKeyPressgoto continue;------------------------------------;处理K5key5btfsc key_state,0goto case3movlw d '5'movwf keynumcall DealKeyPressgoto continuecase3;----------------------------------;处理K6/K9btfsc key_state,1goto key6425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 movlw d '9'movwf keynumcall DealKeyPressgoto continuekey6btfsc key_state,0goto case4movlw d '6'movwf keynumcall DealKeyPressgoto continuecase4;-----------------------------------------;处理K7btfsc key_state,0goto continuemovlw d '7'movwf keynumcall DealKeyPresscontinuecall display469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 clrf counter1goto loop;-----------------------------------;按键去抖,约8mSdelaymovlw d '4'movwf counter2LOOP2banksel TMR0clrf TMR0LOOP1banksel INTCONbtfss INTCON,T0IFgoto LOOP1bcf INTCON,T0IFdecfsz counter2,1goto LOOP2returndelay2513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 incfsz counter3,1goto delay2return;--------------------------------;按键处理程序;DealKeyPressclrf LED1clrf LED2clrf LED3clrf LED4call delaybanksel TMR1Hclrf TMR1Hbanksel TMR1Lclrf TMR1Lclrf keypresspresstimebanksel PIR1btfss PIR1,TMR1IF557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 goto nextbcf PIR1,TMR1IFincf keypressmovlw d '2'subwf keypress,0banksel STATUSbtfsc STATUS,Cgoto longpressnextmovf counter1,0call Table1banksel TRISBmovwf TRISBbanksel PORTBmovwf PORTBmovf PORTB,0 ;读取I/O 状态movwf key_statemovlw b '11001000'iorwf key_state,1movf counter1,0call Table1xorwf key_state,0601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 movwf swapcomf swap,1incfsz swap,1goto presstimecall delaybanksel TMR1Hclrf TMR1Hbanksel TMR1Lclrf TMR1Lclrf keyreleasereleasetimebanksel PIR1btfss PIR1,TMR1IFgoto next1bcf PIR1,TMR1IFincf keyreleasemovlw d '1'subwf keyrelease,0banksel STATUSbtfsc STATUS,C644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 goto clicknext1movf counter1,0call Table1banksel TRISBmovwf TRISBbanksel PORTBmovwf PORTBmovf PORTB,0 ;读取I/O 状态movwf key_statemovlw b '11001000'iorwf key_state,1movf counter1,0call Table1xorwf key_state,0movwf swapcomf swap,1incfsz swap,1goto overgoto releasetimeovercall delay688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 banksel TMR1Hclrf TMR1Hbanksel TMR1Lclrf TMR1Lclrf keypresspresstime1banksel PIR1btfss PIR1,TMR1IFgoto next2bcf PIR1,TMR1IFincf keypressmovlw d '1'subwf keypress,0banksel STATUSbtfsc STATUS,Cgoto clicknext2movf counter1,0call Table1banksel TRISBmovwf TRISBbanksel PORTB732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 movwf PORTBmovf PORTB,0 ;读取I/O 状态movwf key_statemovlw b '11001000'iorwf key_state,1movf counter1,0call Table1xorwf key_state,0movwf swapcomf swap,1incfsz swap,1goto presstime1movf keynum,0 ;双击movwf LED1movlw d '10'movwf LED2incf countergoto backlongpress ;长按movf keynum,0movwf LED2movlw d '10'776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 movwf LED1goto backclick ;单击movf keynum,0movwf LED1movwf LED2backcall CountNumreturn;----------------------------;按键计数;CountNummovlw d '9'subwf counter,0banksel STATUSbtfsc STATUS,Cgoto addincf counter820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 goto over1addincf counter0clrf countermovlw d '10'subwf counter0,0banksel STATUSbtfsc STATUS,Cgoto cleargoto over1clearclrf counter0over1movf counter,0movwf LED4movf counter0,0movwf LED3return864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 ;--------------------------------;显示数码管;displaybanksel PORTAmovlw b '11111110'movwf PORTAmovf LED1,0call Table3banksel PORTCmovwf PORTCcall delay2banksel PORTAmovlw b '11111101'movwf PORTAmovf LED2,0call Table3banksel PORTCmovwf PORTCcall delay2908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951banksel PORTAmovlw b '11111011'movwf PORTAmovf LED3,0call Table3banksel PORTCmovwf PORTCcall delay2banksel PORTAmovlw b '11110111'movwf PORTAmovf LED4,0call Table3banksel PORTCmovwf PORTCcall delay2return;----------------------;Table 真值表;952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 Table1 ;PORTB 、TRISB 扫描配置信息ADDWF PCL,fRETLW B '11111111'RETLW B '11101111'RETLW B '11111011'RETLW B '11111101'Table3 ;PORTC 设置,数码管真值表ADDWF PCL,f; RETLW B '01001001' ;三条横线RETLW B '10111111' ;0RETLW B '00000110' ;1RETLW B '01011011' ;2RETLW B '01001111' ;3RETLW B '01100110' ;4RETLW B '01101101' ;5RETLW B '01111101' ;6RETLW B '00000111' ;7RETLW B '01111111' ;8RETLW B '01101111' ;9RETLW B '00000000' ;黑屏end长按效果——3、4位数码管计数一直加,1位数码管熄灭,2位数码管显示按键编号;双击效果——3、4位数码管计数增加2,2位数码管熄灭,1位数码管显示按键编号;单击效果——1、2数码管显示按键编号,3、4位数码管计数增加1。

一键多功能按键识别技术

一键多功能按键识别技术

一键多功能按键识别技术1.实验任务如图所示,开关SP1接在RD管脚上,在AT89S51单片机的P1端口接有四个发光二极管,上电的时候,L1接在管脚上的发光二极管在闪烁,当每一次按下开关SP1的时候,L2接在管脚上的发光二极管在闪烁,再按下开关SP1的时候,L3接在管脚上的发光二极管在闪烁,再按下开关SP1的时候,L4接在管脚上的发光二极管在闪烁,再按下开关SP1的时候,又轮到L1在闪烁了,如此连番下去。

2.电路原理图图3.系统板上硬件连线(1.把“单片机系统”区域中的RD端口连接到“独立式键盘”区域中的SP1端口上;(2.把“单片机系统”区域中的-端口用8芯排线连接到“八路发光二极管指示模块”区域中的“L1-L8”端口上;要求,连接到L1,连接到L2,连接到L3,连接到L4上。

4.程序设计方式(1.设计思想由来在咱们生活中,咱们很容易通过那个叫张三,那个叫李四,另外一个是王五;那是因为每一个人有不同的名子,咱们就专门快认出,一样,关于要通过一个按键来识别每种不同的功能,咱们给每一个不同的功能模块用不同的ID号标识,如此,每按下一次按键,ID的值是不相同的,因此单片机就很容易识别不同功能的身份了。

(2.设计方式从上面的要求咱们能够看出,L1到L4发光二极管在每一个时刻的闪烁的时刻是受开关SP1来操纵,咱们给L1到L4闪烁的时段概念出不同的ID号,当L1在闪烁时,ID=0;当L2在闪烁时,ID=1;当L3在闪烁时,ID=2;当L4在闪烁时,ID=3;很显然,只要每次按下开关K1时,别离给出不同的ID号咱们就能够够完成上面的任务了。

下面给出有关程序设计的框图。

5.程序框图图6.汇编源程序ID EQU 30HSP1 BIT PL1 BIT PL2 BIT PL3 BIT PL4 BITORG 0MOV ID,#00HSTART: JB K1,REL LCALL DELAY10MSJB K1,RELINC IDMOV A,IDCJNE A,#04,RELMOV ID,#00HREL: JNB K1,$MOV A,IDCJNE A,#00H,IS0CPL L1LCALL DELAYSJMP STARTIS0: CJNE A,#01H,IS1 CPL L2LCALL DELAYSJMP STARTIS1: CJNE A,#02H,IS2 CPL L3LCALL DELAYSJMP STARTIS2: CJNE A,#03H,IS3 CPL L4LCALL DELAYSJMP STARTIS3: LJMP START DELAY10MS: MOV R6,#20 LOOP1: MOV R7,#248 DJNZ R7,$DJNZ R6,LOOP1RETDELAY: MOV R5,#20 LOOP2: LCALL DELAY10MS DJNZ R5,LOOP2RETEND7. C语言源程序#include <> unsigned char ID; void delay10ms(void) {unsigned char i,j; for(i=20;i>0;i--)for(j=248;j>0;j--); }void delay02s(void) {unsigned char i;for(i=20;i>0;i--) {delay10ms();}}void main(void){ while(1){ if(P3_7==0) {delay10ms();if(P3_7==0){ID++;if(ID==4){ID=0;}while(P3_7==0);}}switch(ID){ case 0:P1_0=~P1_0;delay02s();break;case 1:P1_1=~P1_1;delay02s();break;case 2:P1_2=~P1_2;delay02s();break;case 3:P1_3=~P1_3; delay02s(); break;}}}。

单片机检测按键的原理

单片机检测按键的原理

单片机检测按键的原理
单片机检测按键的原理是通过使用GPIO(General Purpose Input/Output)引脚来读取按键状态。

GPIO引脚可以用作输入
模式,可以检测外部信号的变化。

在单片机中,将按键接到一个GPIO引脚,并将该引脚设置为
输入模式。

然后通过软件循环不断地读取该引脚的状态。

在正常情况下,GPIO引脚的电平是高电平,表示按键未按下。

当按键按下后,GPIO引脚的电平变为低电平,表示按键被按
下了。

单片机通过不断地读取GPIO引脚的状态来检测按键是否按下。

如果读取到的状态是低电平,就表示按键被按下了。

根据需要可以进行后续的处理,如执行相应的操作或触发相应的事件。

需要注意的是,为了稳定读取按键的状态,通常会加上一些硬件电路,如按键消抖电路,以避免按键在按下或释放过程中产生干扰。

这些电路的设计可以根据具体的需求进行调整和优化。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于单片机的快速按键识别方法
基于单片机的快速按键识别方法
快速按键识别技术是信息处理方面的一个重要领域,应用于各种设备与系统。

在现代电子产品中,按键控制是常用的操作方式之一。

而基于单片机的快速按键识别方法,是目前较为常见的实现方式之一。

一、快速按键识别原理
快速按键识别是通过按键接通时,产生的电信号来判断你所按的按键类型及次数,进而执行对应的操作。

单片机通过外部中断或定时器来进行按键事件的处理和识别,实现快速的数据处理与反馈。

二、快速按键识别系统设计
1.硬件设计
硬件设计主要包括单片机、键盘、蜂鸣器和LED等模块。

其中,单片机为整个系统的核心部件,键盘是输入信号的来源,蜂鸣器是输出信号的反馈,LED则为系统的指示灯。

2.软件设计
软件设计则需要通过编程实现按键事件的处理、识别及反馈,其中主要包括定时器、外部中断、键盘扫描和矩阵按键扫描等
方式。

三、快速按键识别方法
1.定时器扫描法
通过定时器来设定扫描周期,通过中断来响应按下事件,实现按键的检测。

相比其他方法,定时器扫描法的扫描速度较快,适用于对响应速度有要求的场合。

2.(硬件)按键编码法
每个按键使用一个编码计数器的,通过单片机译码器来解码,实现按键的响应。

这种方法根据不同的按键引脚电平来区分每个按键,适合于按键比较多的场合。

3.矩阵按键扫描法
矩阵扫描是常用的键盘扫描方法,遵循矩阵思想,通过行列交叉检测来检测按键的按下,比较简单可靠,适合于按键数量较多的场合。

四、总结
基于单片机的快速按键识别方法应用广泛,可以有效提高按键的响应速度和灵敏度,实现更加智能化的操作。

实现这种技术需要考虑系统的硬件和软件设计,但是相比其他识别方式,它更加高效和快速,更容易向各个方向进行扩展。

相关文档
最新文档