基于单片机的快速按键识别方法
单片机独立按键识别实验报告
桂林电子科技大学
实验报告
2016-2017 学年第一学期
开课单位海洋信息工程学院
适用年级、专业 14级机械设计制造及其自动化
课程名称《单片微型计算机与接口技术-课内实验》
主讲教师周旋
课程序号 BS1615000_03
课程代码 BS1615000 实验名称《独立按键识别》
学号 1416010516 - 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单片机按键识别的设计
任务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单片机按键检测,单双击、长短按识别
硬件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引脚的状态来检测按键是否按下。
如果读取到的状态是低电平,就表示按键被按下了。
根据需要可以进行后续的处理,如执行相应的操作或触发相应的事件。
需要注意的是,为了稳定读取按键的状态,通常会加上一些硬件电路,如按键消抖电路,以避免按键在按下或释放过程中产生干扰。
这些电路的设计可以根据具体的需求进行调整和优化。
单片机一键多功能按键识别设计
安徽电子信息职业技术学院《单片机应用技术》课程设计报告书题目:一键多功能按键识别设计姓名:xxx专业:电子信息工程技术班级:电信097学号:090301704设计成绩:指导教师:李炎设计完成日期2010年12月26日前言单片机的应用介绍单片机具有体积小、可靠性高、功能强、灵活方便等许多优点,广泛应用于国民经济的各个领域。
智能仪器的应用单片机用于各种仪器仪表,是仪器仪表智能化,可以提高测量的自动化程度和精度;简化仪器仪表的硬件结构,减小体积,提高其性价比。
例如:温度智能控制仪表、医用仪表、数字示波器等。
通信设备的应用单片机与通信技术相结合促使通信设备的智能控制水平大大提高,广泛应用于通信的各个领域。
例如:调制解调器、传真机、复印机、打印机、移动电话、固定电话机等。
(3)家用电器的应用传统的家电配上单片机以后,提高了智能化程度,增加了功能,倍受人们的喜爱;单片机使人类生活更加方便、舒适、丰富多彩。
例如:洗衣机、电冰箱、电子玩具、收录机、微波炉、电视机、录像机、音响设备、程控玩具、游戏机等。
工业控制的应用机电一体化是机械工业发展的方向。
机电一体化产品是集机械技术、微电子技术、计算机技术于一体,具有智能化特征的机电产品,例如微机控制的车床、钻床等。
单片机广泛用于导弹的导航装置、飞机上各种仪表的控制、计算机的网络通信与数据传输、机器人、工业自动化过程的实时控制和数据处理。
在比较复杂的系统中,常采用分布式多机系统。
多机系统一般由若干功能各异的单片机组成,各自完成特定的任务,它们通过串行通信相互联系。
协调工作。
单片机的高可靠性和强抗干扰能力,使它可以置于恶劣课程设计的目的和意义1、目的:(1)掌握单片机中有关指令的使用方法。
(2)掌握循环程序的设计方法。
(3)掌握子程序的应用方法。
(4)掌握延时时间的计算、应用。
课题设计意义计算机与计算机或计算机与终端之间的数据传送可以采用串行通讯和并行通讯二种方式。
由于串行通讯方式具有使用线路少、成本低,特别是在远程传输时,避免了多条线路特性的不一致而被广泛采用。
单片机按键的识别与显示实验报告
单片机按键的识别与显示实验报告
一、实验目的
1.掌握单片机I/O的工作方式;
2.掌握单片机以串行口方式0工作的LED显示;
3.掌握按键的识别和LED显示的编程方法。
二、实验器材
1.G6W仿真器一台。
2.MCS—51实验板一台。
3.PC机一台。
4.电源一台。
三、实验内容及要求
8051单片机的PI口作为8个按键的输入端,构成独立式键盘。
四个LED显示器通过四个串/井移位寄存器74L51644接口至8051的串行口,该串行口应工作在方式0发送状态下,RXD端送出要显示的段码数据,TXD则作为发送时钟来对显示数据进行移位操作。
编写一个计算器程序,当某一键按下时可执行相应的加、减、乘、除运算方式,在四个显示器上显示数学算式和最终计算结果。
注:①通过按键来选择加、减、乘、除四种运算方式。
②输入两个数字均为一位十进制数,可预先放在内存中。
单片机按键矩阵识别(含程序、原理图)
按键矩阵识别技术实验说明如图2所示,把P1端口的8条I/O口分成4条列线4条行线交叉但不接触构成4×4键盘阵列,16个按键放置交叉位置,这样在单片机复杂系统需要较多按键时,这种接法可以节省单片机的硬件资源。
1.结合给出的电路原理图试分析4*4键盘矩阵识别原理,及LED动态扫描原理。
(6分)2.根据分析的键盘矩阵识别原理设计程序实现一下功能:当按下某个按键时在2个七段数码管上显示该按键的编号(注意考虑同时按下多个按键时程序处理过程)、按下某个按键使其弹起时对于消抖情况程序的处理。
(9分)2.0相关原理图如下:3.0实验说明本试验给了1-8键判断方法。
按1-8键中任意键,则数码管显示该键编号。
想想怎样实现1-16个键的判断显示?参考程序见程序范例。
/************************************************************************ *******************描述: 按键距阵识别技术*编写: 秦立春*版本信息: V1.0 2008年4月20日*说明: sp1,sp2,SP3跳线向右;************************************************************************* *****************/#include <reg52.h>#define uchar unsigned char#define uint unsigned int#define ON 0#define OFF 1uchar bdata OUT;sbit JDQ=OUT^0;sbit HF =OUT^1;sbit BZ =OUT^2;sbit AA =OUT^3;sbit BB =OUT^4;sbit CC =OUT^5;sbit DD =OUT^6;sbit X0=P2^0;sbit X1=P2^1;sbit X2=P2^2;sbit X3=P2^3;sbit Y0=P2^4;sbit Y1=P2^5;sbit Y2=P2^6;sbit Y3=P2^7;sbit RS=P1^7;sbit RW=P3^4;sbit E =P3^5;sbit HC574_LE=P3^3;//-----------------------------------------------------void delay(unsigned int t) // 延时函数{for(;t!=0;t--) ;}//------------------------------------------------------ void HC574(void) // 74HC574控制输出;{P0=OUT;HC574_LE=1;delay(2);HC574_LE=0;}//================================================== unsigned char Key_Scan(void){uchar a, key;P2=0xf0;if(!(Y0&&Y1&&Y2&&Y3)){P2=0xf0;delay(200);if(!(Y0&&Y1&&Y2&&Y3)){P2=0xff;X0=0;if(!(Y0&&Y1&&Y2&&Y3)){a=P2;a=(a&0xf0+0x0e);goto pp1;}P2=0xff;X1=0;if(!(Y0&&Y1&&Y2&&Y3)){a=P2;a=(a&0xf0+0x0d);goto pp1;} P2=0xff;X2=0;if(!(Y0&&Y1&&Y2&&Y3)){a=P2;a=(a&0xf0+0x0b);goto pp1;} P2=0xff;X3=0;if(!(Y0&&Y1&&Y2&&Y3)){a=P2;a=(a&0xf0+0x07);goto pp1;} }else a=0xff;}else a=0xff;pp1: key=a;return key;}//-----------------------------------------------------------uchar key(void){uchar k, KEY;KEY=0xff;k=Key_Scan();if(k!=0xff){while(k==Key_Scan());switch(k) // 键码{case 0x7e: KEY=0x04;break; // 4case 0x7d: KEY=0x08;break; // 8case 0x7b: KEY=0x0b;break; //case 0x77: KEY=0x0f;break; //case 0xbe: KEY=0x03;break; // 3case 0xbd: KEY=0x07;break; // 7case 0xbb: KEY=0x0a;break; //case 0xb7: KEY=0x0e;break; //case 0xde: KEY=0x02;break; // 2case 0xdd: KEY=0x06;break; // 6case 0xdb: KEY=0x00;break; // 0case 0xd7: KEY=0x0d;break; //case 0xee: KEY=0x01;break; // 1case 0xed: KEY=0x05;break; // 5case 0xeb: KEY=0x09;break; // 9case 0xe7: KEY=0x0c;break; //default: KEY=0xff;break; // 无键按下}}return KEY;}main(){uchar code shu[12]={0xc0,0xf9,0xa4,0xb0,0x99,//0,1,2,3,4,0x92,0x82,0xf8,0x80,0x90,//5,6,7,8,9,0x00,0xff}; //灭共阳极数码管显示段码 uchar i,k;uchar display[2]={0xff,0xff};RS=0; RW=0; E=0;OUT=0;HC574();delay(60000);while(1){k=key();if(k<=0x0f){display[0]=k/10;display[1]=k%10;}for(i=0;i<2;i++){P1=(~(0X01<<i))&0X7F; P0=shu[display[i]]; delay(100);}}}。
单片机一键多功能按键识别技术
单片机一键多功能按键识别技术在一些单片机系统中,有时候需要采用一些一键多功能的技术,这里我给大家介绍一下。
开关SP1 接在P3.7/RD 管脚上,在AT89S51 单片机的P1 端口接有四个发光二极管,上电的时候,L1 接在P1.0 管脚上的发光二极管在闪烁,当每一次按下开关SP1 的时候,L2 接在P1.1 管脚上的发光二极管在闪烁,再按下开关SP1 的时候,L3 接在P1.2 管脚上的发光二极管在闪烁,再按下开关SP1 的时候,L4 接在P1.3 管脚上的发光二极管在闪烁,再按下开关SP1 的时候,又轮到L1 在闪烁了,如此轮流下去。
这样就实现了具有一键多功能的按键识别技术。
简单吧单片机系统板上硬件连线把“单片机系统”区域中的P3.7/RD 端口连接到“独立式键盘”区域中的SP1 端口上把“单片机系统”区域中的P1.0-P1.4 端口用8 芯排线连接到“八路发光二极管指示模块”区域中的“L1-L8”端口上;要求,P1.0 连接到L1,P1.1 连接到L2,P1.2 连接到L3,P1.3 连接到L4 上。
具体的电路图在单片机论坛51hei51区上有。
欢迎发表您的高见。
本文为郭子喻先生原创作品希望大家支持。
汇编源程序ID EQU 30H SP1 BIT P3.7 L1 BIT P1.0 L2 BIT P1.1 L3 BIT P1.2 L4 BIT P1.3 ORG 0 MOV ID,#00H START: JB K1,REL LCALL DELAY10MS JB K1,REL INC ID MOV A,ID CJNE A,#04,REL MOV ID,#00H REL: JNB K1,$ MOV A,ID CJNE A,#00H,IS0 CPL L1 LCALL DELAY SJMP START IS0: CJNE A,#01H,IS1 CPL L2 LCALL DELAY SJMP START IS1: CJNE A,#02H,IS2 CPL L3 LCALL DELAY SJMP START IS2: CJNE A,#03H,IS3 CPL L4 LCALL DELAY SJMP START IS3: LJMP START DELAY10MS: MOV R6,#20 LOOP1: MOV R7,#248 DJNZ R7,$ DJNZ。
一种实用的单片机按键检测方式
一种实用的单片机按键检测方式《手把手教你学51单片机》第八课讲解按键相关内容的时候,介绍了一种状态检测扫描按键的办法,既可以检测按键,又可以有效消抖。
但是部分同学以前没有接触过类似的思想和方式,所以可能接受起来有点难度,这里我再详细给讲解分析一下,如果教程第八课你已经彻底明白,那么这里可以不用再学习了,如果还模模糊糊,可以再巩固一下。
1、独立按键常用的按键电路有两种形式,独立式按键和矩阵式按键,独立式按键比较简单,它们各自与独立的输入线相连接,如下图所示。
4条输入KeyIn1、KeyIn2、KeyIn3、KeyIn4接到单片机的IO口上,当按键K1按下时,+5V通过电阻R1然后再通过按键K1最终进入GND形成一条通路,那么这条线路的全部电压都加到了R1这个电阻上,KeyIn1这个引脚就和GND等电位,是个低电平。
当松开按键后,线路断开,就不会有电流通过,那么KeyIn1和+5V就应该是等电位,是一个高电平。
我们就可以读取通过KeyIn1这个IO口的高低电平来判断是否有按键按下,独立按键的原理还是很简单的。
2、矩阵按键在某一个系统设计中,如果需要使用很多的按键时,做成独立按键会大量占用IO口,因此我们引入了矩阵按键的设计方式,如下图所示,用了8个IO口实现了16个按键检测的电路。
上图,一共有4组按键,我们只看其中一组,如下图所示。
大家认真看一下,如果KeyOut1输出一个低电平,KeyOut1就相当于是GND,是否相当于4个独立按键呢。
当然这时候KeyOut2、KeyOut3、KeyOut4都必须输出高电平,它们都输出高电平才能保证与它们相连的三路按键不会对这一路产生干扰,大家可以对照两张原理图分析一下。
同理,可以将KeyOut1,KeyOut3,KeyOut4都拉高,把KeyOut2拉低,来读取KEY5到KEY8的值。
关于按键扫描的具体程序部分,大家可以去参考教程,我这里只把一段摘出来给大家讲一下,部分同学对其中一条语句有所疑问。
基于单片机技术的按键扫描电路分析
四、实验验证
为了验证本次演示所介绍的基于单片机技术的按键扫描电路分析的正确性, 我们设计了一个简单的实验:通过单片机控制一个4×4的按键矩阵,实现8个按 键的扫描和识别。实验结果表明,该方法可以有效地实现对多个按键的扫描和识 别。
五、总结
本次演示详细介绍了基于单片机技术的按键扫描电路的基本概念、电路组成、 电路原理、电路板设计以及软件设计等方面的内容。通过实验验证,该方法可以 有效地实现对多个按键的扫描和识别。未来可以进一步研究如何提高按键扫描电 路的性能和稳定性,以及在实际应用中的优化问题。
3、输出控制:经过按键处理后,单片机根据预设的程序对外部设备进行控 制。例如,当按下某个按键时,单片机可以控制一个LED灯的亮灭。
二、单片机按键模块的设计方法
下面以8051单片机为例,介绍一种常见的单片机按键模块设计方法。
1、硬件设计:8051单片机具有 4个并行输入输出口(P0、P1、 P2、P3)
(1)按键抖动:按键抖动是由于按键过程中电压波动引起的现象。为了消 除按键抖动,可以在程序中加入去抖动算法,例如延时检测、两次确认等。
(2)连键:连键是指多个按键同时按下或相互连通的现象。为了避免连键 现象,可以在程序设计时增加防连键处理,例如为每个按键设置唯一的标识符, 同时按下多个按键时只识别其中的一个。
参考内容
在现代电子设备中,按键模块是一种常见的人机交互方式。通过按键,用户 可以向电子设备发送指令,控制设备的运行。单片机作为嵌入式系统的重要分支, 具有体积小、价格低、可靠性高等优点,因此在按键模块设计中具有广泛的应用。
一、单片机按键模块的基本原理
单片机按键模块的工作原理主要包括三个步骤:按键检测、按键处理和输出 控制。
if(KEY != key1) //如果检测到按键状态发生变化 key1 = KEY; //更新输出位状态
51独立按键检测原理
51独立按键检测原理
51单片机独立按键检测原理是利用I/O口的输入功能,将按键的一端接地,另一端接I/O口。
在开始时给I/O口赋高电平,然后不断检测I/O口是否变为低电平。
如果按键按下,相当于I/O口通过按键与地相连,变成低电平,程序一旦检测到I/O口变为低电平就说明按键被按下,然后执行相应的指令。
由于使用的是弹性小按键,在按下时会有微观上的机械抖动,反应到电平就是高、低、高、低,抖动的长短与机械特性有关,一般在5~10ms。
所以在检测键盘是否按下时要加上去抖动操作。
如需了解更多关于51单片机独立按键检测原理的信息,建议查阅相关资料
或咨询专业人士。
单片机原理(按键识别 )实验报告
教育资料
.
while (1) {
if(key==0) {
delay(1000); if(key==0) {
led=~led; while(key==0); }
} } } (2)按键识别 ( 按下灭,再按闪) #include<reg51.h> #define uint unsigned int #define uchar unsigned char sbit led=P2^6; sbit key=P2^7;
.
switch(j) { case 0 : led=0;break; case 1 : led=~led;delay(100);break; default:break; }
}
}
(3)按键识别 ( 按下数码管数值加 1) #include<reg51.h> #define uint unsigned int #define uchar unsigned char uchar code LedCode[]={ 0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,0x00}; uchar DispBuf[8]; sbit led=P2^6;
教育资料
.
if(hour>=24) {
hour=0; }
}
void main() {
uint i=2; while (1) {
if(key==0) {
delay(1000); if(key==0) {
i++; while(key==0); i=i%3;
教育资料
.
} } switch(i)
单片机按键扫描实验报告
单片机按键扫描实验报告
实验目的:
通过实验,掌握单片机按键的原理和按键的扫描方法。
实验器材:
1. STC89C52单片机开发板
2. 按键模块
3. 面包板、杜邦线等
实验原理:
单片机按键的原理是通过按键模块接通或断开单片机的某个IO口,从而改变该IO口的电平状态,由单片机检测到电平状态的改变,从而实现对按键的检测和响应。
按键模块一般采用矩阵按键的形式,通过多个IO口设为输出,多个IO口设为输入的方式,实现对多个按键的扫描检测。
按键模块一般会采用行列扫描的方法,即将按键分为多个行和列,按下按键时,某一行和某一列之间接通,从而改变了IO口的电平状态。
实验步骤:
1. 将按键模块连接到单片机开发板的IO口上。
根据按键模块的接口定义将VCC、GND和各个行列引脚分别连接到开发板上。
2. 根据按键模块的引脚定义,编写单片机程序进行按键的扫描。
通过循环检测每个行引脚和每个列引脚之间的电平变化,来判断按键是否被按下。
3. 在程序中可以通过LED等显示设备来显示按键是否被按下的状态。
4. 执行程序,观察按键是否可以正常检测和响应。
实验结果:
实验完成后,观察到按键的检测和响应正常,按下按键时,LED等显示设备可以正确显示按键被按下的状态。
经过实验,掌握了单片机按键的原理和按键的扫描方法,进一步提升了对单片机设备的理解和应用能力。
基于单片机的快速按键识别方法
基于单片机的快速按键识别方法
刘正翔
【期刊名称】《数字技术与应用》
【年(卷),期】2012(000)008
【摘要】在使用单片机实现的智能控制系统中,快速、可靠的按键识别控制非常关键,一定程度上决定了整个系统的高效运行。
本文在分析传统的按键扫描或识别方
法的基础上,对比各种方法的优缺点,重点讨论一种高效的按键识别方法,并给出该方法对应的程序设计思路,它可快速识别对按键的一次响应,解决多次冗余响应的缺陷。
【总页数】2页(P175-175,177)
【作者】刘正翔
【作者单位】福州职业技术学院,福建福州350108
【正文语种】中文
【中图分类】TP368.12
【相关文献】
1.基于有限状态机的STM32系统按键识别方法 [J], 唐飞;查长礼
2.基于单片机的快速按键识别方法 [J], 刘正翔
3.基于多通道Gabor滤波的手机按键识别方法 [J], 陈志龙;郭太良;姚剑敏;林志贤;徐胜
4.基于状态机的单片机按键短按长按功能的实现 [J], 吴允强;吴由松;
5.基于单片机技术的按键扫描电路分析 [J], 周正贵
因版权原因,仅展示原文概要,查看原文内容请购买。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于单片机的快速按键识别方法
基于单片机的快速按键识别方法
快速按键识别技术是信息处理方面的一个重要领域,应用于各种设备与系统。
在现代电子产品中,按键控制是常用的操作方式之一。
而基于单片机的快速按键识别方法,是目前较为常见的实现方式之一。
一、快速按键识别原理
快速按键识别是通过按键接通时,产生的电信号来判断你所按的按键类型及次数,进而执行对应的操作。
单片机通过外部中断或定时器来进行按键事件的处理和识别,实现快速的数据处理与反馈。
二、快速按键识别系统设计
1.硬件设计
硬件设计主要包括单片机、键盘、蜂鸣器和LED等模块。
其中,单片机为整个系统的核心部件,键盘是输入信号的来源,蜂鸣器是输出信号的反馈,LED则为系统的指示灯。
2.软件设计
软件设计则需要通过编程实现按键事件的处理、识别及反馈,其中主要包括定时器、外部中断、键盘扫描和矩阵按键扫描等
方式。
三、快速按键识别方法
1.定时器扫描法
通过定时器来设定扫描周期,通过中断来响应按下事件,实现按键的检测。
相比其他方法,定时器扫描法的扫描速度较快,适用于对响应速度有要求的场合。
2.(硬件)按键编码法
每个按键使用一个编码计数器的,通过单片机译码器来解码,实现按键的响应。
这种方法根据不同的按键引脚电平来区分每个按键,适合于按键比较多的场合。
3.矩阵按键扫描法
矩阵扫描是常用的键盘扫描方法,遵循矩阵思想,通过行列交叉检测来检测按键的按下,比较简单可靠,适合于按键数量较多的场合。
四、总结
基于单片机的快速按键识别方法应用广泛,可以有效提高按键的响应速度和灵敏度,实现更加智能化的操作。
实现这种技术需要考虑系统的硬件和软件设计,但是相比其他识别方式,它更加高效和快速,更容易向各个方向进行扩展。