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

📄 12864bing.h

📁 lcd12864的驱动程序 可以显示数字,字母,汉字,图片等内容.
💻 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 + -