第81节:液晶屏显示串口发送过来的任意汉字和字符
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码是本程序的核心,
液晶屏串口发 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)