?? sed1330.h
字號:
//以下程序用于SED1330控制的液晶顯示模塊,顯示點陣為320X240
#include "stdarg.h"
#define CR 39 /*定義顯示窗口的長度,以字符為單位*/
#define TCR 45 /*定義LCD的時間常數.這個時間常數應該盡量小(場頻就大),防止轉換時出現閃爍*/
#define LF 239 /*定義LCD的行數*/
#define APL 40 /*定義LCD一行所占緩沖區的字節數,低8位*/
#define APH 0 /*定義LCD一行所占緩沖區的字節數,高8位*/
#define SAD1 0X0000 /*定義顯示一區首址*/
#define SAD1L 0X00 /*定義顯示一區首址低8位*/
#define SAD1H 0X00 /*定義顯示一區首址高8位*/
#define SL1 239 /*定義顯示一區所占顯示屏幕的行數*/
#define SAD2 0X2800 /*定義顯示二區首址*/
#define SAD2L 0X00 /*定義顯示二區首址低8位*/
#define SAD2H 0X28 /*定義顯示二區首址高8位*/
#define SL2 239 /*定義顯示二區所占顯示屏幕的行數*/
#define SAD3 0X5000 /*定義顯示三區首址*/
#define SAD3L 0X00 /*定義顯示三區首址低8位*/
#define SAD3H 0X50 /*定義顯示三區首址高8位*/
#define SAD4 0X2800 /*定義顯示四區首址*/
#define SAD4L 0X00 /*定義顯示四區首址低8位*/
#define SAD4H 0X28 /*定義顯示四區首址高8位*/
#define TA_LEFT 0 //左對齊方式
#define TA_CENTER 1 //中心對齊方式
///////////////////////
void wrstr(unsigned int sad,unsigned int hnum,unsigned char vnum,unsigned char* str);
void wrdot(unsigned int sad,unsigned int hnum,unsigned char vnum);
void initlcd();
void rectangle(unsigned int sad,unsigned int strhnum,unsigned char strvnum,unsigned int endhnum,unsigned char endvnum,unsigned char fill);
void wrchat(unsigned int sad,unsigned int hnum,unsigned char vnum,unsigned char chatnum);
void liney(unsigned int sad,unsigned int x,unsigned char y1,unsigned char y2);
void linex(unsigned int sad,unsigned char y,unsigned int x1,unsigned int x2);
//////////////////////
/*設定三個顯示區域為:第一顯示區 0000H----27FFH (10K容量)
第二顯示區 2800H----4FFFH (10K容量)
第三顯示區 5000H----77FFH (10K容量)*/
const unsigned char LCDSYSINIT[8]={0X30,0X87,0X07,CR,TCR,LF,APL,APH}; /*主LCD0的SYS設置參數*/
const unsigned char LCDSCRINIT[10]={SAD1L,SAD1H,SL1,SAD2L,SAD2H,SL2,SAD3L,SAD3H,SAD4L,SAD4H}; /*主LCD0的SCR設置參數*/
/***********************************************************
* 程序名稱: INITLCD *
* 程序用途: 將SED1330 初始化成3層圖形方式 *
* 輸入參數: 無 *
* *
* *
***********************************************************/
void initlcd()
{
xdata unsigned char counter;
LCDORDER=0X40; /*送入SYS命令*/
for(counter=0;counter<=7;counter++)
{LCDDATA=LCDSYSINIT[counter];} /*送入8個SYSTERM數據*/
LCDORDER=0X44; /*送入SCROLL命令*/
for(counter=0;counter<=9;counter++)
{LCDDATA=LCDSCRINIT[counter];} /*送入十個SCROLL數據*/
LCDORDER=0X5A; /*送入HDOTSCR命令*/
LCDDATA=0X00; /*送入HDOTSCR數據*/
LCDORDER=0X4F;
LCDORDER=0X5B; /*送入OVLAY命令*/
LCDDATA=0X1D; /*送入OVLAY數據,顯示方式==(L1*L2)+L3 */
LCDORDER=0X59; /*開關顯示*/
LCDDATA=0X40; /*開啟一.二四.三, 關閉光標*/
//LCDDATA=0X04|0x10|0x40; /*開啟一.二四.三, 關閉光標*/
LCDORDER=0X5D; /*設置光標*/
LCDDATA=0X07; /*水平點數為7*/
LCDDATA=0X87; /*垂直點數為7,陰影顯示*/
}
/***********************************************************
* 程序名稱: WRDOT() *
* 程序用途: 在指定層的指定位置寫點. *
* 輸入參數: sad 指定層的內存地址 *
* hnum 點橫坐標 *
* vnum 點縱坐標 *
* *
***********************************************************/
void wrdot(unsigned int sad,unsigned int hnum,unsigned char vnum)
{
unsigned char flag;
union {unsigned int add;
struct {unsigned char addhi;unsigned char addlo;}addhalf;
}curadd;
curadd.add=vnum*(APL)+hnum/8+sad;
flag=hnum-(hnum/8)*8;
flag=(0x80)>>flag;
LCDORDER=0X46; /*設置光標地址*/
LCDDATA=curadd.addhalf.addlo;
LCDDATA=curadd.addhalf.addhi;
LCDORDER=0X43; /*取出該點所在地址的數據*/
flag=flag|(LCDORDER);
LCDORDER=0X46;
LCDDATA=curadd.addhalf.addlo;
LCDDATA=curadd.addhalf.addhi;
LCDORDER=0X42;
LCDDATA=flag;
}
/***********************************************************
* 程序名稱: WRDOT() *
* 程序用途: 在指定層的指定位置清點. *
* 輸入參數: sad 指定層的內存地址 *
* hnum 點橫坐標 *
* vnum 點縱坐標 *
* *
***********************************************************/
/*void clsdot(unsigned int sad,unsigned int hnum,unsigned char vnum)
{
xdata unsigned char flag;
xdata union {unsigned int add;
struct {unsigned char addhi;unsigned char addlo;}addhalf;
}curadd;
curadd.add=vnum*(APL)+hnum/8+sad;
flag=hnum-(hnum/8)*8;
flag=(0x80)>>flag;
flag=~flag;
LCDORDER=0X46; //設置光標地址
LCDDATA=curadd.addhalf.addlo;
LCDDATA=curadd.addhalf.addhi;
LCDORDER=0X43; //取出該點所在地址的數據
flag=flag&(LCDORDER);
LCDORDER=0X46;
LCDDATA=curadd.addhalf.addlo;
LCDDATA=curadd.addhalf.addhi;
LCDORDER=0X42;
LCDDATA=flag;
} */
/***********************************************************
* 程序名稱: CLSSED() *
* 程序用途: 清空顯示器 *
* 輸入參數: 無 *
* *
* *
* *
************************************************************/
void clssed(unsigned int sad)
{
xdata union {unsigned int add;
struct {unsigned char addhi;unsigned char addlo;}addhalf;
}curadd;
curadd.add=sad;
LCDORDER=0X46; /*設置光標地址*/
LCDDATA=curadd.addhalf.addlo;
LCDDATA=curadd.addhalf.addhi;
LCDORDER=0X4C;
LCDORDER=0X42;
sad=0;
while(sad<9600)
{
LCDDATA=0X00;
sad++;
}
}
/***********************************************************
* 程序名稱: LINEX() *
* 程序用途: 作水平線 *
* 輸入參數: sad 指定層的內存地址 *
* y位置 *
* x1起點 *
* x2終點 *
* *
* *
************************************************************/
void linex(unsigned int sad,unsigned char y,unsigned int x1,unsigned int x2)
{
do{
wrdot(sad,x1,y);
x1++;
}while(x1<=x2);
}
/***********************************************************
* 程序名稱: LINEY() *
* 程序用途: 作垂直線 *
* 輸入參數: sad 指定層的內存地址 *
* x位置 *
* y1起點 *
* y2終點 *
* *
* *
************************************************************/
void liney(unsigned int sad,unsigned int x,unsigned char y1,unsigned char y2)
{
do{
wrdot(sad,x,y1);
y1++;
}while(y1<=y2);
}
/***********************************************************
* 程序名稱: LINE() *
* 程序用途: 作垂直線 *
* 輸入參數: sad 指定層的內存地址 *
* x1起點 *
* x2終點 *
* y1起點 *
* y2終點 *
* *
* *
************************************************************/
/*void line(unsigned int sad,unsigned int x1,unsigned int x2,unsigned char y1,unsigned char y2)
{
unsigned char tem,tem1;
if(y2>y1)
{
tem=y2-y1;
for(tem1=0;tem1<=tem/2;tem1++)
{
wrdot(sad,x1,y1+tem1);
wrdot(sad,x2,y1+tem/2+tem1+1);
}
}
else
{
tem=y1-y2;
for(tem1=0;tem1<=tem/2;tem1++)
wrdot(sad,x1,y1-tem1);
for(tem1=1;tem1<=tem/2;tem1++)
wrdot(sad,x2,y1-tem/2-tem1);
}
} */
/***********************************************************
* 程序名稱: WRCHAT() *
* 程序用途: 在指定層的指定位置寫ASCII字符 *
* 輸入參數: sad 指定層的內存地址 *
* hnum 點橫坐標 *
* vnum 點縱坐標 *
* chatnum字符的序號值 *
***********************************************************/
void wrchatasc(unsigned int sad,unsigned int hnum,unsigned char vnum,unsigned char chatnum)
{
unsigned char buff[16]; /*緩存,用于讀寫ASCII字符的16*16點陣*/
unsigned char counter;
unsigned char flag1;
unsigned char flag2;
unsigned char offset;
union {unsigned int add;
struct {unsigned char addhi;unsigned char addlo;}addhalf;
}curadd;
curadd.add=vnum*(APL)+hnum/8+sad; /*計算出首址*/
offset=hnum-(hnum/8)*8; /*計算出字符內的偏移量*/
LCDORDER=0X46; /*確定光標地址*/
LCDDATA=curadd.addhalf.addlo;
LCDDATA=curadd.addhalf.addhi;
/*以下寫字符的左部*/
LCDORDER=0X4F; /*確定光標移動方向為向下*/
flag1=(0XFF)<<(8-offset);
flag2=~flag1;
LCDORDER=0X43; /*由光標處開始,向下讀入16個數據*/
for(counter=0;counter<16;counter++)
{ /*由于LCDORDER的操作是一次寫,一次讀,C51可能在讀操作時優化成直接使用寫的數據,
而不進行讀操作,所以加一個無用指令*/
buff[counter]=(LCDORDER&flag1)|(ASC_MSK[chatnum][counter]>>offset);
}
LCDORDER=0X46; /*再次確定光標地址*/
LCDDATA=curadd.addhalf.addlo;
LCDDATA=curadd.addhalf.addhi;
LCDORDER=0X42;
for(counter=0;counter<16;counter++)
{
(LCDDATA)=buff[counter];
}
curadd.add=curadd.add+1; /*地址加1,移到右部*/
LCDORDER=0X4F; /*確定光標移動方向為向下*/
LCDORDER=0X46; /*確定光標地址*/
LCDDATA=curadd.addhalf.addlo;
LCDDATA=curadd.addhalf.addhi;
flag1=(0XFF)>>offset;
flag2=~flag1;
flag1=0XFF>>offset;
LCDORDER=0X43; /*由光標處開始,向下讀入16個數據*/
for(counter=0;counter<16;counter++)
{
buff[counter]=(LCDORDER&flag1)|(ASC_MSK[chatnum][counter]<<(8-offset));
}
LCDORDER=0X46; /*再次確定光標地址*/
LCDDATA=curadd.addhalf.addlo;
LCDDATA=curadd.addhalf.addhi;
LCDORDER=0X42;
for(counter=0;counter<16;counter++)
{
(LCDDATA)=buff[counter];
}
}
/***********************************************************
* 程序名稱: WRCHAT() *
* 程序用途: 在指定層的指定位置寫漢字字符 *
* 輸入參數: sad 指定層的內存地址 *
* hnum 點橫坐標 *
* vnum 點縱坐標 *
* chatnum字符的序號值 *
***********************************************************/
void wrchat(unsigned int sad,unsigned int hnum,unsigned char vnum,unsigned char chatnum)
{
unsigned char buff[16]; /*緩存,用于讀寫ASCII字符的16*16點陣*/
unsigned char counter;
unsigned char flag1;
unsigned char flag2;
unsigned char offset;
union {unsigned int add;
struct {unsigned char addhi;unsigned char addlo;}addhalf;
}curadd;
curadd.add=vnum*(APL)+hnum/8+sad; /*計算出首址*/
offset=hnum-(hnum/8)*8; /*計算出字符內的偏移量*/
LCDORDER=0X46; /*確定光標地址*/
LCDDATA=curadd.addhalf.addlo;
LCDDATA=curadd.addhalf.addhi;
/*以下寫字符的左部*/
LCDORDER=0X4F; /*確定光標移動方向為向下*/
flag1=(0XFF)<<(8-offset);
flag2=~flag1;
LCDORDER=0X43; /*由光標處開始,向下讀入16個數據*/
for(counter=0;counter<16;counter++)
buff[counter]=(LCDORDER&flag1)|(GB_16[chatnum].Msk[counter]>>offset);
LCDORDER=0X46; /*再次確定光標地址*/
LCDDATA=curadd.addhalf.addlo;
LCDDATA=curadd.addhalf.addhi;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -