矩阵键盘的调试和8255的使用方法


   首先,我们先来简单的了解一下8255这款芯片,为什么要用8255呢?因为51单片机的I/O口十分有限,很难同时操作矩阵键盘、数码管、点阵和液晶屏等诸多外设,我们从8255的名字就可以了解到它的功能可编程扩展并行接口芯片,简单的说就是可以用它来扩展I/O口。它的引脚图如图1,一共有40个脚,其中3个8位的并行I/O口PA、PB和PC,这些I/O口是与我们的外设直接相连的;还有D0-D7共8个数据口,构成数据总线与我们的单片机相连,还有几个比较重要的口比如A1、A2口用来选择被操作的端口,功能如图2;CS端是片选信号的选择端,读写控制端RD和WR直接与我们的单片机相连,我们不需要设置。因此我们要操作8255时只需要设置A0A1和CS这三个口即可。

 矩阵键盘的调试和8255的使用方法_第1张图片                矩阵键盘的调试和8255的使用方法_第2张图片

1 8255引脚图                      图2  A1 A0口功能

 

  下面回到我们的话题,做一个矩阵键盘,我们先从独立键盘说起,所谓独立键盘就是每个按键的一端接地,另一端接CPU的输入口,当有按键被按下的时候,相应的I/O口便会读取到低电平,通过读取这几个I/O口的值便可以得到键值。原理图如图3,将开关打到1脚,便可以把S2S6S10S14变成独立键盘。所谓矩阵键盘的原理也很简单,就是不通过机械的开关接地,而是将PC7-PC4这几个口轮流“接地”,即分别让这几个口输出低电平,这样就可以达到和接地一样的效果。设置成它们接地之后,便可以通过读取PC3-PC0这四个口的值判断某一行上是否有键按下,这时再根据PC7-PC4口的状态,得到某一列上是否有键按下,通过行值和列值相结合便可以得到被按下的键值。(这里有人可能会问,为什么要将PC7-PC4分别设置成低电平而不是PC3-PC0呢?我们可以根据电路图看到,PC3-PC0通过一个10K的电阻与VCC相连,因此如果你将这几个口设置成低电平,当有按键按下时,单片机读到的值也是高电平。)

矩阵键盘的调试和8255的使用方法_第3张图片 

3 矩阵键盘原理图

 因此,我们要把PC7-PC4这四个口设置成输出,PC3-PC0这四个口设置成输入,其选择控制方式如图4

矩阵键盘的调试和8255的使用方法_第4张图片 

4  8255A方式选择控制字

 

       由图4可以很容易得到我们需要的选择控制字,通过我们开发板的原理图可以看出我们应该把PAPB口设置成输出,即设置成0;根据之前分析的矩阵键盘的原理图可以看出我们应该把D3D0分别设置成01;然后工作方式统一为方式0,因此控制口的值应该是0X81


矩阵键盘的调试和8255的使用方法_第5张图片

   如上图,设置好8255I/O口的工作方式之后,我们便开始对相应口进行操作。理论很简单,但是操作起来便出现了很多问题及测试结果,分享给大家。

1、经测试设置PC口输出时,无论给PC赋的值是0x70还是0x7f,即无论有没有对已经设置成输入模式的PC3-PC0赋值,结果是一样的。

2、这也是花费我时间最多的一个地方,之前我想的是我已经设置了8255PC口的高四位是输出模式,低四位是输入模式,所以我读数据的时候默认它是0,结果读到的数据一直和我的case语句中的选项不对,键盘就没有输出,针对这种情况有两种解决办法,一种是像上图那样,把8255读到的值与0x0f相与,这样就消除掉了它的高四位的影响,注意这时case语句中的选项要是0x0X,不然还是没有反应;另一种方法便是不用管它的高四位,它的高四位只要和你的输出相同即可,例如你设置的输出是0x70,这是PC口读到的值还是0x7开头的,所以相应的case语句中也要设置成0x7开头的。这样便解决了我的问题。

   当然由于时间紧迫,可能我写的 这些还有一些错误,欢迎大家指正!

你可能感兴趣的:(矩阵键盘的调试和8255的使用方法)