微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第75节:液晶屏让字体以1个点阵为单位移动显示的算法程序

第75节:液晶屏让字体以1个点阵为单位移动显示的算法程序

时间:11-22 来源:互联网 点击:
开场白:

假设有一个固定的四方形透明窗口,在窗口里面放了一张画布,只要想办法让这个画布

往右边拖动,那么画布里面的内容就会跟着画布整体往右边移动,这个就是能以1个点阵为单位进行移动显示的本质。同理,这个画布有16行,每行有4个字节,我们只要把每行4个字节看作是一个首尾连接的二进制数据,把每一行的二进制数据每次整体往右边移动一位,就相当于移动一个点阵了。这一节就要把这个算法教给大家。

具体内容,请看源代码讲解。

(1)硬件平台:

基于朱兆祺51单片机学习板

(2)实现功能:开机上电后,能看到正中间显示的两个字符“V5”整体以1个点阵为单位向右边慢慢移动。

(3)源代码讲解如下:

#include "REG52.H"

#define const_MoveTime 400 //每移动一位后的延时时间

sbit LCDCS_dr = P1^6; //片选线

sbit LCDSID_dr = P1^7; //串行数据线

sbit LCDCLK_dr = P3^2; //串行时钟线

sbit LCDRST_dr = P3^4; //复位线

void SendByteToLcd(unsigned char ucData); //发送一个字节数据到液晶模块

void SPIWrite(unsigned char ucWData, unsigned char ucWRS); //模拟SPI发送一个字节的命令或者数据给液晶模块的底层驱动

void WriteCommand(unsigned char ucCommand); //发送一个字节的命令给液晶模块

void LCDWriteData(unsigned char ucData); //发送一个字节的数据给液晶模块

void LCDInit(void); //初始化 函数内部包括液晶模块的复位

void display_clear(unsigned char ucFillDate); // 清屏 全部显示空填充0x00 全部显示点阵用0xff

void insert_buffer_to_canvas(unsigned int x,unsigned int y,const unsigned char *ucArray,unsigned char ucFbFlag,unsigned int x_amount,unsigned int y_amount);//把字模插入画布.

void display_lattice(unsigned int x,unsigned int y,const unsigned char *ucArray,unsigned char ucFbFlag,unsigned int x_amount,unsigned int y_amount,unsigned int uiOffSetAddr); //显示任意点阵函数

void delay_short(unsigned int uiDelayshort); //延时

void move_service(void); //整体画布移动的应用程序

void lcd_display_service(void); //应用层面的液晶屏显示程序

void move_canvas_to_one_bit(void); //把画布整体往右边移动一个点阵

void clear_all_canvas(void); //把画布全部清零

void T0_time(void); //定时中断函数

code unsigned char Zf816_V[]= /*V 横向取模 8x16点阵 每一行只要1个字节,共16行 */

{

0x00,

0x00,

0x00,

0xE7,

0x42,

0x42,

0x44,

0x24,

0x24,

0x28,

0x28,

0x18,

0x10,

0x10,

0x00,

0x00,

};

code unsigned char Zf816_5[]= /*5 横向取模 8x16点阵 每一行只要1个字节,共16行 */

{

0x00,

0x00,

0x00,

0x7E,

0x40,

0x40,

0x40,

0x58,

0x64,

0x02,

0x02,

0x42,

0x44,

0x38,

0x00,

0x00,

};

/* 注释一:

* 为了实现跨区域无缝显示,就先在某个区域显示一块画布,我们只要在这块画布数组中插入字模数组,

* 就可以达到跨区域无缝显示的目的。根据上几节的介绍,12864液晶屏由上下两半屏组成,以下这块画布

* 显示在上半屏和下半屏之间。横向4个字节,纵向16行。其中上半屏显示8行,下半屏显示8行。注意,这个数组

* 不带code关键字,是全局变量,这样可读可写。画布的横向x坐标范围是0至3,因为画布的横向只要4个字节。

* 画布的纵向y坐标范围是0至15,因为画布的纵向只有16行。

*/

unsigned char ucCanvasBuffer[]= //画布显示数组。注意,这里没有code关键字,是全局变量。初始化全部填充0x00

{

0x00,0x00,0x00,0x00, //上半屏

0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,

//------------上半屏和下半屏的分割线-----------

0x00,0x00,0x00,0x00, //下半屏

0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,

};

unsigned char ucDisplayUpdate=1; //更新显示变量

unsigned char ucMoveStepReset=0; //这个变量是为了方便外部程序初始化应用程序内部后缀为step的步骤变量

unsigned char ucMoveTimeStart=0; //定时器的开关标志 也相当于原子锁或互斥量的功能

unsigned int uiMoveTime=0; //定时器累计时间

void main()

{

LCDInit(); //初始化12864 内部包含液晶模块的复位

display_clear(0xff); // 清屏 全部显示空填充0x00 全部显示点阵用0xff

TMOD=0x01; //设置定时器0为

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top