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

📄 lcd.c

📁 192*64_stn_ks108_液晶程序
💻 C
📖 第 1 页 / 共 2 页
字号:
                      Wrdata(*(a++));  
                      col++;  
				   }
        col=bakerx;
        row=bakery+5;  
        for(i=0;i<32;i++)
                   {
                      Wrdata(*(a++));  
                      col++;  
				   }
        col=bakerx;
        row=bakery+6;  
        for(i=0;i<32;i++)
                   {
                      Wrdata(*(a++));  
                      col++;  
				   }
        col=bakerx;
        row=bakery+7;  
        for(i=0;i<32;i++)
                   {
                      Wrdata(*(a++));  
                      col++;  
				   }
         row=bakery;
}

/************************第一屏32*32************************/
void Screen(unsigned char *a)
{
       unsigned char i,bakerx,bakery;
       
       bakerx=col;                               //暂存x,y坐标,已备下半个字符使用
       bakery=row;
       for(i=0;i<32;i++)
                   {    
                      Wrdata(*(a++));            //写输出一字节
                      col++;
                      }
        col=bakerx;                              //列对齐
        row=bakery+1;                  
        for(i=0;i<32;i++)
                   {
                      Wrdata(*(a++));  
                      col++;  
				   }
        col=bakerx;
        row=bakery+2;  
        for(i=0;i<32;i++)
                   {
                      Wrdata(*(a++));  
                      col++;  
				   }
        col=bakerx;
        row=bakery+3;  
        for(i=0;i<32;i++)
                   {
                      Wrdata(*(a++));  
                      col++;  
				   }
         row=bakery;
}


/**************全角字符点阵码数据输出**************************/
void Putcdot(unsigned char *a)
{
       unsigned char i,bakerx,bakery;
       bakerx=col;                               //暂存x,y坐标,已备下半个字符使用
       bakery=row;
       for(i=0;i<16;i++)
                   {    
                      Wrdata(*(a++));            //写输出一字节
                      col++;
                      if(col==LCMLIMIT)
                        {
                          col=0;
                          row++;
                          row++;                 //下一列,如果列越界换行
                        }
                      if(row>6)row=0;            //如果行越界,返回首行
                   }
        col=bakerx;                              //列对齐
        row=bakery+1;                            //指向下半个字符行
        for(i=0;i<16;i++)
                   {
                      Wrdata(*(a++));            //写输出一字节
                     
                      col++;
                      if(col==LCMLIMIT)
                        {
                          col=0;
                          row++;
                          row++;                 //下一列,如果列越界换行
                        }
                      if(row>7)row=1;            //如果行越界,返回首行
                   }
        row=bakery;                              //下半个字符输出结束
}

/**********************屏幕滚动定位****************************/
void Rollscreen(unsigned char x)
{
       cbyte = DISPFIRST|x;
       WrcmdL(cbyte);
       WrcmdM(cbyte);
       WrcmdR(cbyte);
}

/********************清屏(全屏幕)****************************/
void Lcmcls(void)
{
        for(row=0;row<8;row++)
            for(col=0;col<LCMLIMIT;col++)
        Wrdata(0x00);
}

/******************从液晶片上读数据,保留在全局变量中**********/
void Rddata(void)
{
        Locatexy();                              //坐标定位,返回时保留分区状态不变
                  Datalcm=0xff;
                  RS=1;
                  RW=1;
                  Elcm=1;
                  _nop_();
                  cbyte=Datalcm;                 //虚读一次
                  Elcm=0;
        Locatexy();
                  Datalcm=0xff;
                  _nop_();
                  RS=1;
                  RW=1;
                  Elcm=1;
                  _nop_();
                  cbyte=Datalcm;                 //真读
                  Elcm=0;

}

/********************数据写输出********************************/
void Wrdata(unsigned char X)
{
         Locatexy();
         Wtcom();
                RS=1;
                RW=0;
                Datalcm=X;                       //数据输出到数据口
                Elcm=1;                          //读入到LCM
                _nop_();
                Elcm=0;
}


/************************命令输出到左区控制口******************/
void WrcmdL(unsigned char X)
{
         LcdbusyL();
         RS=0;
         RW=0;
         Datalcm=X;
         Elcm=1;
         _nop_();
         Elcm=0;
}


/************************命令输出到中区控制口******************/
void WrcmdM(unsigned char X)
{
         LcdbusyM();
         RS=0;
         RW=0;
         Datalcm=X;
         Elcm=1;
         _nop_();
         Elcm=0;
}


/************************命令输出到右区控制口******************/
void WrcmdR(unsigned char X)
{
         LcdbusyR();
         RS=0;
         RW=0;
         Datalcm=X;
         Elcm=1;
         _nop_();
         Elcm=0;
}

/*****************分区操作允许等待,返回时保留分区选择状态*****/
void LcdbusyL(void)
{
         CSB=0;
         CSA=0;
         Wtcom();
}


void LcdbusyM(void)
{
         CSB=1;
         CSA=0;
         Wtcom();
}

void LcdbusyR(void)
{
         CSB=0;
         CSA=1;
         Wtcom();
}

void Wtcom(void)
{
         RS=0;
         RW=1;
         Datalcm=0xff;
         Elcm=1;
         _nop_();
         while(Datalcm&LCDBUSY);
         Elcm=0;

}

/****************************液晶屏初始化**********************/
void Lcminit(void)
{
         cbyte=DISPOFF;
         WrcmdL(cbyte);
         WrcmdM(cbyte);
         WrcmdR(cbyte);
         cbyte=DISPON;
         WrcmdL(cbyte);
         WrcmdM(cbyte);
         WrcmdR(cbyte);
         cbyte=DISPFIRST;
         WrcmdL(cbyte);
         WrcmdM(cbyte);
         WrcmdR(cbyte);
         Lcmcls();                               //全屏幕清屏
         col=0;
         row=0;
         Locatexy();
}

/***************************延时(12分频)*********************/
void Delay(unsigned char ms)
{
          unsigned char a,b;
          while(ms!=0)
               {
                   b=4;
                      while(b!=0)
                                {
                                    a=0xf0;
                                    while(a!=0)
                                    {
                                       a--;
                                    };
                                    b--;
                                }
                      ms--;
               }
}

/**********根据设定的坐标数据,定位LCM上的下一个操作单元*******/
void Locatexy(void)
{
           unsigned char x,y;
           switch(col&0xc0)
                 {
                  case 0:
                       {
                         LcdbusyL();
                         break;
                       }
                  case 0x40:
                       {
                         LcdbusyM();
                         break;
                       }
                  case 0x80:
                       {
                         LcdbusyR();
                         break;
                       }
                 }
           x=col&0x3f|SETX;
           y=row&0x07|SETY;
                 Wtcom();
                 RS=0;
                 RW=0;
                 Datalcm=y;
                 Elcm=1;
                 _nop_();
                 Elcm=0;

                 Wtcom();
                 RS=0;
                 RW=0;
                 Datalcm=x;
                 Elcm=1;
                 _nop_();
                 Elcm=0;
}

⌨️ 快捷键说明

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