📄 lcd_test.c
字号:
/*****************************************************************************
Filename: native.c
Version: 0.01
Description: calculate measure value
Returns: result
Revision History:
EQH-01, 屈宵军 09/25/04, - Original release
*****************************************************************************/
/*写汉字液晶子程 液晶屏分为4行*12列汉字,全部使用模拟接口方式。*/
#include<math.h>
#include<tms320.h>
#include "LCD.h"
void DisEnableFun(void);
void Lcd_Driver(void)
{
// uchar x;
col=0;
row=0;
Delay(40); /*延时大约40Ms,等待外设准备好 */
Lcminit(); /*液晶模块初始化,包括全屏幕清屏*/
Putstr(STR2,24); /*第一行字符输出,24字节 */
}
/****************************************/
/* 一个字串的输出 */
/****************************************/
void Putstr(char *puts,uchar i)
{
uchar j,X;
for (j=0;j<i;j++)
{
X = puts[j];
if (X&0x80)
{
Putcdot(X&0x7f); /*只保留低7位*/
}
else Putedot(X-0x20); /*ascii码表从0x20开始*/
}
}
/****************************************/
/* 半角字符点阵码数据输出 */
/****************************************/
void Putedot(uchar Order)
{
uchar i,bakerx,bakery; /*共定义4个局部变量 */
uchar x; /*偏移量,字符量少的可以定义为uchar */
bakerx = col; /*暂存x,y坐标,已备下半个字符使用 */
bakery = row;
x=Order * 0x10; /*半角字符,每个字符16字节 */
/*上半个字符输出,8列 */
for(i=0;i<8;i++)
{
cbyte = Ezk[x]; /*取点阵码,rom数组 */
Wrdata(cbyte); /*写输出一字节 */
x++;
col++;
if (col==LCMLIMIT){col=0;row=row+2;}; /*下一列,如果列越界换行*/
if (row>7) row=0; /*如果行越界,返回首行 */
} /*上半个字符输出结束 */
col = bakerx; /*列对齐 */
row = bakery+1; /*指向下半个字符行 */
/*下半个字符输出,8列 */
for(i=0;i<8;i++)
{
cbyte = Ezk[x]; /*取点阵码 */
Wrdata(cbyte); /*写输出一字节 */
x++;
col++;
if (col==LCMLIMIT){col=0;row=row+2;}; /*下一列,如果列越界换行*/
if (row>7) row=1; /*如果行越界,返回首行 */
} /*下半个字符输出结束 */
row=bakery;
} /*整个字符输出结束 */
/****************************************/
/* 全角字符点阵码数据输出 */
/****************************************/
void Putcdot(uchar Order)
{
uchar i,bakerx,bakery; /*共定义3个局部变量 */
int x; /*偏移量,字符量少的可以定义为uchar */
bakerx = col; /*暂存x,y坐标,已备下半个字符使用 */
bakery = row;
x=Order * 0x20; /*每个字符32字?*/
/*上半个字符输出,16列 */
for(i=0;i<16;i++)
{
Wrdata(Hzk[x]); /*写输出一字节 */
x++;
col++;
if (col==LCMLIMIT){ col=0;row++;row++;} /*下一列,如果列越界换行*/
if (row>6) row=0; /*如果行越界,返回首行 */
} /*上半个字符输出结束 */
/*下半个字符输出,16列 */
col = bakerx;
row = bakery+1;
for(i=0;i<16;i++) /*下半部分*/
{
Wrdata(Hzk[x]);
x++;
col++;
if (col==LCMLIMIT){col=0;row++;row++;} /*下一列,如果列越界换行*/
if (row>7) row=1; /*如果行越界,返回首行 */
} /*下半个字符输出结束 */
row = bakery;
} /*整个字符输出结束 */
/****************************************/
/* 清屏,全屏幕清零 */
/****************************************/
void Lcmcls( void )
{
for(row=0;row<8;row++)
for(col=0;col<LCMLIMIT;col++)
{
Wrdata(0xFF);
}
}
/****************************************/
/* 数据写输出 */
/****************************************/
void Wrdata(uchar X)
{
Locatexy(); /*坐标定位,返回时保留分区状态不变 */
*str_port= (*str_port)&lcd_0;
// wtcom();
*str_port= (*str_port)|DIlcd_1; /*数据输出*/
*str_port= (*str_port)&(RWlcd_0); /*写输出 */
*str_port=(*str_port)&(Elcd_0);
*str_data= X; /*数据输出到数据口 */
/*读入到LCM*/
*str_port= (*str_port)|lcd_1;
DisEnableFun();
}
/********************************/
/* 命令输出到左区控制口 */
/********************************/
void WrcmdL(uchar X)
{
lcdbusyL(); /*确定分区,返回时保留分区状态不变*/
*str_port= (*str_port)&(DIlcd_0); /*命令操作 */
*str_port= (*str_port)&(RWlcd_0); /*写输出 */
*str_data= X; /*数据输出到数据口 */
*str_port=(*str_port)&(Elcd_0); /*读入到LCM*/
DisEnableFun();
}
/********************************/
/* 命令输出到中区控制口 */
/********************************/
void WrcmdM(uchar X)
{
lcdbusyM(); /*确定分区,返回时保留分区状态不变*/
*str_port= (*str_port)&(DIlcd_0); /*命令操作 */
*str_port= (*str_port)&(RWlcd_0); /*写输出 */
*str_data= X; /*命令输出到数据口 */
//*str_port=(*str_port)|(Elcd_1);//_nop_();
*str_port=(*str_port)&(Elcd_0); /*读入到LCM*/
DisEnableFun();
}
/********************************/
/* 命令输出到右区控制口 */
/********************************/
void WrcmdR(uchar X)
{
lcdbusyR(); /*确定分区,返回时保留分区状态不变 */
*str_port= (*str_port)&(DIlcd_0); /*命令操作 */
*str_port= (*str_port)&(RWlcd_0); /*写输出 */
*str_data= X; /*命令输出到数据口 */
// *str_port=(*str_port)|(Elcd_1);//_nop_();
*str_port=(*str_port)&(Elcd_0); /*读入到LCM*/
DisEnableFun();
}
/********************************************************/
/* 分区操作允许等待,返回时保留分区选择状态 */
/********************************************************/
void lcdbusyL(void)
{
*str_port=(*str_port)&CS1_0; /*CLR CS1 */
*str_port=(*str_port)|CS2_1; /*SETB CS2 */
*str_port=(*str_port)|CS3_1;
*str_port= (*str_port)&(DIlcd_0); /*CLR DI */
*str_port= (*str_port)&(RWlcd_0); /*CLR RW */
*str_port= (*str_port)&(Elcd_0);
// wtcom(); /* waitting for enable */
}
void lcdbusyM(void)
{
*str_port=(*str_port)|CS1_1; /*SETB CS1 */
*str_port=(*str_port)&CS2_0;
*str_port=(*str_port)|CS3_1; /*CLR CS2 */
// wtcom(); /* waitting for enable */
}
void lcdbusyR(void)
{
*str_port=(*str_port)|CS1_1; /*SETB CS1 */
*str_port=(*str_port)|CS2_1;
*str_port=(*str_port)&CS3_0; /*SETB CS2 */
// wtcom(); /* waitting for enable */
}
void wtcom(void)
{
*str_port= (*str_port)|DIlcd_1; /*CLR DI */
*str_port= (*str_port)&(RWlcd_0); /*SETB RW */
*str_data= 0xFF; /*MOV DATA_LCM,#0FFH */
//*str_port=(*str_port)|(Elcd_1);//_nop_();
while((*str_data)& Lcdbusy);
*str_port=(*str_port)&(Elcd_0);
DisEnableFun();
}
/********************************************************/
/*根据设定的坐标数据,定位LCM上的下一个操作单元位置 */
/********************************************************/
void Locatexy(void)
{
unsigned char x,y;
x = (col&0x3F)|SETX; /* col.and.0x3f.or.setx=0x40 */
y = (row&0x07)|SETY; /* row.and.0x07.or.sety=b8 */
switch (col&0xc0) /* col.and.0xC0 */
{ /*条件分支执行 */
case 0: {lcdbusyL();break;} /*左区 */
case 0x40: {lcdbusyM();break;} /*中区 */
case 0x80: {lcdbusyR();break;} /*右区 */
}
// wtcom(); /* waitting for enable */
*str_data= y; /*MOV P0,Y */
// *str_port=(*str_port)|(Elcd_1);
DisEnableFun();
/* waitting for enable */
*str_port= (*str_port)&(DIlcd_0); /*CLR DI */
*str_port= (*str_port)&(RWlcd_0); /*CLR RW */
*str_port= (*str_port)&(Elcd_0);
*str_data= x; /*MOV P0,X */
// asm("\tnop");
// *str_port=(*str_port)|(Elcd_1);//_nop_();
DisEnableFun();
}
/********************************/
/*液晶屏初始化 */
/********************************/
void Lcminit(void)
{
cbyte = DISPOFF; /*关闭显示屏 */
WrcmdL(cbyte); /*左区*/
WrcmdM(cbyte); /*中区*/
WrcmdR(cbyte); /*右区*/
cbyte = DISPON; /*打开显示屏 */
WrcmdL(cbyte); /*左区*/
WrcmdM(cbyte); /*中区*/
WrcmdR(cbyte); /*右区*/
cbyte = DISPFIRST; /*定义显示起始行为零 */
WrcmdL(cbyte);
WrcmdM(cbyte);
WrcmdR(cbyte);
Lcmcls();
col=0; /*清屏 */
row=0;
Locatexy();
}
/********************************/
/* 延时 */
/********************************/
void Delay(uchar MS)
{
// uchar us,usn;
while(MS!=0)
{/* usn = 4;
while(usn!=0)
{
us=0xf0;
while (us!=0){us--;};
usn--;
}*/
MS--;
}
}
void DisEnableFun(void)
{
*str_port=(*str_port)|(Elcd_1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -