⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd320240.c

📁 一个proteus的lcd320*240库文件
💻 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 + -