5.5.3 程序流程图及其说明根据本系统的结构原理,可以绘制出程序流程图,如下面图5.5.3(1)和图 5.5.3(2)所示列扫描子程序置列数 51h=63列时钟线和控制线置 低 置高数据输出端 口 列时钟线和控制线置 高子程序返回行发送子程序置行数 R0=8行时钟线置低右移累加器使 最低位送至数 据输出端口行时钟线置高子程序返 回输出时钟线置低关输出输出时钟线置高开输出8 行送完?发送 63 个 1 和 1 个 0 到列 线8 行送 完?NNYY图 5.5.3(1) 行数据发送和列扫描子程序开始主程序初始化等待串口中断执行单片机接收 子程序调用显示子程序收完否?显示子程序置表首地址 dptr 为 0000h置显示组数置下一帧基地址初值及其中间变量 wfh 置单组扫描字节数和帧扫描次数 20调帧扫描子程序置列扫描数 r4=64 列调列扫描子程序调行数据发送子程序调用行关闭子程 序全部字符显示完否循环调用显示子程 序 序Y执行单片机发送 子程序发完否?帧数据前行两个字节一帧 20 次扫描完?64 列扫完?NYNYNYNYNYNY图 5.5.3(2) 主程序及帧扫描子程序在主程序中打开串行口中断、设置波特率和串行口工作方式。
在显示子程序中使用 DPTR 地址寄存器作为地址指针,开始时指向数据表首地址,当一帧(即一屏四个字符)字符显示完成后,进入下一帧(即下一屏四个字符)字符,从右到左的流动显示,此时 DPTR 指向字符表的第三个字节处第一次调用列扫描子程序时,先向控制列线的八个 74HC595发送 63 个 1 和 1 个 0,同时第一次调用行数据发送子程序,使 DPTR 指向字符表的第一个字节,在循环体中 DPTR 加 1,从而发送 16 行的数据到控制行线的两个 74HC595 中,这样就完成了第一次列扫描子程序和第一第次行数据发送子程序的调用第二次调用列扫描子程序时,只需发送一个 1,就能实现移位的操作,而此时行数据发送子程序将发送字符表中第三、四个字节的数据,以后 DPTR 增加到第 128 个字节处,行数据发送子程序将发第 128 个字节的数据,这个就完成一帧的显示(即一屏四个字的显示,因为一个汉字的点阵字模大小为 32 byte)由 LED 的结构原理可知,在列扫描子程序中,1 对应的列为暗,而 0 对应的列被点亮数据表按显示要求编码每两个字节为 LED 点阵板一列中 16 位相应的显示行数据。
由于数据为 16 位,因此必须分两次发送当数据发来时,对应的为 0 的列线与行线相交点的发光三极管被点亮,为 1 被关暗字符表中每 32 个字节数据为一个字符的编码信息程序中为了能够存取片外数据存储器 6264 中 0020H 以上单元的数据,只能采取 MOVX @DPTR,A 和 MOVX A,@DPTR 作为存取数据的指令,原因是 R0 与 R1 的间接寻址方式只能寻址到 001FH 单元同时为了能够很好地对数据寻址,我们使用 50H 和 51H 两个单元来产生每一个帧数据的基值,09H 单元作为行数据的指针,而 DPTR 被更多地用来作地址偏移量使用51H 在每次循环后使 DPTR 加 2,使得它所指向的数据表地址前移此后调用帧扫描子程序时,每帧显示的字符将向后移例如第二次调用帧扫描子程序,DPTR 的值为表首地址加 1,此时取出的是字符表中第三、四个字节中的数据,再配合列扫描子程序,此时看到的显示效果为第一个显示字符向左移动了一列,其第一列从左端移出了屏幕,而后面的三个显示字符均前行了一列,最后一列为字符表第 129、130 字节中的数据,这样就完成一帧的显示随着 51H 在每次循环后使 DPTR 加一次次地加2,每帧显示都将当前显示字符的一列从左端移出,将后续显示字符的一列从右端移入,形成了所有设置字符的流水显示。
DPTR 能增加的最大值等于字符表中全部字节数减去 128 个字节数而得到的值,否则 DPTR 将指到表外为了保证最后一个字也能移动显示,DPTR 又要能指向最后一个显示字符的最后一个编码字节因此将字符表中倒数的 128 个字节数全部设为 00h,这样就能保证以黑屏显示效果结束全部字符一场移动的显示每帧反复循环扫描的次数,决定显示移动速度在显示子程序程序中,移动速度由帧扫描次数计数器 R5 中的初值决定该值可根据不同晶振的频率和个人的喜好决定。