?? sed1330.c
字號(hào):
/*以下示例程序所使用的液晶屏為320*240分辨率
本程序中的x坐標(biāo)值必須為8的倍數(shù),取值在0-319之間
y的取值在0-239之間
畫線的函數(shù)只能畫水平或垂直的直線,如果需要畫斜線,需要另外的算法
此程序中未提供源代碼
*/
#include<reg52.h>
#include<absacc.h>
#include<intrins.h>
#include<math.h>
#define uint unsigned int
#define uchar unsigned char
#define RR 0x01
#define LL 0x80
#define BLANK 1
#define WHITE 0
#define WC_ADD XBYTE[0x7100] //寫指令代碼地址
#define WD_ADD XBYTE[0x7000] //寫參數(shù)及顯示數(shù)據(jù)地址
#define RD_ADD XBYTE[0x7100] //讀參數(shù)及顯示數(shù)據(jù)地址
#define RB_ADD XBYTE[0x7000] //讀忙狀態(tài)地址
#define MiddleCursor 1
#define BigCursor 2
#define SmallCursor 0
// 特定字符的宏定義
#define CHARCM 0x00 //厘米
#define CHARHZ 0x01 //赫茲
#define CHARKG 0x02 //千克
#define CHARDU 0x03 //溫度
#define CHARFEN 0x04 //
#define CHARFEN1 0x06 //
#define CHARMIAO 0x05 //秒
//全局變量
uchar xdata Char_Var_Count1,Char_Var_Count2;
uchar xdata Int_Var_Temp;
uchar xdata SetX,SetY;
uchar xdata CNumber,PrCNumber;
xdata uchar BUFFER[0x0800] ;//顯示緩沖區(qū)
xdata uchar TBUF[240] ; //臨時(shí)緩沖區(qū)
bdata kk;
sbit kk_0=kk^0;
uchar idata OXL;
uchar idata OY;
uchar xdata PrX,PrY; //記錄光標(biāo)原來(lái)的X、Y座標(biāo)值
uchar code *hzp16;//指向16×16點(diǎn)陣字庫(kù)
uchar code *hzp24;//指向24×24點(diǎn)陣字庫(kù)
uchar code *nump;//指向自制數(shù)字字庫(kù)
uchar xdata *bufferp;
uchar xdata *tempdata;
uchar code systab[8]={0x30,0x87,0x07,0x27,0x42,0xf0,0x30,0x00};//SED1330系統(tǒng)設(shè)置參數(shù)表
uchar code scrtab[10]={0x00,0x00,0xf0,0x00,0x40,0xf0,0x00,0x80,0x00,0x00};//SCROLL參數(shù)表
uchar code ZK16[]={0x00,0x00};//此數(shù)組是16點(diǎn)陣字庫(kù),讀者自行制作,太長(zhǎng),省略
uchar code ZK24[]={0x00,0x00};//此數(shù)組是24點(diǎn)陣字庫(kù),讀者自行制作,太長(zhǎng),省略
uchar code num8p[20][12]= //此數(shù)組是作者自制的8*12點(diǎn)陣數(shù)字庫(kù)
{
0x00,0x3C,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x3C,0x00,//0
0x00,0x18,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,//1
0x00,0x3C,0x66,0x66,0x06,0x0C,0x18,0x30,0x60,0x60,0x7E,0x00,//2
0x00,0x3C,0x66,0x06,0x06,0x1C,0x06,0x06,0x06,0x66,0x3C,0x00,//3
0x00,0x06,0x0E,0x1E,0x1E,0x36,0x36,0x66,0x7E,0x06,0x06,0x00,//4
0x00,0x7E,0x60,0x60,0x60,0x7C,0x66,0x06,0x06,0x66,0x3C,0x00,//5
0x00,0x3C,0x66,0x60,0x60,0x7C,0x66,0x66,0x66,0x66,0x3C,0x00,//6
0x00,0x7E,0x06,0x0C,0x0C,0x18,0x18,0x18,0x30,0x30,0x30,0x00,//7
0x00,0x3C,0x66,0x66,0x66,0x3C,0x66,0x66,0x66,0x66,0x3C,0x00,//8
0x00,0x3C,0x66,0x66,0x66,0x66,0x3E,0x06,0x06,0x66,0x3C,0x00,//9
0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,//:
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//空格
0x00,0x00,0x42,0x66,0x24,0x18,0x7E,0x18,0x24,0x66,0x42,0x00,// *
0x00,0x38,0x44,0x84,0x80,0x80,0x80,0x84,0x44,0x38,0x00,0x00,//C
0x00,0x44,0x44,0x6C,0x6C,0x6C,0x54,0x54,0x54,0x54,0x00,0x00,//M
0x00,0x44,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44,0x00,0x00,//H
0x00,0x00,0x00,0x00,0x7C,0x08,0x10,0x20,0x40,0x7C,0x00,0x00,//z
0x00,0x84,0x88,0x90,0xA0,0xE0,0x90,0x88,0x88,0x84,0x00,0x00,//K
0x00,0x00,0x00,0x00,0x3C,0x48,0x78,0x40,0x78,0x44,0x38,0x00,//g
0x40,0xA0,0x4E,0x13,0x31,0x60,0x60,0x60,0x61,0x33,0x0E,0x00//溫度符號(hào)
};
///////////////////////////////////////////////////////////////
//Function of LCD Control
//////////////////////////////////////////////////////////////
void ClearLcd(void); //液晶屏清屏
void InitLcd(void); //顯示器初始化
void Dishz(uchar x1,uchar y1,uint position,uchar matrix);//顯示漢字
void MidLine(uchar x0,uchar y0,uchar x1,uchar y1,uchar cha);
//顯示半條錢(屏幕被分成上下兩部分,當(dāng)一條線跨過(guò)中線時(shí),需用此函數(shù))
void Line(uchar x0,uchar y0,uchar x1,uchar y1,uchar cha);//畫直線
void Rec(uchar x0,uchar y0,uchar x1,uchar y1,uchar qq);//畫矩形
void FullRec(uchar x0,uchar y0,uchar x1,uchar y1,uchar);//畫實(shí)心矩形
void DisSNum(uchar,uchar,uchar);//顯示單個(gè)數(shù)字
void DisSNumCpl(uchar,uchar,uchar);//反白顯示單個(gè)數(shù)字
void ReadBuffer(uchar x0,uchar y0,uchar x1,uchar y1);//讀顯示緩沖區(qū)
void DisplayBuffer(uchar x0,uchar y0,uchar x1,uchar y1);//顯示顯示緩沖區(qū)內(nèi)容
void DrawCursor(uchar x0,uchar y0,uchar state); //畫光棒
void ClearArea(uchar,uchar,uchar,uchar); //清除某區(qū)域
void DisplayNum(uchar x0,uchar y0,uint d0); //顯示數(shù)字,本程序中只顯示整數(shù)
void DisplayNumCpl(uchar x0,uchar y0,uint d0);//反白顯示數(shù)字
void DisplayTwoNum(uchar x0,uchar y0,uchar d0);//顯示兩位的數(shù)字
void DisplayBigNum(uchar x0,uchar y0,uint d0);//顯示較大的數(shù)字,超過(guò)三位
void DisplayTwoNumCpl(uchar x0,uchar y0,uchar d0);//反白顯示兩位數(shù)字
void InitLcd(void) //LCD初始化
{
uchar j;
WC_ADD=0x40;
for(j=0;j<0x08;j++) //寫入系統(tǒng)設(shè)置指令代碼
WD_ADD=systab[j]; //初始化,顯示窗口設(shè)置
WC_ADD=0x44;
for(j=0;j<0x0a;j++) //寫入SCROLL指令代碼
WD_ADD=scrtab[j]; //設(shè)置顯示區(qū)域,卷動(dòng)
WC_ADD=0x5a;
WD_ADD=0x00; //設(shè)置點(diǎn)單元卷動(dòng)位置
WC_ADD=0x5b;
WD_ADD=0x0c; //設(shè)置合成顯示方式
ClearLcd(); //清屏
WC_ADD=0x59; //顯示開,設(shè)置顯示方式
WD_ADD=0x04;
}
//屏幕為320*240分辯率,因每個(gè)字節(jié)顯示RAM可以代表屏幕上的一行8位的像素點(diǎn)
//故一個(gè)屏幕上的點(diǎn)要清屏只需對(duì)40*240個(gè)顯示RAM清0
void ClearLcd(void) //LCD清屏
{
uchar i,j;
WC_ADD=0x4c; //光標(biāo)向右移動(dòng)
WC_ADD=0x46; //設(shè)置光標(biāo)起始地址
WD_ADD=0x00; //光標(biāo)起始地址0000H
WD_ADD=0x00;
WC_ADD=0x42; //從0000H開始數(shù)據(jù)寫入顯示RAM
for(i=0;i<=0x60;i++)
{
for(j=0;j<255;j++)
WD_ADD=0; //寫入的數(shù)據(jù)為0
}
}
//輸入?yún)?shù)x、y是要顯示的數(shù)字所在的屏幕位置坐標(biāo),dat是所要顯示的數(shù)字
//光標(biāo)的位置與顯示RAM的地址是一致的
//此處的數(shù)字是筆者特制的8*12點(diǎn)陣
void DisSNum(uchar x,uchar y,uchar dat)
{
uchar code *q;
uchar flag;
uint dd;
q=num8p[dat];
OXL=x;OY=y;
dd=OY*0x30+OXL;// 計(jì)算對(duì)應(yīng)的顯示RAM地址
OXL=dd%256;//16位地址的低8位
OY=dd/256;//16位地址的高8位
flag=0;
WC_ADD=0x4f; //光標(biāo)移動(dòng)方向向下
WC_ADD=0x46; //設(shè)置光標(biāo)起始位置
WD_ADD=OXL; //16位地址的低8位
WD_ADD=OY; //16位地址的高8位
WC_ADD=0x42; //從該地址開始寫數(shù)據(jù)
for(Char_Var_Count2=0;Char_Var_Count2<12;Char_Var_Count2++)
WD_ADD=q[Char_Var_Count2]; //逐行輸出
}
//坐標(biāo)為(x0,y0)、(x1,y1)的兩點(diǎn)分別為所清屏區(qū)域的對(duì)角線的兩點(diǎn)
//清屏?xí)r先逐列清0
void ClearArea(uchar x0,uchar y0,uchar x1,uchar y1)
{
uint dd;
OXL=x0;OY=y0;
if(y0<180&&y1>180)
dd=0;
dd=OY*0x30+OXL;
OXL=dd%256;
OY=dd/256; ////+kk;
WC_ADD=0x4f; ////the cursor go down
for(Char_Var_Count1=0;Char_Var_Count1<cabs(x1-x0);Char_Var_Count1++)
{
WC_ADD=0x46; //set the point of cursor
WD_ADD=OXL; // x direction
WD_ADD=OY; // y direction
WC_ADD=0x42; //Write data to display buffer
for(Char_Var_Count2=0;Char_Var_Count2<cabs(y1-y0);Char_Var_Count2++)
{
WD_ADD=0x00;
}
OXL=OXL+1;
kk_0=CY;
OY=OY+kk;
}
}
//x,y是要顯示的漢字在屏幕的坐標(biāo),matrix是用來(lái)選擇漢字的矩陣大小
//matrix=1,漢字點(diǎn)陣為8*8,matrix=1,漢字點(diǎn)陣為16*16,matrix=1,漢字點(diǎn)陣為24*24
void Dishz(uchar x,uchar y,uint position,uchar matrix)
{
uchar code *q;
uchar flag;
uint dd;
hzp16=ZK16;
hzp24=ZK24;
if(matrix==1)
q=num8p[position];
else
if (matrix==2)
q=hzp16+position*8*matrix*matrix;
else
q=hzp24+position*8*matrix*matrix;
OXL=x;OY=y;
dd=OY*0x30+OXL;
OXL=dd%256;
OY=dd/256;//+kk;
flag=0;
WC_ADD=0x4f; //the cursor go down
for(Char_Var_Count1=0;Char_Var_Count1<matrix;Char_Var_Count1++)
{
WC_ADD=0x46; //set the point of cursor
WD_ADD=OXL; // x direction
WD_ADD=OY; // y direction
WC_ADD=0x42; //Write data to display buffer
for(Char_Var_Count2=0;Char_Var_Count2<(8*matrix);Char_Var_Count2++)
{
if(flag==0)
WD_ADD=q[Char_Var_Count2];
else
if(flag==1)
WD_ADD=q[Char_Var_Count2+8*matrix];
else
WD_ADD=q[Char_Var_Count2+48];
}
OXL=OXL+1;
kk_0=CY;
OY=OY+kk;
flag=flag+1;
}
}
//屏幕上被分了上下兩個(gè)顯示區(qū)
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -