📄 m12864.c
字号:
/*
**长沙太阳人电子有限公司SMG12864模拟接口参考程序(KS0108)
**电话: 0731-4167806,4167808
**E-mail: www@sunman.cn
**Create by :谭超 E-mail: tanchao_1@126.com
**最后修改 : 2005年3月17日
**版本说明: 带显示矩形框、线、点子程序。
*/
//[字符图象输出文件=hzk.c]
//[字体名称=宋体]
//[字体大小=16]
//[字节方向=垂直]
//[字位顺序=从低到高]
#include <reg51.h>
#include <math.h>
#include <intrins.h>
#include <hzk.c>
unsigned char data Lcd_CurrentX,Lcd_CurrentY,Lcd_Mask;
unsigned char code LeftMask[]={0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80};
unsigned char code RightMask[]={0xff,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f};
unsigned char code Mask1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char code Mask2[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
sbit RSPIN = P3^0;
sbit RWPIN = P3^3;
sbit EPIN = P3^4;
sbit CS1PIN = P3^1;
sbit CS2PIN = P3^2;
#define LCD_CMD_COL 0X40
#define LCD_CMD_PAGE 0XB8
#define LCD_CMD_ON 0X3F
#define LCD_CMD_OFF 0X3E
#define LCD_CMD_STARTLINE 0XC0
#define LCD_LEFT 0
#define LCD_TOP 0
#define LCD_RIGHT 127
#define LCD_BOTTOM 63
//延时子程序
void delay(unsigned int t)
{ unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<10;j++)
;
}
//片1测忙
void lcdwaitidle1(void)
{ P1=0xff;
RSPIN=0;
RWPIN=1;
CS1PIN=1;
EPIN=1;
while((P1&0x80)==0x80);
EPIN=0;
CS1PIN=0;
}
//片2测忙
void lcdwaitidle2(void)
{ P1=0xff;
RSPIN=0;
RWPIN=1;
CS2PIN=1;
EPIN=1;
while((P1&0x80)==0x80);
EPIN=0;
CS2PIN=0;
}
//写指令代码到片1
void lcdwc1(unsigned char cmdcode)
{ lcdwaitidle1();
P1=cmdcode;
RSPIN=0;
RWPIN=0;
CS1PIN=1;
EPIN=1;
_nop_();
EPIN=0;
CS1PIN=0;
}
//写指令代码到片2
void lcdwc2(unsigned char cmdcode)
{ lcdwaitidle2();
P1=cmdcode;
RSPIN=0;
RWPIN=0;
CS2PIN=1;
EPIN=1;
_nop_();
EPIN=0;
CS2PIN=0;
}
//写数据到片1
void lcdwd1(unsigned char dispdata)
{ lcdwaitidle1();
P1=dispdata;
RSPIN=1;
RWPIN=0;
CS1PIN=1;
EPIN=1;
_nop_();
EPIN=0;
CS1PIN=0;
}
//写数据到片2
void lcdwd2(unsigned char dispdata)
{ lcdwaitidle2();
P1=dispdata;
RSPIN=1;
RWPIN=0;
CS2PIN=1;
EPIN=1;
_nop_();
EPIN=0;
CS2PIN=0;
}
//读片1数据
unsigned char lcdrd1(void)
{ unsigned char i;
lcdwaitidle1();
P1=0xff;
RSPIN=1;
RWPIN=1;
CS1PIN=1;
EPIN=1;
_nop_();
i=P1;
EPIN=0;
CS1PIN=0;
return i;
}
//读片2数据
unsigned char lcdrd2(void)
{ unsigned char i;
lcdwaitidle2();
P1=0xff;
RSPIN=1;
RWPIN=1;
CS2PIN=1;
EPIN=1;
_nop_();
i=P1;
EPIN=0;
CS2PIN=0;
return i;
}
//写指令代码
void lcdwc(unsigned char cmdcode)
{ if((Lcd_CurrentX)<0x40)
lcdwc1(cmdcode);
else
lcdwc2(cmdcode);
}
//写数据
void lcdwd(unsigned char dispdata)
{ if(Lcd_CurrentX<64)
lcdwd1(dispdata);
else
lcdwd2(dispdata);
}
//内部数据地址指针定位
void lcdpos(void)
{ lcdwc(LCD_CMD_COL|(Lcd_CurrentX&0x3f)); //设置地址列指针
lcdwc(LCD_CMD_PAGE|((Lcd_CurrentY/8)&0x7)); //设置地址页指针
}
//读数据
unsigned char lcdrd(void)
{ unsigned char i;
if(Lcd_CurrentX<64)
{ i=lcdrd1();
i=lcdrd1(); //读两次
}
else
{ i=lcdrd2();
i=lcdrd2();
}
lcdpos();
return i;
}
//当前坐标移动到下一个点
void lcdcursornext(void)
{ Lcd_CurrentX++;
if(Lcd_CurrentX>LCD_RIGHT)
{ Lcd_CurrentX=LCD_LEFT;
Lcd_CurrentY+=8;
if(Lcd_CurrentY>LCD_BOTTOM)
Lcd_CurrentY=LCD_TOP;
}
}
void displaybyte(unsigned char dispdata)
{ lcdpos(); //内部数据地址指针定位
lcdwd(dispdata); //写数据
lcdcursornext(); //当前坐标移动到下一个点
}
//整屏显示
void lcdfill(unsigned char FillData)
{ Lcd_Mask=0xff;
for(Lcd_CurrentX=LCD_LEFT,Lcd_CurrentY=LCD_TOP;1;)
{ displaybyte(FillData);
if((Lcd_CurrentX==LCD_LEFT)&&(Lcd_CurrentY==LCD_TOP))
break;
}
}
//初始化
void lcdreset()
{ lcdwc1(LCD_CMD_ON); //开显示
lcdwc2(LCD_CMD_ON);
lcdwc1(LCD_CMD_STARTLINE); //设置显示初始行
lcdwc2(LCD_CMD_STARTLINE);
}
#include <display.c>
#include <point.c>
main()
{ while(1)
{ lcdreset(); //初始化
lcdfill(0xff); //整屏显示
delay(5000);
lcdfill(0); //清屏
delay(5000);
put_str_xy(0,0,"长沙太阳人电子有限公司");
delay(5000);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -