📄 lcd320240.c
字号:
#include <reg51.h>
#define LCDSIZE 320
sbit reset=P3^3;
sbit cd =P3^4;
sbit vee =P3^5;
sbit wr =P3^6;
sbit rd =P3^7;
void ag(unsigned int x,unsigned int y);
void disp(unsigned char dat);
void setb(unsigned char d);
void clrb(unsigned char d);
void ab(unsigned char x,unsigned char y);
void noab(void);
void p1(void);
unsigned char busy(void);
void ctrl(unsigned char dat);
void write(unsigned char dat);
void lcd_init(void);
void delay(unsigned int n);
void circle(unsigned char Ox,unsigned char Oy,unsigned char Rx);
void Linexy(unsigned char x0,unsigned char y0,unsigned char xt,unsigned char yt);
void disp_hz(unsigned int x,unsigned int y,unsigned char *str,unsigned char size,bit un);
unsigned char code fot[]={
/*0A*/
0,0,16,56,108,198,198,254,198,198,198,198,0,0,0,0,
/*0B*/
0,0,252,102,102,102,124,102,102,102,102,252,0,0,0,0,
/*0时*/
0x00,0x08,0x04,0x08,0x7e,0x08,0x44,0x08,0x47,0xfe,0x44,0x08,0x44,0x08,0x7c,0x88,
0x44,0x48,0x44,0x48,0x44,0x08,0x44,0x08,0x7c,0x08,0x44,0x48,0x00,0x28,0x00,0x10,
/*1间*/
0x20,0x04,0x1b,0xfe,0x08,0x04,0x40,0x24,0x4f,0xf4,0x48,0x24,0x48,0x24,0x48,0x24,
0x4f,0xe4,0x48,0x24,0x48,0x24,0x48,0x24,0x4f,0xe4,0x48,0x24,0x40,0x14,0x40,0x08
};
void main(void)
{
lcd_init();
if(LCDSIZE==128)
{
disp_hz(0,0,fot+32,0x22,0);
disp_hz(6,2,fot+64,0x22,0);
disp_hz(14,4,fot+32,0x22,0);
disp_hz(30,6,fot+64,0x22,0);
}
if(LCDSIZE==256)
{
disp_hz(0,0,fot+32,0x22,0);
disp_hz(14,2,fot+64,0x22,0);
disp_hz(30,4,fot+32,0x22,0);
disp_hz(62,6,fot+64,0x22,0);
}
if(LCDSIZE==320)
{
disp_hz(0,0,fot+32,0x22,0);
disp_hz(2,0,fot+32,0x22,0);
disp_hz(4,0,fot+32,0x22,0);
disp_hz(6,0,fot+32,0x22,0);
disp_hz(8,0,fot+32,0x22,0);
disp_hz(10,0,fot+32,0x22,0);
disp_hz(12,0,fot+32,0x22,0);
disp_hz(14,0,fot+32,0x22,0);
disp_hz(16,0,fot+32,0x22,0);
disp_hz(18,0,fot+32,0x22,0);
disp_hz(20,0,fot+32,0x22,0);
disp_hz(22,0,fot+32,0x22,0);
disp_hz(24,0,fot+32,0x22,0);
disp_hz(26,0,fot+32,0x22,0);
disp_hz(28,0,fot+32,0x22,0);
disp_hz(30,0,fot+32,0x22,0);
disp_hz(32,0,fot+32,0x22,0);
disp_hz(34,0,fot+32,0x22,0);
disp_hz(36,0,fot+32,0x22,0);
disp_hz(38,0,fot+32,0x22,0);
disp_hz(0,2,fot+32,0x22,0);
disp_hz(38,28,fot+32,0x22,0);
}
if(LCDSIZE==512)
{
disp_hz(0,0,fot+32,0x22,0);
disp_hz(30,2,fot+64,0x22,0);
disp_hz(62,4,fot+32,0x22,0);
disp_hz(126,6,fot+64,0x22,0);
}
if(LCDSIZE==640)
{
disp_hz(0,0,fot+32,0x22,0);
// disp_hz(30,2,fot+64,0x22,0);
// disp_hz(62,4,fot+32,0x22,0);
disp_hz(78,6,fot+64,0x22,0);
// disp_hz(126,8,fot+32,0x22,0);
disp_hz(78,98,fot+32,0x22,0);
}
// disp_hz(0,0,fot,0x12,0);
// disp_hz(1,0,fot+16,0x12,1);
// disp_hz(0,2,fot+32,0x22,0);
// disp_hz(2,2,fot+64,0x22,1);
// Linexy(0x00,0x00,0xff,0xff);
// Linexy(0x00,0x00,0xff,0x7f,1);
// Linexy(0x00,0x00,0x7f,0xff,1);
// Linexy(0xff,0x00,0x00,0xff,1);
// Linexy(10*LCDSIZE/256,20,217*LCDSIZE/256,1);
// Linexy(10*LCDSIZE/256,20,239*LCDSIZE/256,110);
// Linexy(239*LCDSIZE/256,110,217*LCDSIZE/256,1);
// circle(185*LCDSIZE/256,45,40*LCDSIZE/256);
while(1);
}
///////////////////////////////////////////////////////////////////
// LCD显示模块 //
///////////////////////////////////////////////////////////////////
void circle(unsigned char Ox,unsigned char Oy,unsigned char Rx)
{
unsigned int xx,rr,xt,yt,rs,row,col;
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--;
row=Ox+xt; //第一象限
col=Oy-yt;
ag((row/8),col);
setb((7-(row%8)&7));
// point(row,col,s);
row=Ox-xt; //第二象限
ag((row/8),col);
setb((7-(row%8)&7));
// point(row,col,s);
col=Oy+yt; //第三象限
ag((row/8),col);
setb((7-(row%8)&7));
// point(row,col,s);
row=Ox+xt; //第四象限
ag((row/8),col);
setb((7-(row%8)&7));
// point(row,col,s);
/***************45度镜象画另一半***************/
row=Ox+yt; //第一象限
col=Oy-xt;
ag((row/8),col);
setb((7-(row%8)&7));
// point(row,col,s);
row=Ox-yt; //第二象限
ag((row/8),col);
setb((7-(row%8)&7));
// point(row,col,s);
col=Oy+xt; //第三象限
ag((row/8),col);
setb((7-(row%8)&7));
// point(row,col,s);
row=Ox+yt; //第四象限
ag((row/8),col);
setb((7-(row%8)&7));
// point(row,col,s);
}
}
void Linexy(unsigned char x0,unsigned char y0,unsigned char xt,unsigned char yt)
{
unsigned char t;
int delta_x,delta_y,incx,incy;
unsigned int uRow,uCol,distance,xerr=0,yerr=0;
delta_x = xt-x0; //计算坐标增量
delta_y = yt-y0;
if(delta_x>0) incx=1; //设置单步方向
else if( delta_x==0 ) incx=0;
else {incx=-1;delta_x=-delta_x;}
if(delta_y>0) incy=1;
else if( delta_y==0 ) incy=0;
else {incy=-1;delta_y=-delta_y;}
if( delta_x > delta_y ) distance=delta_x; //选取基本增量坐标轴
else distance=delta_y;
uRow = x0;uCol = y0;
for( t=0;t <= distance; t++ )
{
ag((uRow/8),uCol);
setb((7-(uRow%8)&7));
// point(uRow,uCol,s); //画点
xerr += delta_x ;
yerr += delta_y ;
if( xerr >= distance )
{
xerr-=distance;
uRow+=incx;
}
if( yerr >= distance )
{
yerr-=distance;
uCol+=incy;
}
if(t==0xff) break;
}
}
void disp_hz(unsigned int x,unsigned int y,unsigned char *str,unsigned char size,bit un)
{
unsigned char i,j;
for(i=0;i<(size&0x0f)*8;i++)
{
for (j=0;j<((size>>4)&0x0f);j++)
{
ag(x+j,y*8+i);
if(un==0) disp(*str++); else disp(0xff-*str++);
}
}
}
void lcd_init(void)
{
reset = 0;
delay(100);
reset = 1;
write(0x00);write(0x00);ctrl(0x40); /*文本首址*/
write(LCDSIZE/8);write(0x00);ctrl(0x41); /*文本区域*/
write(0x00);write(0x00);ctrl(0x42); /*图形首址*/
write(LCDSIZE/8);write(0x00);ctrl(0x43); /*图形区域*/
ctrl(0xa1); /*光标形状*/
ctrl(0x80); /*显示方式*/
ctrl(0x98); /*显示开关*/
}
void delay(unsigned int n)
{
unsigned char i;
while (n)
{
n--;
i=0xff;
while(i) i--;
};
}
///////////////////////////////////////////////////////////////////
// LCD基本操作函数 //
///////////////////////////////////////////////////////////////////
/* 设定图形位置x,y值 */
void ag(unsigned int x,unsigned int y)
{
unsigned int xy;
xy=y*(LCDSIZE/8)+x;
write(xy&0xff);write(xy/256);ctrl(0x24);
}
/* 写一个显示数据 */
void disp(unsigned char dat)
{
write(dat);
ctrl(0xc0);
}
/* 点亮一点 */
void setb(unsigned char d)
{
ctrl(0xf8|d);
}
/* 清除一点 */
void clrb(unsigned char d)
{
ctrl(0xf0|d);
}
/* 显示光标 */
void ab(unsigned char x,unsigned char y)
{
ctrl(0x97);
write(x);write(y);ctrl(0x21);
}
/* 取消光标 */
void noab(void)
{
ctrl(0x9c);
}
//======================================
/* 控制器读写忙标志 */
void p1(void)
{
while((busy()&3)!=3);
}
/* 读状态寄存器 */
unsigned char busy(void)
{
unsigned char dat;
cd=1;rd=1;wr=1;
P1=0xff;
rd=0;
dat=P1;
rd=1;
return(dat);
}
/* 控制指令 */
void ctrl(unsigned char dat)
{
p1();
cd=1;
wr=0;
P1=dat;
wr=1;
}
/* 写数据 */
void write(unsigned char dat)
{
p1();
cd=0;
wr=0;
P1=dat;
wr=1;
cd=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -