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

MCU编程实践之红外中断定时12864逐步讲解一锅烩

发布时间:2021-01-22 发布时间:
|

这个其实是红外遥控编程过程实验,思路是这样的:

  • 红外接收管采用中断口接收信号;

  • 在中断子程序中,在高低电平的变化时,用计时器来计时其高、低电平维持的时长;

  • 将时长值直接用二进制数显示在12864屏上;

  • 以us为单位,手工计算各显示数值的时长值(这个可以不做);

  • 根据红外遥控NEC标准,分析该遥控器的引导码及比特码的高低电平时长组成,以此获得引导码和比特码的高低电平时长特征值,

  • 依据得到的引导码和比特码的高低电平时长特征值,再编制程序获得该遥控器的用户码值、各键的键值。

  • 依据得到的用户码值、各键的键值,接下来就可以做遥控控制操作编程了。

    这一套操作下来,你就拥有了获得各种红外遥控器用户码和键值的工具了,然后,你可以给家里的所有红外遥控器做一个一桶姜山的专用遥控器了,然后你可以在网上订印刷板、外壳等的,高档一点的,全屏触摸操作带学习。

    下面一步一步来:


一、12864屏

该屏下有字符显示和图形显示两种模式,我们选择字符模式。

字符模式下,其最多可显示64个半宽字符,或32个汉字,可混编,分为四排。输入位置为一维座标确定,左上角的座标值为80H。


1.初始化

编程时,首先设置其为字符模式,命令代码为10100B(我们这里直接用二进制,方便自己看说明书及更改功能设置)。

字符输入时,我们一般都能看到一个光标,以在屏幕上指示正在输入的位置,这个光标可以开可以关,用命令来设置;输入时我们一般选择光标向右移动、字符从左向右顺序输入(当然,你也可以倒着来,或新输入的字符总是固定在这个位置),相应命令为110B。


然后将字符地址内存DDRAM全部清空,将DDRAM的地址计数器值归位。该命令为1B。


字符输入后,你可以控制其显示或不显示,光标也一样,所以,我们还要设置其打开,相应命令为1110B。这个命令中,最后一位为0,表示游标位置反白关。


还有一个光标显示移位控制命令,先用10100B吧。


这一步算是完成了,执行后,你应该能看到光标。如果没有,那你的程序就有问题,仔细检查,反正没几行,我遇到的问题,基本就是延时不够,以及该延时的地方没加延时。


下面给出这部分的汇编程序,当然,你也可以用C编。并行输入,P0口为数据口:

        XRS  EQU  0B5H;P35     编程器不认P35,只好直接输入P35的地址值了,下同

    XRW  EQU  0B6H;P36

    XEN  EQU  0B7H;P37

    ;XPSB EQU ?           这两个,我的STC8A8K板,已硬件连电位了

    ;XRESET EQU ?        

    XCOM  EQU 34H

    XDAT  EQU 35H

            

ORG 0000H

        AJMP START

        ORG 0100H

        START:

        ACALL XDELAY

        ACALL XINIT

        AJMP $

        XINIT:

          MOV XCOM,#110000B

          ACALL XWRI

          MOV XCOM,#1H

          ACALL XWRI

          MOV XCOM,#110B

          ACALL XWRI

          MOV XCOM,#1110B

          ACALL XWRI

          MOV XCOM,#10100B

          ACALL XWRI

        RET

               

        XWRI:

          CLR XEN

          CLR XRS

          CLR XRW

          ACALL XDELAY

          MOV P0,XCOM

          SETB XEN

          CLR XEN

          ACALL XDELAY

        RET

         

        XWDAT:

      CLR XEN

      SETB XRS

      CLR XRW

      MOV P0,XDAT

      SETB XEN

      CLR XEN

      ACALL XDELAY

    RET

        

XDELAY: MOV 30h,#40  这个延时有点长,短了我的这个MCU不认帐,没法

   D1: MOV 31h,#25

   D2: DJNZ 31h,D2

   DJNZ 30h,D1

RET

END


2.输入字符

这个简单,输入座标再输入字符编码,搞定。

至此,屏显编程工作完成。


3.直接以二进制显示一个存储单元中的数值

比如我们要显示10010110B这个值,我们把它先输入到A寄存器中,将这个值一位一位地进行处理并显示在屏幕上。


对于初学者,最好是先将其中任一位的显示程序做通,然后再做这八位输入的程序,这个功能的子程序如下:

XBIT:

        MOV  A,#10010110B

        JB  ACC.0,LOOP1

        LOOP0:MOV XDAT,#30H

        ACALL  XWDAT

        RET

        LOOP1:MOV XDAT,#31H

        ACALL  XWDAT

RET

上面程序中的BACC.0就是最末一位,你可以换成其它位试试能否正确显示。

这个做通了,下面做八位全部显示的。

我们采用移位并循环法,从高位到低位逐位处理,子程序如下:

X8BIT:

          MOV A,#10010110B

          ACALL XBIT

RET

        XBIT:

          MOV  R2,#08H

          LOOP0:

           RL  A

           JB  ACC.0,LOOP1

           MOV  XDAT,#30H

           ACALL  XWDAT

           DJNZ  R2,LOOP0

            RET

             LOOP1:

             MOV  XDAT,#31H

             ACALL  XWDAT

             DJNZ  R2,LOOP0

        RET

三、中断程序

其实中断的原理蛮简单的,设定相应中断开之后,一旦有中断信号被接收到,即中断口的电平被拉低,则程序就强行发生跳转,这个跳转是程序存储器绝对地址的跳转,不同编号的中断有不同的跳转地址(中断向量),比如INT0,其跳转地址为0003H,即程序跳转到地址为0003H处开始执行。所以,在主程序中,应在0003H地址处写入中断子程序,但要注意因另一个中断的跳转地址为000BH,之间放不了几行程序,所以这里一般是写个跳转指令,跳转到一个专门的子程序来完成中断后的任务:


  ORG  0003H

  LJMP  INT0RED

对于中断,MCU设计有总中断控制开关(符号EA)、相应中断控制开关(符号EX#)、中断的触发方式(IT#),以及各中断的优先级控制(中断优先级寄存器IP中)。这个要根据你编程的需要,先期进行设置,也就是中断的初始化,这个可以在主程序中加一条ACALL  INT0INI:

INT0INI:

                SETB  EX0

                CLR  IT0

                SETB  P32  中断口。这个注意要置该端口为高电位

                SETB  EA

        RET        

中断初始化完成了,现在就可以开始接收中断并完成中断后的任务了,下面我们编一段子程序,当收到中断后,在屏幕指定位置显示一个汉字:

INT0RED:

          CLR EX0  关闭该中断允许

                  MOV XCOM,#82H

                  LCALL  XWRI

                  MOV XDAT,#0B1H

                  LCALL  XWDAT

                  MOV  XDAT,#0B2H

                  LCALL  XWDAT

                  SETB  EX0  完成后打开该中断允许

        RET  

执行后屏幕上只有一个光标,按一下遥控器,应该显示一个汉字。


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

热门文章 更多
单片机中高阻态的实质及意义