2008-04-07 20:27:00 fishtangjinfu 阅读数 226
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    4000 人正在学习 去看看 朱有鹏

1.     实验任务

如图13所示,利用AT89S51单片机的P0端口的P0.0P0.7连接到一个共阴数码管的ah的笔段上,数码管的公共端接地。在数码管上循环显示09数字,时间间隔0.2秒。

2.     电路原理图

4.7.1

3.     系统板上硬件连线

把“单片机系统”区域中的P0.0/AD0P0.7/AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个数码管的ah端口上;要求:P0.0/AD0a相连,P0.1/AD1b相连,P0.2/AD2c相连,……P0.7/AD7h相连。

4.     程序设计内容

(1.       LED数码显示原理

七段LED显示器内部由七个条形发光二极管和一个小圆点发光二极管组成,根据各管的极管的接线形式,可分成共阴极型和共阳极型。

LED数码管的g~a七个发光二极管因加正电压而发亮,因加零电压而不以发亮,不同亮暗的组合就能形成不同的字形,这种组合称之为字形码,下面给出共阴极的字形码见表2

0

3FH

 

8

7FH

 

1

06H

 

9

6FH

 

2

5BH

 

A

77H

 

3

4FH

 

b

7CH

 

4

66H

 

C

39H

 

5

6DH

 

d

5EH

 

6

7DH

 

E

79H

 

7

07H

 

F

71H

 

(2.       由于显示的数字09的字形码没有规律可循,只能采用查表的方式来完成我们所需的要求了。这样我们按着数字09的顺序,把每个数字的笔段代码按顺序排好!建立的表格如下所示:TABLE DB 3FH06H5BH4FH66H6DH7DH07H7FH6FH

5.程序框图

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4.7.2

6. 汇编源程序

                            ORG 0

START:               MOV R1,#00H

NEXT:                MOV A,R1

                            MOV DPTR,#TABLE

                            MOVC A,@A+DPTR

                            MOV P0,A

                            LCALL DELAY

                            INC R1

                            CJNE R1,#10,NEXT

                            LJMP START

DELAY:              MOV R5,#20

D2:                      MOV R6,#20

D1:                      MOV R7,#248

                            DJNZ R7,$

                            DJNZ R6,D1

                            DJNZ R5,D2

                            RET

TABLE:              DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH

                            END

7. C语言源程序

#include <AT89X51.H>

unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,

                            0x6d,0x7d,0x07,0x7f,0x6f};

unsigned char dispcount;

 

void delay02s(void)

{

  unsigned char i,j,k;

  for(i=20;i>0;i--)

  for(j=20;j>0;j--)

  for(k=248;k>0;k--);

}

 

void main(void)

{

  while(1)

    {

      for(dispcount=0;dispcount<10;dispcount++)

        {

          P0=table[dispcount];

          delay02s();

        }

    }

}  

 
2008-01-17 16:07:00 mybirdsky 阅读数 392
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    4000 人正在学习 去看看 朱有鹏
2006-05-11 09:33:41

字体变小 字体变大
51单片机编程范例(并行I/O口编程范例)
单片机I/O的应用最典型的是通过I/O口与7段LED数码管构成显示电路,我们从常用的LED显示原理开始,详尽讲解利用单片机驱动LED数码管的电路及编程原理,目的在于通过这一编程范例,让初学者了解I/O口的编程原理,意在起举一反三,抛砖引玉的作用。
LED的发光原理,稍有电子技术基础的人士都很清楚,我们不想作过多的介绍,7段LED数码管,则在一定形状的绝缘材料上,利用单只LED组合排列成“8”字型的数码管,分别引出它们的电极,点亮相应的点划来显示出0-9的数字。

LED数码管根据LED的接法不同分为共阴和共阳两类,了解LED的这些特性,对编程是很重要的,因为不同类型的数码管,除了它们的硬件电路有差异外,编程方法也是不同的。右图是共阴和共阳极数码管的内部电路,它们的发光原理是一样的,只是它们的电源极性不同而已。
将多只LED的阴极连在一起即为共阴式,而将多只LED的阳极连在一起即为共阳式。以共阴式为例,如把阴极接地,在相应段的阳极接上正电源,该段即会发光。当然,LED的电流通常较小,一般均需在回路中接上限流电阻。假如我们将"b"和"c"段接上正电源,其它端接地或悬空,那么"b"和"c"段发光,此时,数码管显示将显示数字“1”。而将"a"、"b"、"d"、"e"和"g"段都接上正电源,其它引脚悬空,此时数码管将显示“2”。其它字符的显示原理类同,读者自行分析即可。
LED数码管结构图
左图为实验电路图,我们使用80C51单片机,电容C1、C2和CRY1组成时钟振荡电路,这部分基本无需调试,只要元件可靠即会正常起振。C3和R1为单片机的复位电路,80C51的并行口P1.0-P1.7直接与LED数码管的"a-f"引脚相连,中间接上限流电阻R3-R10。值得一提的是,80C51并行口的输出驱动电流并非很大,为使LED有足够的亮度,LED数码管应选用高亮度的器件。
此外,图中的80C51还可选用C51系列的其它单片机,只要它们的指令系统兼容C51即可正常运行,程序可直接移植,例如选用低价Flash型的AT89C1051或2051(详细技术手册)等,它们的ROM可反复擦写,非常适合作实验用途。
· 程序清单:
01 START: ORG 0100H ;程序起始地址
02 MAIN: MOV R0,#00H ;从“0”开始显示
03 MOV DPTR,#TABLE ;表格地址送数据指针
04 DISP: MOV A,R0 ;送显示
05 MOVC A,@A+ADPTR ;指向表格地址
06 MOV P1,A ;数据送LED
07 ACALL DELAY ;延时
08 INC R0 ;指向下一个字符
09 CJNE R0,#0AH,DISP ;未显示完,继续
10 AJMP MAIN ;下一个循环
11 DELAY: MOV R1,#0FFH ;延时子程序,延时时间赋值
12 LOOP0: MOV R2,#0FFH
13 LOOP1: DJNZ R2,LOOP1
14 DJNZ R1,LOOP0
15 RET ;子程序返回
16 TABLE: DB 0C0H ;字型码表
17 DB 0F9H
18 DB 0A4H
19 DB 0B0H
20 DB 99H
21 DB 92H
22 DB 82H
23 DB 0F8H
24 DB 80H
25 DB 90H
26 END ;程序结束
2016-01-25 12:01:29 baidu_33836580 阅读数 1746
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    4000 人正在学习 去看看 朱有鹏

单片机自身的 RAM 存储空间和引脚数目往往有些不足,当需要在外部拓展不太多的时候,8155 芯片就是首选了。


一片 8155,可以提供 256 字节的 RAM,3 个并行 IO 接口和一个 14 位的定时器。


8155 的内部还集成了地址锁存器,如果只是需要扩展 8155,就可以省去常用的地址锁存器 74LS373。


下面,先写一个使用单片机自身资源来驱动 16 个 LED 进行流水的程序。


然后,再把它改造为利用 8155 来驱动。


利用 51 单片机驱动 16 个 LED 流水灯的汇编语言程序如下。

;=========================================================


; 16 个 LED 接到 P0, P2。


    ORG   0000H

START:

    MOV   30H, #254   ;片内 RAM

    MOV   31H, #255   ;30H 31H 中仅有一个低电平

;-------------------------------------

    MOV   R2, #16     ;循环 16 遍

LOOP:

    MOV   P0, 30H     ;输出到 LED 

    MOV   P2, 31H

    CALL  DLY200MS    ;延时

    CALL  SHIFT_L     ;移位

    DJNZ  R2, LOOP    ;循环 16 遍


    SJMP  START       ;再从头开始

;-------------------------------------

SHIFT_L:              ;16位数左移一位

    MOV   A, 30H

    RLC   A           ;高位移入Cy

    MOV   30H, A

;---------------

    MOV   A, 31H

    RLC   A           ;Cy移入低位,且高位移入Cy

    MOV   31H, A

;---------------

    MOV   A, 30H

    MOV   ACC.0, C    ;把Cy(高位)写入低位

    MOV   30H, A

;---------------

RET

;-------------------------------------

DLY200MS:             ;延时200ms,误差0us

    MOV   R6, #197    ;

DL0:

    MOV   R7, #250    ;1

    DJNZ  R7, $       ;2 * 250 = 500

    DJNZ  R7, $       ;2 * 256 = 512

    DJNZ  R6, DL0     ;(1 + 500 + 512 + 2) * 197 = 199955

    MOV   R7, #19     ;1

    DJNZ  R7, $       ;2 * 19 = 38

    NOP               ;1

RET                   ;1 + 199955 + 1 + 38 + 1 + 2 = 199998

;-------------------------------------


END 

;=========================================================


上述程序所对应的电路,太简单了,就不在这里显示插图了,读者可自行画图。


当在电路中加入了一片 8155,电路可以如下连接:


在 51 单片机系统中使用 8155 - 非著名博主 - 电子信息角落


图片链接:http://xiangce.baidu.com/picture/detail/077253d8ef5443cc7ce6c5e5461a899e2034497a


图中,由于使用了 P2.7 和 P2.0 连接到 CS 和 IO/M,所以,8155 的接口地址、存储器地址分别为:


;I/O 地址:

COMMAND  EQU  7F00H

  PORTA  EQU  7F01H       

  PORTB  EQU  7F02H       

  PORTC  EQU  7F03H

TIMER_L  EQU  7F04H

TIMER_H  EQU  7F05H


;MEM 地址:


;7E00H ~ 7EFFH


因此,前面的流水灯程序,就要如下修改:


;=========================================================

;51单片机流水灯(16个灯)

;P0, P2 外接 16 个 LED--改为 PA, PB

;30H, 31H 片内RAM ----改为 片外


    ORG   0000H

START:

    MOV   DPTR, #COMMAND

    MOV   A, #00000011B;PA方式0输出,PB方式0输出

    MOVX  @DPTR, A


    INC   DPTR        ;转到PA

    MOV   A, #00110011B;测试共阳极7段数码管

    MOVX  @DPTR, A

    INC   DPTR        ;转到PB

    MOV   A, #00001111B

    MOVX  @DPTR, A


;    MOV   30H, #254   ;--改为 7E30H

;    MOV   31H, #255   ;--改为 7E31H


    MOV   DPTR, #7E30H

    MOV   A, #254

    MOVX  @DPTR, A


    MOV   DPTR, #7E31H ;片外 RAM 7E30H 7E31H

    MOV   A, #255      ;中仅有一个低电平

    MOVX  @DPTR, A

;-------------------------------------

    MOV   R2, #16     ;循环 16 遍

LOOP:


;    MOV   P0, 30H     ;输出到 LED 

;    MOV   P2, 31H


    MOV   DPTR, #7E30H

    MOVX  A, @DPTR

    MOV   DPTR, #PORTA

    MOVX  @DPTR, A


    MOV   DPTR, #7E31H

    MOVX  A, @DPTR

    MOV   DPTR, #PORTB

    MOVX  @DPTR, A


    CALL  DLY200MS    ;延时

    CALL  SHIFT_L     ;移位

    DJNZ  R2, LOOP    ;循环 16 遍


    SJMP  START       ;再从头开始

;-------------------------------------

SHIFT_L:              ;16位数左移一位

;    MOV   A, 30H

    MOV   DPTR, #7E30H

    MOVX  A, @DPTR


    RLC   A           ;高位移入Cy


;    MOV   30H, A

    MOVX  @DPTR, A

;---------------

;    MOV   A, 31H

    MOV   DPTR, #7E31H

    MOVX  A, @DPTR


    RLC   A           ;Cy移入低位,且高位移入Cy


;    MOV   31H, A

    MOVX  @DPTR, A

;---------------

;    MOV   A, 30H

    MOV   DPTR, #7E30H

    MOVX  A, @DPTR


    MOV   ACC.0, C    ;把Cy(高位)写入低位


;    MOV   30H, A

    MOVX  @DPTR, A

;---------------

RET

;-------------------------------------

DLY200MS:             ;延时200ms,误差0us

    MOV   R6, #197    ;

DL0:

    MOV   R7, #250    ;1

    DJNZ  R7, $       ;2 * 250 = 500

    DJNZ  R7, $       ;2 * 256 = 512

    DJNZ  R6, DL0     ;(1 + 500 + 512 + 2) * 197 = 199955

    MOV   R7, #19     ;1

    DJNZ  R7, $       ;2 * 19 = 38

    NOP               ;1

    RET               ;1 + 199955 + 1 + 38 + 1 + 2 = 199998

;-------------------------------------


END 


;=========================================================


原来程序中,凡是对 30H、31H 读写的指令,都改成对片外 RAM 读写。


凡是对 P0、P2 输出的指令,都改成对片外 PA、PB 输出。


这样写,程序的长度,将近增加了一倍。呵呵,没有办法,只能这样。


经过修改,即可利用 8155 的资源,进行流水灯的实验了。


显示的效果,是只有一个 LED 流动发光,比较简单,就不在这里插图了。



2008-04-07 20:28:00 fishtangjinfu 阅读数 180
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    4000 人正在学习 去看看 朱有鹏

1. 实验任务 I/O并行口直接驱动LED显示

每按下一次开关SP1,计数值加1,通过AT89S51单片机的P1端口的P1.0P1.3显示出其的二进制计数值。

2. 电路原理图

4.8.1

3. 系统板上硬件连线

(1.       把“单片机系统”区域中的P3.7/RD端口连接到“独立式键盘”区域中的SP1端口上;

(2.       把“单片机系统”区域中的P1.0P1.4端口用8芯排线连接到“八路发光二极管指示模块”区域中的“L1L8”端口上;要求,P1.0连接到L1P1.1连接到L2P1.2连接到L3P1.3连接到L4上。

4. 程序设计方法

(1.       其实,作为一个按键从没有按下到按下以及释放是一个完整的过程,也就是说,当我们按下一个按键时,总希望某个命令只执行一次,而在按键按下的 过程中,不要有干扰进来,因为,在按下的过程中,一旦有干扰过来,可能造成误触发过程,这并不是我们所想要的。因此在按键按下的时候,         图4.8.2

要 把我们手上的干扰信号以及按键的机械接触等干扰信号给滤除掉,一般情况下,我们可以采用电容来滤除掉这些干扰信号,但实际上,会增加硬件成本及硬件电路的 体积,这是我们不希望,总得有个办法解决这个问题,因此我们可以采用软件滤波的方法去除这些干扰信号,一般情况下,一个按键按下的时候,总是在按下的时刻 存在着一定的干扰信号,按下之后就基本上进入了稳定的状态。具体的一个按键从按下到释放的全过程的信号图如上图所示:

从图中可以看出,我们在程序设计时,从按键被识别按下之后,延时5ms以上,从而避开了干扰信号区域,我们再来检测一次,看按键是否真得已经按下,若真得已经按下,这时肯定输出为低电平,若这时检测到的是高电平,证明刚才是由于干扰信号引起的误触发,CPU就认为是误触发信号而舍弃这次的按键识别过程。从而提高了系统的可靠性。

由于要求每按下一次,命令被执行一次,直到下一次再按下的时候,再执行一次命令,因此从按键被识别出来之后,我们就可以执行这次的命令,所以要有一个等待按键释放的过程,显然释放的过程,就是使其恢复成高电平状态。

(1.       对于按键识别的指令,我们依然选择如下指令JB BITREL指令是用来检测BIT是否为高电平,若BIT1,则程序转向REL处执行程序,否则就继续向下执行程序。或者是 JNB BITREL指令是用来检测BIT是否为低电平,若BIT0,则程序转向REL处执行程序,否则就继续向下执行程序。

(2.       但对程序设计过程中按键识别过程的框图如右图所示:                 图4.8.3

5. 程序框图

 

 

 

 

 

 

 

 

 

 

4.8.4

6. 汇编源程序

        

 

 

 

 

 

 

 

                             ORG 0

START:                        MOV R1,#00H                     ;初始化R70,表示从0开始计数

                                     MOV A,R1                                     ;

                                     CPL A                                             ;取反指令

                                     MOV P1,A                                     ;送出P1端口由发光二极管显示

REL:                    JNB P3.7,REL                                ;判断SP1是否按下

                                     LCALL DELAY10MS          ;若按下,则延时10ms左右

                                     JNB P3.7,REL                                ;再判断SP1是否真得按下

                                     INC R7                                           ;若真得按下,则进行按键处理,使

                                     MOV A,R7                                     ;计数内容加1,并送出P1端口由

                                     CPL A                                             ;发光二极管显示

                                     MOV P1,A                                     ;

                                     JNB P3.7,$                                     ;等待SP1释放

                                     SJMP REL                                      ;继续对K1按键扫描

DELAY10MS:    MOV R6,#20                                  ;延时10ms子程序

L1:                                MOV R7,#248

                                     DJNZ R7,$

                                     DJNZ R6,L1

                                     RET

                                     END

7. C语言源程序

#include <AT89X51.H>

unsigned char count;

void delay10ms(void)

{

  unsigned char i,j;

  for(i=20;i>0;i--)

  for(j=248;j>0;j--);

}

void main(void)

{

  while(1)

    {

      if(P3_7==0)

        {

          delay10ms();

          if(P3_7==0)

            {

              count++;

              if(count==16)

                {

                  count=0;

                }

              P1=~count;

              while(P3_7==0);

            }

        }

    }

}

 


 
2016-01-25 12:07:56 baidu_33836580 阅读数 3214
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    4000 人正在学习 去看看 朱有鹏


51 单片机有四个 8 位的并行接口。


因为内部结构的特点,这些接口,在输出 0、1 的时候,能力是不一样的。


输出 0 的时候,能力较强,可以允许灌入十多毫安的电流,能够直接驱动 LED 发光。


但是,这些接口在输出 1 的时候,能力就很差了,特别是 P0 口,它自身根本就不具备输出 1 的能力,总是要借助外接的上拉电阻才能输出 1。


这时如果外接一个小电阻接地,引脚就维持不住高电平了。外接的电路,很容易就可以把引脚的电平拉低。


就是说,输出了 1 之后,接口引脚的电平,就完全取决于外部电路。


正是因为这种特点,所以,就把输出 1,规定为单片机的输入方式。


------------------------


因为输出了 1 之后,外接的电路就可以随便的改变引脚电平。


那么,还想要用原来输出的数据,进行计算,比如说加一:INC  P1,数据又被外部电路改变了,这样可不好。


其实,输出的数据(0 或 1),是先存放在接口寄存器中,再由寄存器输出到引脚。


接口寄存器也就是 P0~P3,它们都属于单片机的特殊功能寄存器,它们之中任意的一个位,都称为锁存器。


引脚的电平,可以受到外部电路的影响,而接口寄存器的内容是不变的。


------------------------


针对接口的读出,有读引脚指令,还有一种是读寄存器的读-改-写指令。


读引脚指令,也就是用于输入数据的指令。


凡是以接口为源操作数的传送指令,全都是读引脚指令,如:MOV  A, P1。


而读-改-写指令,是先读出接口寄存器的数据,修改后,再写入接口寄存器。


如 INC  P1,就是先读出 P1 寄存器中内容,加一后,再写入 P1 寄存器。


读-改-写指令和引脚电平无关,这种指令不能输入数据。


属于读-改-写的指令有个特点,就是以接口寄存器为目的操作数,如:


ANL、ORL、XRL、DJNZ、INC、DEC、JBC、CPL、CLR、SETB、MOV  PX.Y, C。

 

------------------------


学习汇编语言时,就会学到读引脚、读锁存器的区别。


但是,以 C 语言为主的单片机教材,几乎都没有针对读-改-写指令的特点加以说明。


有很多人,对用 C 语言编程比较热心,也确实能够编写出来一些成功的东西。可是看他们对单片机的理解、对于某些问题的解答,难免贻笑大方。


可以看出,有些编程高手,其实,也并不懂单片机。


------------------------

有这样一个问题:


链接:http://zhidao.baidu.com/question/1817571516382978388.html


P2 口外接 4*4 的矩阵键盘,采用反转法来读出按键信息,也就是在高、低四位,分别输出0,再读入另外四位的引脚电平。


错误的程序如下:


/*************键盘扫描******错误*********/

void scan()

{

    unsigned char media;

    P2 = 0x0f;

    P2 = P2 | 0xf0;

    key = P2; 

}

但是,key 并没有反映出按键的信息,为什么错了呢?



做而论道的回答如下:


/*************键盘扫描******错误*********/

void scan()

{

    unsigned char media;

    P2 = 0x0f;        //在P2高四位输出0,将以低四位为输入

    P2 = P2 | 0xf0;   //在P2高四位又输出1


//前面两条,在 P2 的八条线,都输出了1


    key = P2;         //读入的,这是什么呢?

}


P2 口,如果外接的独立按键,这么做,就是对的。


P2 口,如果外接的矩阵按键,这么做,就是错的。因为读入前,并没有输出0。

---------

追问:


//假设有键按下:

P2 = 0x0f;     //高四位为0第四位为1,因为有键按下,则低四位中有0

P2 = P2 | 0xf0;//将高四位也赋值为1,因为低四位中有0,且有键按下则高四位中也有0

key = P2;      //将P2的键值保存在key中, 不知问题在哪儿



做而论道回答:


P2 = P2 | 0xf0;//将高四位也赋值为1,因为低四位中有0,且有键按下则高四位中也有0


这条语句,并没有读入低四位的0。


P2 | 0xf0;,这里所用的 P2,是原来的 P2 = 0x0f。


而按键产生的《低四位中有0》,并没有发挥作用。

---------

追问:


首先感谢您的耐心解答,这个问题让我困惑了一天。


P2 = 0x0f; 这条语句在有 media 作为中间变量的时候,就能实现:

【高四位为0第四位为1,因为有键按下,则低四位中有0】的功能。


而没有media时,就不能读入低四位的0呢 ?



做而论道回答:


这个问题,要从汇编语言中,才能找到答案。

使用 C 语言编程,好比是隔靴搔痒。出现了异常,也只能疑惑终身。


看看汇编语言里面《读-改-写》指令吧。

汇编语言里面,有《读引脚》、《读锁存器》的区别。

在 C 语言里面,就葫芦搅茄子的弄不清了。


汇编:

ORL  P2, #0F0H   ;读锁存器

MOV  A,  P2      ;读出引脚



刚才有错误的程序,关键是这条语句:


P2 = P2 | 0xf0;//将高四位也赋值为1,因为低四位中有0,且有键按下则高四位中也有0


表面上看,这是读出了 P2,高四位或上 1111,低四位不变,低四位应该是读出按键的0。


但是,这条指令编译成汇编语言之后,就是:


ORL  P2, #0F0H


这是典型的读-改-写指令。


它读的是接口寄存器,并不是读出引脚,所以反映不出来按键的状态。



读出 4*4 键盘的正确程序,提问者也提供了,做而论道加上了说明,如下:


/*************键盘扫描******正确*********/

void scan()

{

    unsigned char media;


    P2 = 0x0f;         //在P2高四位输出0,将以低四位为输入


    media = P2;        //读入引脚,低四位代表按键信息


//如果有键按下,低四位中,就有0

//那么,media 可能是下列之一:

//XXXX 0111

//XXXX 1011

//XXXX 1101

//XXXX 1110   假如,就是这个吧。


    media | 0xf0;

//那么,media,就是:

//1111 1110   就是这个。


    P2 = media | 0xf0; //以高四位为输入,低四位将输出0


//P2 = 1111 1110


    key = P2;          //读入引脚,高、低四位皆含有按键信息


//key 可能就是下列之一:


//0111 1110

//1011 1110 

//1101 1110

//1110 1110


//key 的内容,就反映出来了按键信息。


//这些,就是正确读出矩阵键盘程序的过程。


}



追问:嗯 非常感谢 我会深入去了解的 谢谢你的耐心解答


2014-01-15 12:36


------------------------


后记:


以 C 语言来讲单片机的书,做而论道也看过几本,说实在的,和单片机无关的垃圾太多了,也看不下去。


关于读-改-写的知识,做而论道还是注意找了找,但是,确实没有发现写在何处。


也许,看的书,还不全。


有些同学,碰到难学的课程,考试挂了,也不知道哪里错了,通过了,也不知道怎么过去的。


用 C 语言编程,就和这类似,编成功了,也不知道怎么弄成功的,碰到异常,也不知道有什么毛病。


特别是一些自认是 C 语言的编程高手,针对这个问题,也是瞎说一气,呵呵


------------------------


搜集了几个问答,留着参考:


在单片机中,什么叫读引脚,什么叫读端口,它们有什么区别?

http://zhidao.baidu.com/question/86832812.html



在单片机中,当P0口作为输入口使用时,为什么要区分" 读引脚" 和"读锁存器"

http://zhidao.baidu.com/question/88505955.html



单片机的I/O寄存器与I/O引脚有什么区别,也就是说怎么理解P0寄存器与P0引脚?

http://zhidao.baidu.com/question/261150391.html



读引脚和读寄存器有什么区别?为什么要区分?

http://zhidao.baidu.com/question/504937959.html



单片机中的“读-修改-写”和“读引脚”有何不同

http://zhidao.baidu.com/question/512456401.html


------------------------


I2C总线

阅读数 798

IIC总线介绍

阅读数 5354

没有更多推荐了,返回首页