微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第81节:液晶屏显示串口发送过来的任意汉字和字符

第81节:液晶屏显示串口发送过来的任意汉字和字符

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

g[]= //机内码 送

{

0xCB,0xCD,

};

code unsigned char JN1616_xin[]= //机内码 信

{

0xD0,0xC5,

};

code unsigned char JN1616_xi[]= //机内码 息

{

0xCF,0xA2,

};

unsigned int uiSendCnt=0; //用来识别串口是否接收完一串数据的计时器

unsigned char ucSendLock=1; //串口服务程序的自锁变量,每次接收完一串数据只处理一次

unsigned int uiRcregTotal=0; //代表当前缓冲区已经接收了多少个数据

unsigned char ucRcregBuf[const_rc_size]; //接收串口中断数据的缓冲区数组

unsigned int uiRcMoveIndex=0; //用来解析数据协议的中间变量

unsigned int uiVoiceCnt=0; //蜂鸣器鸣叫的持续时间计数器

unsigned char ucWd1Update=1; //窗口1的整屏更新显示变量 1代表更新显示,响应函数内部会清零

unsigned char ucWd1Part1Update=0; //窗口1的第1个局部更新显示变量 1代表更新显示,响应函数内部会清零

unsigned char ucDispplayBuffer[48]; //第2,3,4行显示内容的缓冲区

void main()

{

initial_myself();

delay_long(100);

initial_peripheral();

while(1)

{

usart_service(); //串口服务程序

display_service(); //显示服务程序

}

}

/* 注释二:在一个坐标点显示1个汉字或者2个字符的函数

* 第1,2个参数x,y是坐标体系。x的范围是0至8,y的范围是0至3.

* 第3个参数ucArray1是第1个汉字机内码或者ASCII码。

* 第4个参数ucArray2是第2个汉字机内码或者ASCII码。

*/

void display_double_code(unsigned int x,unsigned int y,const unsigned char ucArray1,const unsigned char ucArray2)

{

WriteCommand(0x30); //基本指令集

WriteCommand(ucAddrTable[8*y+x]); //起始位置

LCDWriteData(ucArray1);

LCDWriteData(ucArray2);

}

void display_clear(void) // 清屏。4行8列的坐标点全部显示2个空字符相当于清屏了。

{

unsigned int i,j;

for(i=0;i<4;i++)

{

for(j=0;j<8;j++)

{

display_double_code(j,i,0x20,0x20); //0x20是空格的ASCII码

}

}

}

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

{

unsigned char i;

for ( i = 0; i < 8; i++ )

{

if ( (ucData < i) & 0x80 )

{

LCDSID_dr = 1;

}

else

{

LCDSID_dr = 0;

}

LCDCLK_dr = 0;

LCDCLK_dr = 1;

}

}

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

{

SendByteToLcd( 0xf8 + (ucWRS < 1) );

SendByteToLcd( ucWData & 0xf0 );

SendByteToLcd( (ucWData < 4) & 0xf0);

}

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

{

LCDCS_dr = 0;

LCDCS_dr = 1;

SPIWrite(ucCommand, 0);

delay_short(90);

}

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

{

LCDCS_dr = 0;

LCDCS_dr = 1;

SPIWrite(ucData, 1);

}

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

{

LCDRST_dr = 1; //复位

LCDRST_dr = 0;

LCDRST_dr = 1;

}

void empty_diaplay_buffer(void) //把显示缓冲区全部填充空格字符0x20

{

unsigned int i;

for(i=0;i<48;i++)

{

ucDispplayBuffer[i]=0x20; //第2,3,4行显示内容的缓冲区全部填充0x20空格字符

}

}

void diaplay_all_buffer(void) //显示第2,3,4行全部缓冲区的内容

{

unsigned int i,j;

for(i=0;i<3;i++) //i代表行数

{

for(j=0;j<8;j++) //j代表某行的某个坐标在第几列

{

display_double_code(j,i+1,ucDispplayBuffer[i*16+j*2],ucDispplayBuffer[i*16+j*2+1]); //这里的16代表一行可以显示16个字符

}

}

}

void display_service(void) //显示服务程序,在main函数里

{

if(ucWd1Update==1) //窗口1整屏更新,里面只放那些不用经常刷新显示的内容

{

ucWd1Update=0; //及时清零,避免一直更新

ucWd1Part1Update=1; //激活窗口1的第1个局部更新显示变量

display_clear(); // 清屏。4行8列的坐标点全部显示2个空字符相当于清屏了。

//显示第一行固定的内容:请发送信息

display_double_code(1,0,JN1616_qing[0],JN1616_qing[1]); //请

display_double_code(2,0,JN1616_fa[0],JN1616_fa[1]); //发

display_double_code(3,0,JN1616_song[0],JN1616_song[1]); //送

display_double_code(4,0,JN1616_xin[0],JN1616_xin[1]); //信

display_double_code(5,0,JN1616_xi[0],JN1616_xi[1]); //息

}

if(ucWd1Part1Update==1) //窗口1的第1个局部更新显示变量,里面放一些经常需要刷新显示的内容

{

ucWd1Part1Update=0; //及时清零,避免一直更新

diaplay_all_buffer(); //显示第2,3,4行全部缓冲区的内容

}

}

/* 注释三:

* 以下有效信息截取和如何判断机内码与ASCII码是本程序的核心,

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

网站地图

Top