📄 12864bing.h
字号:
#include<reg52.h>
#include<intrins.h>
#include<math.h>
#include <string.h>
#include <absacc.h>
#define X_ADDR XBYTE[0x0000]
#define Y_ADDR XBYTE[0x0100]
#define uchar unsigned char
#define uint unsigned int
sbit rs=P2^5;
sbit rw=P2^6;
sbit en=P2^7;
sbit psb=P2^3;
unsigned char data1[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
unsigned char data2[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
unsigned char ramdata[2];
unsigned char LCD_X,LCD_Y;
void delay100us(void)
{
uchar i=70;
while(i--)
;
}
void delayms(uchar k)
{uchar j=k;
while(j--)
delay100us();
}
void chk_busy()
{ rs=0;
rw=1;
en=1;
P0=0xff;
while((P0&0x80)==0x80);
en=0;
}
void write_com(uchar command)//写指令
{
chk_busy();
rs=0;
rw=0;
P0=command;
en=1;
_nop_();_nop_();
en=0;
}
void write_data(uchar _data) //写数据
{
chk_busy();
rs=1;
rw=0;
P0=_data;
en=1;
_nop_();_nop_();
en=0;
}
void WR_ZB(void)
{
write_com(0x34);
write_com(LCD_Y);
write_com(LCD_X);
write_com(0x30); //可省
}
uchar read_data(void) //读数据
{ uchar _data;
chk_busy();
en=0;
rs=1;
rw=1;
en=1;
_data=P0;
en=0;
return(_data);
}
void init() //初始化
{
psb=1;//选择并口运行
chk_busy();
write_com(0x30); //30h基本指令操作 ,34h为扩展指令操作
write_com(0x0c); //开显示,关光标,不闪烁。
write_com(0x01); //清除显示
delayms(50);
write_com(0x06); //指定在资料写入或读取时,光标的移动方向,DDRAM的地址计数器(AC)加1。
}
void display_char(uchar x,uchar y,uchar sig) //x为行,y为此行的第几个,sig为要显示的数
{
switch(x)
{
case 1:write_com(0x80+y-1);break;
case 2:write_com(0x90+y-1);break;
case 3:write_com(0x88+y-1);break;
case 4:write_com(0x98+y-1);break;
default:break;}
write_data(sig);
}
void display_string(uchar x,uchar y,uchar* sentence) //x为行,y为此行的第几个,sentence为一串句子
{
switch(x)
{
case 1:write_com(0x80+y-1);break;
case 2:write_com(0x90+y-1);break;
case 3:write_com(0x88+y-1);break;
case 4:write_com(0x98+y-1);break;
default:break;}
while(*sentence)
{write_data(*sentence++);}
}
void clear()
{
write_com(0x01);
delayms(50);
write_com(0x34);
write_com(0x30);
}
void display_num(uchar x,uchar y,uchar num)//显示两位数字
{
uchar tmp;
tmp=num/10; //gao
display_char(x,y,tmp+0x30) ;
tmp=num-tmp*10; //di
write_data(tmp+0x30);
}
void Imag(unsigned char code *img)
{ unsigned int j=0;
unsigned char x,y,i;
for(i=0;i<9;i+=8)
for(y=0;y<32;y++)/*原来 为 y<26 ,上下两个半屏不能正常对接显示,导致显示的图片中间有空隙*/
for(x=0;x<8;x++)
{ write_com(0x36);//功能设置---8BIT控制界面,扩充指令集
write_com(y+0x80); //行地址
write_com(x+0x80+i); //列地址
write_com(0x30);
write_data(img[j++]);
write_data(img[j++]);
}
}
void draw_point(char X,char Y,char State)
{
char X_Temp = 0;
char X_Position = 0;
X_Temp = X;
while (X_Temp>15)
{
X_Position++;
X_Temp = X_Temp-16;
}
if (X_Temp<=15)
{
if(Y<32)
{
LCD_X=0x80+X_Position;
LCD_Y=0x80+Y;
}
else
{
LCD_X=0x88+X_Position;
LCD_Y=0x80+Y-32;
}
WR_ZB();
read_data();
ramdata[0]=read_data();
ramdata[1]=read_data();
if(X_Temp<8)
{
WR_ZB();
if(State==0)
{
write_data(ramdata[0]|data1[X_Temp]);
write_data(ramdata[1]);
write_com(0x36);
}
else
{
write_data(ramdata[0]&data2[X_Temp]);
write_com(0x36);
}
}
else
{
WR_ZB();
if(State==0)
{
write_data(ramdata[0]);
write_data(ramdata[1]|data1[X_Temp-8]);
write_com(0x36);
}
else
{
write_data(ramdata[0]);
write_data(ramdata[1]&data2[X_Temp-8]);
write_com(0x36);
}
}
}
}
//*************************draw line start*******************************
draw_line(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2)
{
unsigned char x,y;
unsigned char d_x,d_y;//d_x=x2-x1;d_y=y2-y1;
char err=0;
unsigned char temp=0;
if(y2<=y1){x=x1;y=y1;x1=x2;y1=y2;x2=x;y2=y;}
d_y=y2-y1;
if (d_y==0)
{
if (x1>x2) {x=x1;x1=x2;x2=x;}
for ( x=x1;x<=x2;x++ ) draw_point(x,y,0);
}
else
{
if(x2>=x1){temp=1;d_x=x2-x1;}else d_x=x1-x2;
x=x1;y=y1;draw_point(x,y,0);
if(temp&&(d_y<=d_x))
while(x!=x2)
{if(err<0){x=x+1;err=err+(y2-y);}
else {x=x+1;y=y+1;err=err+(y2-y)-(x2-x);}
draw_point(x,y,0);
}
else if(temp&&(d_y>d_x))
while(y!=y2)
{d_x=x2-x;d_y=y2-y;
if(err<0){x=x+1;y=y+1;err=err+d_y-d_x;}
else {y=y+1;err=err-d_x;}
draw_point(x,y,0);
}
else if(!temp&&(d_y<=d_x))
while(x!=x2)
{d_x=x-x2;d_y=y2-y;
if(err<0){x=x-1;err=err+d_y;}
else {x=x-1;y=y+1;err=err+d_y-d_x;}
draw_point(x,y,0);
}
else if(!temp &&(d_y>d_x))
while(y!=y2)
{d_x=x-x2;d_y=y2-y;
if(err<0){x=x-1;y=y+1;err=err+d_y-d_x;}
else {y=y+1;err=err-d_x;}
draw_point(x,y,0);
}
}
}
void circle(unsigned char Ox,unsigned char Oy,unsigned char Rx)
{
unsigned char col,row;
unsigned int xx,rr,xt,yt,rs;
yt=Rx;
rr=Rx*Rx+1; //补偿 1 修正方形
rs=(yt+(yt>>1))>>1; //(*0.75)分开1/8圆弧来画
for (xt=0;xt<=rs;xt++)
{
xx=xt*xt;
while ((yt*yt)>(rr-xx))yt--;
col=Ox+xt; //第一象限
row=Oy-yt;
draw_point(col,row,0);
col=Ox-xt; //第二象限
draw_point(col,row,0);
row=Oy+yt; //第三象限
draw_point(col,row,0);
col=Ox+xt; //第四象限
draw_point(col,row,0);
/***************45度镜象画另一半***************/
col=Ox+yt; //第一象限
row=Oy-xt;
draw_point(col,row,0);
col=Ox-yt; //第二象限
draw_point(col,row,0);
row=Oy+xt; //第三象限
draw_point(col,row,0);
col=Ox+yt; //第四象限
draw_point(col,row,0);
}
}
void sinwave()
{
float zz;
uchar z;
for(zz=0;zz<6.28;zz+=0.1)
{
draw_point(z,sin(zz)*32+32,0);
z++;
}
for(zz=0;zz<6.28;zz+=0.1)
{
draw_point(z,sin(zz)*32+32,0);
z++;
}
}
void linex(char X,char end)
{
unsigned char temp;
for(temp=0;temp<end;temp++)
{
draw_point(X,temp,0);
}
}
void liney(char Y,char end)
{
unsigned char temp;
for(temp=0;temp<end;temp++)
{
draw_point(temp,Y,0);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -