独立键盘识别及数码管显示实验

独立键盘识别及数码管显示实验

一、   实验目的

掌握单片机I/O口的输入检测的方法、独立按键的识别方法、键盘消抖等。

学会实时程序的调试技巧。

 

二、   实验原理

我们在手动按键的时候,由于机械抖动或是其它一些非人为的因素很有可能会造成误识别,一般手动按下一次键然后接着释放,按键两片金属膜接触的时间大约为50ms 左右,在按下瞬间到稳定的时间为5-10ms,在松开的瞬间到稳定的时间也为5-10ms,如果我们在首次检测到键被按下后延时10ms 左右再去检测,这时如果是干扰信号将不会被检测到,如果确实是有键被按下,则可确认,以上为按键识别去抖动的原理。

 

三、   实验内容

用数码管的前两位显示一个十进制数,变化范围为00-59,开始时显示00,每按下s2键一次,数值加1;每按下s3键一次,数值减1;每按下s4键一次,数值归零;按下s5键一次,利用定时器功能使数值开始每秒自动加1,再次按下s5键,数值停止自动加1,保持显示原数。

下图中s2-s5分别联接p3.4-p3.7独立键盘识别及数码管显示实验

                图1 实验板键盘电路原理图

 

四、   实验步骤

1 按实验要求在Keil中创建项目,编辑、编译程序。

2 将编译生成的目标码文件(后缀为.Hex)传入实验板中。

3 在实验板上运行程序,观察实验运行结果并记录。

五.实验结果

    shi equ 30h

           gew equ 31h

           wei bit p2.7

           duan bit p2.6

           org 0000h

           jmp main

           key1 bit p3.4

           key2 bit p3.5

           key3 bit p3.6

           key4 bit p3.7

           org 000bh

           jmp time0

           org 0040h

main:   mov p3,#0ffh

          mov tmod,#01h

           mov th0,#(65536-50000)/256

           mov tl0,#(65536-50000)mod 256

           setb ea

           setb et0

           mov dptr,#table

           mov r2,#0

           mov shi,#0

           mov gew,#0

           setb wei

           mov p0,#0ffh

           clr wei

   

m1:        jb key1,m2

           call delay

           jb key1,m2

           inc r2

           cjne r2,#60,i1   

           mov r2,#0 

i1:      jnb key1,$

m2:      jb key2,m3

           call delay

           jb key2,m3

           cjne r2,#0,i2

           mov r2,#60

i2:       dec r2 

         jnb key2,$

m3:       jb key3,m4

           call delay

           jb key3,m4

           mov r2,#0

           jnb key3,$

m4:      jb key4,m5

           call delay

           jb key4,m5

      

           cpl tr0

           jnb key4,$

m5:    call display

           jmp m1

 

display: mov a,r2

           mov b,#10

           div ab

           mov shi,a

           mov gew,b

           setb wei

           mov p0,#0feh

           clr wei

   

           setb duan

           mov a,shi

           movc a,@a+dptr

           mov p0,a

           clr duan

           call delay1ms

 

           mov a,gew

           setb wei

           mov p0,#0fdh

           clr wei

      

           setb duan

           mov a,gew

           movc a,@a+dptr

           mov p0,a

           clr duan

   

delay: mov r4,#20

dl0:       mov r7,#249

           djnz r7,$ 

           djnz r4,dl0

           ret

delay1ms:mov r5,#2

dl:    mov r6,#249

           djnz r6,$ 

           djnz r5,dl

           ret

time0: mov th0,#(65536-50000)/256

           mov tl0,#(65536-50000)mod 256

           inc r3

           cjne r3,#20,tt1

           mov r3,#0

           inc r2

           cjne r2,#60,tt1

           mov r2,#0

tt1:       reti

table: db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh

           end