×
单片机 > 单片机程序设计 > 详情

51单片机学习之路 —— 1.8 矩阵键盘

发布时间:2020-06-05 发布时间:
|

1   什么是矩阵键盘?

    这里补一个键盘的定义

    

    

      

    

 

 

    大家看原理图,这就是矩阵键盘(4*4)

    四行 分别连到P3.0 P3.1 P3.2(INT0) P3.3(INT1) (从上到下)

    四列 分别连到P3.4(LCDEN) P3.5(RS) P3.6(WR) P3.7(RD)(左到右)

 

2    

    独立键盘一端固定位低电平! 检验较为方便

    但矩阵键盘不一样,他两边都与单片机的I/O相连接。所以检测方法有些不同

    要人为送出低电平,我们采取以下的检测方法:

    1.  先送一列为低电平,其余几列都为高电平(用此来确定列数)

    2.    然后立即轮流检测每一行是否有低电平(确定行数)

    

    我们写一个函数,用两个变量接受列和行的数据 cord_l cord_h

    P3 = 0xf0;  // 1111  0000

    

    判断是否有按键按下: 例如 S6按下  

    1.

    

    2. 假设S6按下

      

    此刻S6按下导通P3.4接口LCDEN为低电平(可以这样理解是P3.0与P3.4   0&1=0)

      此时的P3口为 1110 0000 (0xe0)

          P3 & 0xf0    (P3和0xf0按位与)

      P3     =  1110  0000

      0xf0  =  1111  0000  

         =  1110  0000 = 0xe0 

       这时成立

       表示有按键按下

 

    3   延时消抖

        

    4  储存值

          

          P3   =  1110  0000

          0xf0    =  1111  0000

          cord_l =  1110   0000

          

          cord_l     =   1110   0000

          0x0f        =   0000   1111

          P3           =   1110   1111  = 1110 1110(按下的是s6 P3.0 与 P3.1 与)

          

          P3       =    1110    1110

          0x0f    =    0000    1111

          cord_h =    0000    1110

          

          cord_l    =  1110   0000

          cord_h   =  0000   1110

            返回值  =  1110   1110    = 0xee

          这样我们就确定了一个值0xee  意味着是s6按下

          

2   程序编写  要求:按顺序按下s6~s21  依次显示0~f   6个数码管静态显示即可

           

 矩阵键盘

        

        

          这里让数码管一开始显示一个-

          用了一个循环让其一直执行

          

          注意switch中的表达式就是我们通过扫描键盘扫描出的键值码。

 

          

          

3   补充:

 

  c语言中的一些运算符      

       

运算符

范例

说明

+

a+b

a变量值和b变量值相加

-

a-b

a变量值和b变量值相减

*

a*b

a变量值乘以b变量值

/

a/b

a变量值除以b变量值

%

a%b

取a变量值除以b变量值的余数

=

a=6

将6设定给a变量,即a变量值等于6

+=

a+=b

等同于a=a+b,将a和b相加的结果又存回a

-=

a-=b

等同于a=a-b,将a和b相减的结果又存回a

*=

a*=b

等同于a=a*b,将a和b相乘的结果又存回a

/=

a/=b

等同于a=a/b,将a和b相除的结果又存回a

%=

a%=b

等同于a=a%b,将a变量值除以b变量值余数又存回a

++

a++

a的值加1,即a=a+1

--

a--

a的值减1,即a=a-1

a>b

测试a的值是否大于b

a

测试a的值是否小于b

=

a=b

测试a的值是否等于于b

>=

a>=b

测试a的值是否大于或等于b

<=

a<=b

测试a的值是否小于或等于b

!=

a!=b

测试a的值是否不等于b

&&

a&&b

a和b做逻辑做AND,两个变量都是“真”,结果才为“真”否则结果为“0”

||

a||b

a和b做逻辑做OR,只要任何一个变量为“真”,结果就为“真”

!a

将a变量的值取反,即原来为“真”则变“假”,为“假”则变为“真”

>> 

a>>b

将a按位右移b个位

<

a<

将a按位左移b个位,右侧补“0”

|

a|b

a和b的按位做OR运算

&

a&b

a和b的按位做AND运算

^

a^b

a和b的按位做XOR运算

~

~a

将a的每一位取反

&

a=&b

将b变量的地址存入a寄存器

*

*a

用来取寄存器所指地址内的值




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
C51 特殊功能寄存器SFR的名称和地址