?? mylcd.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 Lcd_Driver(void)
{
// uint x;
col=0;
row=0;
Delay(40); /*延時(shí)大約40Ms,等待外設(shè)準(zhǔn)備好 */
Lcminit(); /*液晶模塊初始化,包括全屏幕清屏*/
Putstr(STR2,24); /*第一行字符輸出,24字節(jié) */
}
/****************************************/
/* 一個(gè)字串的輸出 */
/****************************************/
void Putstr(char *puts,uint i)
{
uint j,X;
for (j=0;j<i;j++)
{
X = puts[j];
if (X&0x80)
{
Putcdot(X&0x7f); /*只保留低7位*/
}
else Putedot(X-0x20); /*ascii碼表從0x20開始*/
}
}
/****************************************/
/* 半角字符點(diǎn)陣碼數(shù)據(jù)輸出 */
/****************************************/
void Putedot(uint Order)
{
uint i,bakerx,bakery; /*共定義4個(gè)局部變量 */
int x; /*偏移量,字符量少的可以定義為uint */
bakerx = col; /*暫存x,y坐標(biāo),已備下半個(gè)字符使用 */
bakery = row;
x=Order * 0x10; /*半角字符,每個(gè)字符16字節(jié) */
/*上半個(gè)字符輸出,8列 */
for(i=0;i<8;i++)
{
cbyte = Ezk[x]; /*取點(diǎn)陣碼,rom數(shù)組 */
Wrdata(cbyte); /*寫輸出一字節(jié) */
x++;
col++;
if (col==LCMLIMIT){col=0;row++;row++;}; /*下一列,如果列越界換行*/
if (row>7) row=0; /*如果行越界,返回首行 */
} /*上半個(gè)字符輸出結(jié)束 */
col = bakerx; /*列對齊 */
row = bakery+1; /*指向下半個(gè)字符行 */
/*下半個(gè)字符輸出,8列 */
for(i=0;i<8;i++)
{
cbyte = Ezk[x]; /*取點(diǎn)陣碼 */
Wrdata(cbyte); /*寫輸出一字節(jié) */
x++;
col++;
if (col==LCMLIMIT){col=0;row=row+2;}; /*下一列,如果列越界換行*/
if (row>7) row=1; /*如果行越界,返回首行 */
} /*下半個(gè)字符輸出結(jié)束 */
row=bakery;
} /*整個(gè)字符輸出結(jié)束 */
/****************************************/
/* 清屏,全屏幕清零 */
/****************************************/
void Lcmcls( void )
{
for(row=0;row<8;row++)
for(col=0;col<LCMLIMIT;col++) Wrdata(0);
}
void Wrdata(uint X)
{
Locatexy(); /*坐標(biāo)定位,返回時(shí)保留分區(qū)狀態(tài)不變 */
// wtcom();
*str_port= (*str_port)|DIlcd_1; /*數(shù)據(jù)輸出*/
*str_port= (*str_port)&RWlcd_0; /*寫輸出 */
*str_data= X; /*數(shù)據(jù)輸出到數(shù)據(jù)口 */
*str_port=(*str_port)|Elcd_1; /*讀入到LCM*/
// _nop_();
*str_port=(*str_port)&Elcd_0;
}
/********************************/
/* 命令輸出到左區(qū)控制口 */
/********************************/
void WrcmdL(uint X)
{
lcdbusyL(); /*確定分區(qū),返回時(shí)保留分區(qū)狀態(tài)不變*/
*str_port= (*str_port)&DIlcd_0; /*命令操作 */
*str_port= (*str_port)&RWlcd_0; /*寫輸出 */
*str_data= X; /*數(shù)據(jù)輸出到數(shù)據(jù)口 */
*str_port=(*str_port)|Elcd_1;
*str_port=(*str_port)&Elcd_0; /*讀入到LCM*/
}
/********************************/
/* 命令輸出到中區(qū)控制口 */
/********************************/
void WrcmdM(uint X)
{
lcdbusyM(); /*確定分區(qū),返回時(shí)保留分區(qū)狀態(tài)不變*/
*str_port= (*str_port)&DIlcd_0; /*命令操作 */
*str_port= (*str_port)&RWlcd_0; /*寫輸出 */
*str_data= X; /*命令輸出到數(shù)據(jù)口 */
*str_port=(*str_port)|Elcd_1;//_nop_();
*str_port=(*str_port)&Elcd_0; /*讀入到LCM*/
}
/********************************/
/* 命令輸出到右區(qū)控制口 */
/********************************/
void WrcmdR(uint X)
{
lcdbusyR(); /*確定分區(qū),返回時(shí)保留分區(qū)狀態(tài)不變 */
*str_port= (*str_port)&DIlcd_0; /*命令操作 */
*str_port= (*str_port)&RWlcd_0; /*寫輸出 */
*str_data= X; /*命令輸出到數(shù)據(jù)口 */
*str_port=(*str_port)|Elcd_1;//_nop_();
*str_port=(*str_port)&Elcd_0; /*讀入到LCM*/
}
/********************************************************/
/* 分區(qū)操作允許等待,返回時(shí)保留分區(qū)選擇狀態(tài) */
/********************************************************/
void lcdbusyL(void)
{
*str_port=(*str_port)|CS1_1; /*CLR CS1 */
*str_port=(*str_port)&CS2_0; /*SETB CS2 */
*str_port=(*str_port)&CS3_0;
//CS3LCM = 1; /*SETB CS3 */
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 */
//CS3LCM = 1; /*SETB CS3 */
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 */
//CS3LCM = 0; /*CLR CS3 */
wtcom(); /* waitting for enable */
}
void wtcom(void)
{
*str_port= (*str_port)&DIlcd_0; /*CLR DI */
*str_port= (*str_port)|RWlcd_1; /*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;
}
/********************************************************/
/*根據(jù)設(shè)定的坐標(biāo)數(shù)據(jù),定位LCM上的下一個(gè)操作單元位置 */
/********************************************************/
void Locatexy(void)
{
unsigned char x,y;
switch (col&0xc0) /* col.and.0xC0 */
{ /*條件分支執(zhí)行 */
case 0: {lcdbusyL();break;} /*左區(qū) */
case 0x40: {lcdbusyM();break;} /*中區(qū) */
case 0x80: {lcdbusyR();break;} /*右區(qū) */
}
x = col&0x3F|SETX; /* col.and.0x3f.or.setx=0x40 */
y = row&0x07|SETY; /* row.and.0x07.or.sety=b8 */
wtcom(); /* waitting for enable */
*str_port= (*str_port)&DIlcd_0; /*CLR DI */
*str_port= (*str_port)&RWlcd_0; /*CLR RW */
*str_data= y; /*MOV P0,Y */
*str_port=(*str_port)|Elcd_1;//_nop_();
*str_port=(*str_port)&Elcd_0;
wtcom(); /* waitting for enable */
*str_port= (*str_port)&DIlcd_0; /*CLR DI */
*str_port= (*str_port)&RWlcd_0; /*CLR RW */
*str_data= x; /*MOV P0,X */
*str_port=(*str_port)|Elcd_1;//_nop_();
*str_port=(*str_port)&Elcd_0;
}
/********************************/
/*液晶屏初始化 */
/********************************/
void Lcminit(void)
{
cbyte = DISPOFF; /*關(guān)閉顯示屏 */
WrcmdL(cbyte); /*左區(qū)*/
WrcmdM(cbyte); /*中區(qū)*/
WrcmdR(cbyte); /*右區(qū)*/
cbyte = DISPON; /*打開顯示屏 */
WrcmdL(cbyte); /*左區(qū)*/
WrcmdM(cbyte); /*中區(qū)*/
WrcmdR(cbyte); /*右區(qū)*/
cbyte = DISPFIRST; /*定義顯示起始行為零 */
WrcmdL(cbyte);
WrcmdM(cbyte);
WrcmdR(cbyte);
Lcmcls();
col=0; /*清屏 */
row=0;
Locatexy();
}
/********************************/
/* 延時(shí) */
/********************************/
void Delay(uint MS)
{
uint us,usn;
while(MS!=0)
{ usn = 4;
while(usn!=0)
{
us=0xf0;
while (us!=0){us--;};
usn--;
}
MS--;
}
}
/****************************************/
/* 從液晶片上讀數(shù)據(jù),保留在全局變量中 */
/****************************************/
void Rddata(void)
{
Locatexy(); /*坐標(biāo)定位,返回時(shí)保留分區(qū)狀態(tài)不變 */
*str_data=0xFF;
*str_port= (*str_port)|DIlcd_1; /*數(shù)據(jù)*/
*str_port= (*str_port)|RWlcd_1; /*讀數(shù)據(jù)*/
*str_port=(*str_port)|Elcd_1; /*讀入到LCM*/
// _nop_();
cbyte = *str_data; /*虛讀一次 */
*str_port=(*str_port)&Elcd_0;
Locatexy(); /*坐標(biāo)定位,返回時(shí)保留分區(qū)狀態(tài)不變 */
*str_data=0xFF;
// _nop_();
*str_port= (*str_port)|DIlcd_1; /*數(shù)據(jù)*/
*str_port= (*str_port)|RWlcd_1; /*讀數(shù)據(jù)*/
*str_port=(*str_port)|Elcd_1; /*讀入到LCM*/
// _nop_();
cbyte = *str_data; /*從數(shù)據(jù)口讀數(shù)據(jù),真讀 */
*str_port=(*str_port)&Elcd_0;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -