看看51的c写的12864
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
看看51的c写的12864
/**********************************************/ // 点阵 LCD 操作函数(I/O模式) //
// LCD 型号 : CGS12864 //
// FW 版本 : Ver 1.0 //
// 设计者 : LS //
// 日期 : 04/11/23 //
// //
// ------------------------------- //
// | | //
// | CSG12864 | //
// | 驱动IC:HD61202(KS0108B) | //
// ------------------------------- //
/**********************************************/
/****************** 端口定义 ******************/ sbit LCD_EN = P3^7;
sbit LCD_CSA = P3^3;
sbit LCD_CSB = P3^4;
sbit LCD__DI = P3^5; // DI=高>>数据,DI=低>>命令 // sbit LCD_RW = P3^6; // RW=高>>读,RW=低>>写 //
sbit DD0 = P2^0;
sbit DD1 = P2^1;
sbit DD2 = P2^2;
sbit DD3 = P2^3;
sbit DD4 = P2^4;
sbit DD5 = P2^5;
sbit DD6 = P2^6;
sbit DD7 = P2^7;
#define LCD_DAT P2
#define LCD_ON 0x3f
#define LCD_OFF 0x3e
#define LCD_SRow 0xc0 // 设置启始行 //
#define LCD_Page 0xb8 // 页地址(Y 坐标) //
#define LCD_Y 0x40 // 列地址(X 坐标) //
/**************** 左边 LCD 写命令 *************/ void Left_CMD(unsigned char CMD)
{
LCD_CSA = 0;
LCD_CSB = 1;
LCD_DI = 0;
LCD_RW = 1;
LCD_DAT = 0xff;
LCD_EN = 1;
while(DD7==1)
{
LCD_En = 0;
LCD_DAT = 0xff;
LCD_EN = 1;
}
LCD_EN = 0;
LCD_DAT = CMD;
LCD_RW = 0;
LCD_EN = 1;
LCD_EN = 0;
}
/**************** 右边 LCD 写命令 *************/ void Right_CMD(unsigned char CMD)
{
LCD_En = 0;
LCD_CSA = 1;
LCD_CSB = 0;
LCD_DI = 0;
LCD_RW = 1;
LCD_DAT = 0xff;
LCD_EN = 1;
while(DD7==1)
{
LCD_En = 0;
LCD_DAT = 0xff;
LCD_EN = 1;
}
LCD_EN = 0;
LCD_DAT = CMD;
LCD_RW = 0;
LCD_EN = 1;
}
/**************** 左边 LCD 写数据 *************/ void Left_DATA(unsigned char lcd_data)
{
LCD_En = 0;
LCD_CSA = 0;
LCD_CSB = 1;
LCD_DI = 0;
LCD_RW = 1;
LCD_DAT = 0xff;
LCD_EN = 1;
while(DD7==1)
{
LCD_En = 0;
LCD_DAT = 0xff;
LCD_EN = 1;
}
LCD_EN = 0;
LCD_DAT = lcd_data;
LCD_DI = 1;
LCD_RW = 0;
LCD_EN = 1;
LCD_EN = 0;
}
/**************** 右边 LCD 写数据 *************/ void Right_DATA(unsigned char lcd_data)
{
LCD_En = 0;
LCD_CSA = 1;
LCD_CSB = 0;
LCD_DI = 0;
LCD_RW = 1;
LCD_DAT = 0xff;
LCD_EN = 1;
while(DD7==1)
{
LCD_En = 0;
LCD_DAT = 0xff;
}
LCD_EN = 0;
LCD_DAT = lcd_data;
LCD_DI = 1;
LCD_RW = 0;
LCD_EN = 1;
LCD_EN = 0;
}
/**************** 左边 LCD 清屏 ***************/ void Left_Clear(unsigned char WB)
{
unsigned char i,j;
Left_CMD(LCD_SRow);
for(i=0;i<=7;i++)
{
Left_CMD(LCD_Page|i);
Left_CMD(LCD_Y);
for(j=0;j<=63;j++)
{
Left_DATA(WB);
}
}
}
/**************** 右边 LCD 清屏 ***************/ void Right_Clear(unsigned char WB)
{
unsigned char i,j;
Right_CMD(LCD_SRow);
for(i=0;i<=7;i++)
{
Right_CMD(LCD_Page|i);
Right_CMD(LCD_Y);
for(j=0;j<=63;j++)
{
Right_DA TA(WB);
}
}
}
/************** 读 LCD 左边数据 **************/
unsigned char Left_Read()
{
unsigned char readd;
LCD_EN = 0;
LCD_CSA = 0;
LCD_CSB = 1;
LCD_DI = 0;
LCD_RW = 1;
LCD_DAT = 0xff;
LCD_EN = 1;
while(DD7==1)
{
LCD_EN = 0;
LCD_DAT = 0xff;
LCD_EN = 1;
}
LCD_EN = 0;
LCD_DI = 1;
LCD_DAT = 0xff;
LCD_EN = 1;
readd = LCD_DA T;
LCD_EN = 0;
return readd;
}
/************** 读 LCD 右边数据 **************/ unsigned char Right_Read()
{
unsigned char readd;
LCD_EN = 0;
LCD_CSA = 1;
LCD_CSB = 0;
LCD_DI = 0;
LCD_RW = 1;
LCD_DAT = 0xff;
LCD_EN = 1;
while(DD7==1)
{
LCD_EN = 0;
LCD_DAT = 0xff;
LCD_EN = 1;
}
LCD_EN = 0;
LCD_DI = 1;
LCD_DAT = 0xff;
LCD_EN = 1;
readd = LCD_DA T;
LCD_EN = 0;
return readd;
}
/*********** 在 LCD 上显示字符串 **************/
void Dis_Str(unsigned char X,unsigned char Y, unsigned char *tata) // 字符大小8*16,X(0-15),Y(0-7) 调用字库//
{
unsigned char i;
Left_CMD(LCD_SRow|0x00);
Right_CMD(LCD_SRow|0x00);
while(*tata != '\0')
{
if(X < 8)
{
Left_CMD(LCD_Page|Y);
Left_CMD(LCD_Y|X*8); // 字符显示地址 //
for(i=0;i<8;i++)
{
Left_DATA(ASCII_816[(*tata-32)*16+i]);
}
Left_CMD(LCD_Page|Y+1);
Left_CMD(LCD_Y|X*8);
for(i=8;i<16;i++)
{
Left_DATA(ASCII_816[(*tata-32)*16+i]);
}
tata++;
X += 1;
}
else
{
Right_CMD(LCD_Page|Y);
Right_CMD(LCD_Y|X*8); // 字符显示地址 //
for(i=0;i<8;i++)
{
Right_DA TA(ASCII_816[(*tata-32)*16+i]);
}
Right_CMD(LCD_Page|Y+1);
Right_CMD(LCD_Y|X*8);
for(i=8;i<16;i++)
{
Right_DA TA(ASCII_816[(*tata-32)*16+i]);
}
tata++;
X += 1;
}
}
}
/************** 在 LCD 上显示图片 *************/
void Dis_Pic(unsigned char Xrow,unsigned char Yrow,
unsigned char Xsize,unsigned char Ysize,unsigned char *picadd)
// Xrow(0-15),Yrow(0-7) 图片显示的位置,Xsize,Ysize,图片大小8的倍数,超过边界部分自动消除 //
{
unsigned char i,j,k;
Left_CMD(LCD_SRow|0x00);
Right_CMD(LCD_SRrow|0x00);
for(j=Yrow;j<Yrow+(Ysize/8);j++)
{
if(Xrow < 8)
{
Left_CMD(LCD_Page|j);
Left_CMD(LCD_Y|Xrow*8);
if((Xrow*8+Xsize) < 64)
{
k=64-(xrow*8);
for(i=0;i<=k;i++)
{
Left_DATA(*(picadd+((j-Yrow)*Xsize+i)));
}
Right_CMD(LCD_Page|j);
Right_CMD(LCD_Y|0x00);
k=Xsize;
for(i=64-(Xrow*8);i<k;i++)
{
Right_data(*(picadd+((j-Yrow)*Xsize+i)));
}
}
else
{
for(i=0;i<xsize;i++)
{
left_data(*(picadd+((j-yrow)*xsize+i)));//pp[j-yrow][i]); }
}
}
else
{
right_command(lcd_page|j);
right_command(lcd_y|xrow*8);
for(i=0;i<xsize;i++)
{
right_data(*(picadd+((j-yrow)*xsize+i)));//pp[j-yrow][i]); }
}
}
}
/*************** 打开 LCD 显示 ***************/ void LCD_Open(void)
{
Left_CMD(LCD_ON);
Right_CMD(LCD_ON);
}
/**************** 关闭 LCD 显示 ***************/ void LCD_Close(void)
{
Left_CMD(LCD_OFF);
Right_CMD(LCD_OFF);
}
/****************** LCD 清屏 ******************/
void LCD_Clear(void)
{
Left_Clear(0);
Right_Clear(0);
}
/****************** LCD 黑屏 ******************/
void LCD_Black(void)
{
Left_Clear(0xff);
Right_Clear(0xff);
}
/******* 在 LCD 上 (x,y) 处画一个点 ***********/
void LCD_DrawPoint(unsigned char X,unsigned char Y,unsigned char WB) // X(0-127),y(0-63) //
{
unsigned char i,lcd_p,lcd_point;
if(Y < 8)
{ lcd_p = 7;
lcd_point = Y;
}
else if(Y < 16)
{ lcd_p = 6;
lcd_point = Y - 8;
}
else if(Y < 24)
{ lcd_p = 5;
lcd_point = Y - 16;
}
else if(Y < 32)
{ lcd_p = 4;
lcd_point = Y - 24;
}
else if(Y < 40)
{ lcd_p = 3;
lcd_point = Y - 32;
}
else if(Y < 48)
{ lcd_p = 2;
lcd_point = Y - 40;
}
else if(Y < 56)
{ lcd_p = 1;
lcd_point = Y - 48;
}
else if(Y < 64)
{ lcd_p = 0;
lcd_point = Y - 56;
}
lcd_point = 0x80>>lcd_point;
if(x < 64) //left//
{
Left_CMD(lcd_page|lcd_p); Left_CMD(lcd_y|X);
i = Left_Read();
if(WB == 1)
{
i |= lcd_point;
}
else
{
i &= ~lcd_point;
}
Left_CMD(lcd_page|lcd_p); Left_CMD(lcd_y|X);
Left_Data(i);
}
else //right//
{
x -= 64;
Right_CMD(lcd_page|lcd_p); Right_CMD(lcd_y|X);
i = Right_Read();
if(WB == 1)
{
i |= lcd_point;
}
else
{
i &= ~lcd_point;
}
Right_CMD(lcd_page|lcd_p); Right_CMD(lcd_y|X);
Right_Data(i);
}
}。