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

📄 smg12864l_m_exsample_c51.c

📁 KS0108B图形点阵液晶显示模块系列
💻 C
📖 第 1 页 / 共 2 页
字号:
//子程序名称:unsigned char code *getenglishcodepos(unsigned char ac).
//功能:根据当前ASCII字符码查表后计算得到当前ASCII字符码的字库点阵位置.
//修改日期:2009.8.18
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
unsigned char code *getenglishcodepos(unsigned char ac)
{   unsigned char min,max,mid,midc;
    min=0;
    max=ENGLISHCHARNUMBER-1;
    while(1)
    {   if(max-min<2)
        {   if(EnglishCode[min]==ac)
                mid=min;
            else if(EnglishCode[max]==ac)
                mid=max;
            else
                mid=0;
            break;
        }
        mid=(max+min)/2;
        midc=EnglishCode[mid];
        if(midc==ac)
            break;
        else if(midc>ac)
            max=mid-1;
        else
            min=mid+1;
    }
    return EnglishCharDot+mid*ENGLISHCHARDOTSIZE;
}
//-------------------------------------------------------------------------------
//以下putsizeimage为图形对象的基本子程序,putimage为图形对象的扩充子程序
//-------------------------------------------------------------------------------
//子程序名称:void putsizeimage(unsigned char XSIZE,unsigned YSIZE,
//                             unsigned char code *s)
//功能:在(XPOS,YPOS)位置绘制XSIZE列及YISZE行点阵的图形*S.
//修改日期:2009.8.31
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
void putsizeimage(unsigned char XSIZE,unsigned char YSIZE,unsigned char code *s)
{  unsigned char k,lx,ly,a1,a2,y,Lcd_Mask;
   k=YPOS&0x7;
   YSIZE+=k;
   y=YPOS;
   s--;
   for(lx=0;lx<XSIZE;lx++,XPOS++)
   {  for(YPOS=y,ly=k;ly<YSIZE;)
      {  unsigned char p;
         a1=*s;
         s++;
         a2=*s;
         if(CharImageReverse)
         {   a1=~a1;
             a2=~a2;
         }
         for(p=0;p<k;p++)
         {  a2>>=1;
            if((a1&0x1)==1)
               a2+=0x80;
            a1>>=1;
         }
         if((k==0) && (YSIZE<ly+8))
         {   lcdpos();
             ly+=8;
             YPOS+=8;
         }
         else
         {   lcdpos();
             a1=lcdrd();
             lcdpos();
             ly+=8;
             YPOS+=8;
             Lcd_Mask=0xff;
             p=YSIZE&0x7;
             while(p>0)
             {   Lcd_Mask>>=1;
                 YPOS--;
                 p--;
             }
             p=0xff;
             while(YSIZE<ly)
             {   ly--;
                 YPOS--;
                 p<<=1;
             }
             Lcd_Mask&=p;
             a2&=Lcd_Mask;
             a2|=a1&(~Lcd_Mask);
         }
         lcdwd(a2);
      }
      if((k!=0) && (YSIZE&0x7 != 0) && (k >= YSIZE&0x7)) s--;
   }
   YPOS=y;
}
//-------------------------------------------------------------------------------
//子程序名称:void putimage(unsigned char code *s).
//功能:在(XPOS,YPOS)位置绘制XSIZE[*s]列及YISZE[*(s+1)]行点阵的图形[*(s+2)].
//修改日期:2009.8.18
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
void putimage(unsigned char code *s)    //显示图形子程序
{   unsigned char XSIZE,YSIZE;
    XSIZE=*s;
    s++;
    YSIZE=*s;
    s++;
    putsizeimage(XSIZE,YSIZE,s);
}
//-------------------------------------------------------------------------------
//以下point为绘图操作的基本子程序,line,lineto,rect为绘图操作的扩充子程序.
//-------------------------------------------------------------------------------
//子程序名称:void point(bit b).
//功能:按b的数据在(XPOS,YPOS)位置绘制点.
//修改日期:2009.8.18
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
void point(bit b)
{   unsigned char i,Lcd_Mask,j;
    Lcd_Mask=0x01;
    i=YPOS&0x7;
    while(i>0)
    {   Lcd_Mask<<=1;
        i--;
    }
    lcdpos();
    j=lcdrd();
    lcdpos();
    if(b)
        lcdwd(j|Lcd_Mask);
    else
        lcdwd(j&(~Lcd_Mask));
}
//-------------------------------------------------------------------------------
//子程序名称:void line(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,bit b)
//功能:按b的数据绘制(x0,y0)-(x1,y1)的直线
//修改日期:2009.8.18
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
void line(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,bit b)
{   unsigned char dx,dy;
    unsigned int dk;
    XPOS=x0;
    YPOS=y0;
    point(b);
    dx=(x1>=x0)?x1-x0:x0-x1;
    dy=(y1>=y0)?y1-y0:y0-y1;
    if(dx==dy)
    {   while(XPOS!=x1)
        {   if(x1>x0) XPOS++;else XPOS--;
            if(y1>y0) YPOS++;else YPOS--;
            point(b);
        }
    }
    else if (dx>dy)
    {   dk=dy;
        dy=0;
        while(XPOS!=x1)
        {   if(x1>x0) XPOS++;else XPOS--;
            dy++;
            if(y1>y0) YPOS=y0+(dk*dy+dx/2)/dx;else YPOS=y0-(dk*dy+dx/2)/dx;
            point(b);
        }
    }
    else
    {   dk=dx;
        dx=0;
        while(YPOS!=y1)
        {   if(y1>y0) YPOS++;else YPOS--;
            dx++;
            if(x1>x0) XPOS=x0+(dk*dx+dy/2)/dy;else XPOS=x0-(dk*dx+dy/2)/dy;
            point(b);
        }
    }
}
//-------------------------------------------------------------------------------
//子程序名称:void lineto(unsigned char x1,unsigned char y1,bit b)
//功能:按b的数据绘制(XPOS,YPOS)-(x1,y1)的直线
//修改日期:2009.8.18
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
void lineto(unsigned char x1,unsigned char y1,bit b)//绘制(XPOS,YPOS)-(X1,Y1)的直线
{   line(XPOS,YPOS,x1,y1,b);
}
//-------------------------------------------------------------------------------
//子程序名称:void rect(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,bit b)
//功能:按b的数据绘制(x0,y0)-(x1,y1)的矩形
//修改日期:2009.8.18
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
void rect(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,bit b)
{   line(x0,y0,x1,y0,b);
    line(x1,y0,x1,y1,b);
    line(x1,y1,x0,y1,b);
    line(x0,y1,x0,y0,b);
}
//-------------------------------------------------------------------------------
//以下lcdfill,lcdpos,lcdreset,setlcdvoltage为NT7532型硬件接口的12864液晶显示模块
//的基本子程序
//-------------------------------------------------------------------------------
//子程序名称:void lcdfill(unsigned char d).
//功能:整屏显示d表示的字节数据.
//修改日期:2009.08.31
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
void lcdfill(unsigned char d)           //整屏显示d代表的字节数据子程序
{   unsigned char j;
    XPOS=0;
    YPOS=0;
    for(YPOS=0;YPOS<64;YPOS+=8)         //8页
    {   lcdpos();
        for(j=0;j<128;j++)              //128列
            lcdwd(d);                   //送图形数据
    }
    YPOS=0;
}
//-------------------------------------------------------------------------------
//子程序名称:void lcdpos(void).
//功能:设置坐标点(XPOS,YPOS)位置对应的内部RAM地址.
//修改日期:2009.08.31
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
void lcdpos(void)                       //设置坐标点(XPOS,YPOS)内部RAM地址的子程序
{  unsigned char Column;
   Column=XPOS+4;
   lcdwc(0xB0|((YPOS/8)&0x7));          //页地址设置
   lcdwc(0x10|(Column>>4));             //列的高四位设置
   lcdwc(Column&0x0F);                  //列的低四位设置
}
//-------------------------------------------------------------------------------
//子程序名称:void lcdreset(void)
//功能:液晶显示控制器初始化
//修改日期:2009.08.31
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
void lcdreset(void)                     //液晶显示控制器初始化子程序
{   lcdwc(0xA2);                        //设置LCD bias
    lcdwc(0xA1);                        //设置ADC select
    lcdwc(0xC0);                        //设置COM反向
    lcdwc(0x2F);                        //设置电源控制模式
    lcdwc(0x40);                        //设置显示初始行
    lcdwc(0xAF);                        //开显示
}
//-------------------------------------------------------------------------------
//子程序名称:void setlcdvoltage(unsigned char vol)
//功能:设置LCD电压用来调节显示的对比度
//修改日期:2009.08.31
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
void setlcdvoltage(unsigned char vol)   //LCD电压设置
{   lcdwc(0x81);
    lcdwc(vol&0x3F);                    //范围为0-63,上电默认值为32
}
//-------------------------------------------------------------------------------
//以下lcdwc,lcdwd,lcdrd为MCS51模拟口线接口的NT7532液晶显示控制器的基本子程序,
//lcdwaitidle为内部子程序.
//-------------------------------------------------------------------------------
//子程序名称:void lcdwd(unsigned char d).
//功能:向液晶显示控制器写图形数据.
//修改日期:2009.08.31
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
void lcdwd(unsigned char d)
{  lcdwaitidle();
   P1=d;
   A0PIN=1;
   CSPIN=0;
   WRPIN=0;
   _nop_();
   WRPIN=1;
   CSPIN=1;
}
//-------------------------------------------------------------------------------
//子程序名称:unsigned char lcdrd(void).
//功能:从液晶显示控制器中读图形数据.
//修改日期:2009.08.31
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
unsigned char lcdrd(void)               //读图形数据子程序
{   unsigned char d;
    lcdwaitidle();                      //检测液晶显示控制器是否空闲
    P1=0xff;
    A0PIN=1;
    CSPIN=0;
    RDPIN=0;
    _nop_();
    d=P1;
    RDPIN=1;
    CSPIN=1;

    CSPIN=1;                            //DUMMY READ
    CSPIN=0;
    RDPIN=0;
    _nop_();
    d=P1;
    RDPIN=1;
    CSPIN=1;
    return d;
}
//-------------------------------------------------------------------------------
//子程序名称:lcdwc(unsigned char c).
//功能:向液晶显示控制器送指令.
//修改日期:2009.08.31
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
void lcdwc(unsigned char c)
{  lcdwaitidle();
   P1=c;
   A0PIN=0;
   CSPIN=0;
   WRPIN=0;
   _nop_();
   WRPIN=1;
   CSPIN=1;
}
//-------------------------------------------------------------------------------
//子程序名称:voidlcdwaitidle(void).
//功能:忙检测,在对液晶显示控制器操作的每一条指令之前,需检测液晶显示器是否空闲.
//修改日期:2009.08.31
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
void lcdwaitidle(void)                  //忙检测子程序
{   unsigned char i;
    P1=0xff;
    A0PIN=0;
    CSPIN=0;
    RDPIN=0;
    for(i=0;i<20;i++)                   //
        if( (P1&0x80) != 0x80 ) break;  //D7=0 空闲退出
    RDPIN=1;
    CSPIN=1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -