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

📄 avrmega8_ssd1815c.c

📁 这是一个采用avr单片机操作显示sst1815液晶模块的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/*画线。任意方向的斜线,不支持垂直的或水平线 */
/************************************************/

void Linexy(Uchar endx,Uchar endy)
{
 register Uchar t;
 int xerr=0,yerr=0,delta_x,delta_y,distance;
 Uchar incx,incy;

/*  compute the distance in both directions */
 delta_x=endx-col;
 delta_y=endy-row;

/* compute  the direction of the increment ,
 an increment of "0" means either a vertical or horizontal lines */

 if(delta_x>0) incx=1;
 else if( delta_x==0 ) incx=0;
  else incx=-1;


 if(delta_y>0) incy=1;
 else if( delta_y==0 ) incy=0;
  else incy=-1;

/*  determine which distance is greater */

 //求绝对值
 if(delta_x<0)delta_x=-delta_x;
 if(delta_y<0)delta_y=-delta_y; 
 
 if( delta_x > delta_y ) distance=delta_x;
 else distance=delta_y;

/* draw the line */
 for( t=0;t <= distance+1; t++ ) {
  point();
    xerr += delta_x ;
  yerr += delta_y ;
  if( xerr > distance ) {
   xerr-=distance;
      col+=incx;
  }
  if( yerr > distance ) {
   yerr-=distance;
      row+=incy;
  }

 }
}

/****************************************/
/*画线。只提供X或Y方向的,不支持斜线 */
/****************************************/
void Linehv(Uchar length)
 {
  Uchar xs,ys;
  if (xy)
   {ys = col;   //横线
    for (xs=0;xs<length;xs++)
   
    {
     col = ys + xs;
     point();
    }
   }
  else
   {
     xs = row;    //竖线
     for (ys=0;ys<length;ys++)
	 {
      row = xs + ys;
      point();}
      }
}

/****************************************/
/* 画点    */
/****************************************/

void point(void)
 {
  Uchar x1,y1,x,y;
  x1=col;
  y1=row;
  row=y1;  /*取Y方向分页地址 */
  Rddata();
  y=y1&0x07;  /*字节内位置计算 */
  x=0x01;
  x=x<<y;   /*移入所画点  */
  Wrdata(cbyte|x); /*画上屏幕  */
  col=x1;   /*恢复xy坐标  */
  row=y1;
 }

/****************************************/
/* 屏幕滚动定位   */
/****************************************/
void Rollscreen(Uchar x)
 {
  cbyte = DISPFIRST|x; /*定义显示起始行为x?*/
  Wrcmd(cbyte);
  }

/****************************************/
/* 一个字串的输出   */
/****************************************/
void Putstr(Uchar *puts,Uchar i)
 {
  Uchar j,X;
  for (j=0;j<i;j++)
  {
  X = puts[j];
   if (X&0x80)
    {
     Putcdot(X&0x7f); /*只保留低7位*/
    }
   else Putedot(X-0x20);  /*ascii码表从0x20开始*/
  }
 }

/****************************************/
/*   半角字符点阵码数据输出  */
/****************************************/
void Putedot(Uchar Order)
 {
 Uchar i,bakerx,bakery; /*共定义4个局部变量   */
 int x;   /*偏移量,字符量少的可以定义为UCHAR */
 bakerx = col;  /*暂存x,y坐标,已备下半个字符使用 */
 bakery = row;
 x=Order * 0x10;  /*半角字符,每个字符16字节 */
/*上半个字符输出,8列 */
 for(i=0;i<8;i++)
  {
  cbyte = Ezk[x];    /*取点阵码,rom数组 */
  Wrdata(cbyte);    /*写输出一字节  */
  x++;
  col++;
  if (col==LCMLIMIT){col=0;row+=18;}; /*下一列,如果列越界换行*/
   if (row>7*8) row=0;  /*如果行越界,返回首行 */
  }     /*上半个字符输出结束 */

 col = bakerx;     /*列对齐  */
 row = bakery+8;     /*指向下半个字符行 */
/*下半个字符输出,8列 */
 for(i=0;i<8;i++)
  {
  cbyte = Ezk[x];    /*取点阵码  */
  Wrdata(cbyte);    /*写输出一字节  */
  x++;
  col++;
  if (col==LCMLIMIT){col=0;row=row+16;}; /*下一列,如果列越界换行*/
   if (row>7*8) row=8;  /*如果行越界,返回首行 */
  }     /*下半个字符输出结束 */
 row=bakery;
 }      /*整个字符输出结束 */


/****************************************/
/*  全角字符点阵码数据输出  */
/****************************************/
void Putcdot(Uchar Order)
 {
 Uchar i,bakerx,bakery;  /*共定义3个局部变量  */
 int x;    /*偏移量,字符量少的可以定义为UCHAR */
 bakerx = col;   /*暂存x,y坐标,已备下半个字符使用 */
 bakery = row;
 x=Order * 0x20;   /*每个字符32字节 */
 
/*上半个字符输出,16列 */
 for(i=0;i<16;i++)
  {
  Wrdata(Hzk[x]);    /*写输出一字节  */
  x++;
  col++;
  if (col==LCMLIMIT){ col=0;row+=16;} /*下一列,如果列越界换行*/
   if (row>6*8) row=0;  /*如果行越界,返回首行 */
  }     /*上半个字符输出结束 */
  
/*下半个字符输出,16列 */
 col = bakerx;
 row = bakery+8;
 for(i=0;i<16;i++)    /*下半部分*/
  {
  Wrdata(Hzk[x]);
  x++;
  col++;
  if (col==LCMLIMIT){col=0;row+=16;} /*下一列,如果列越界换行*/
   if (row>7*8) row=8;  /*如果行越界,返回首行 */
  }     /*下半个字符输出结束 */
 row = bakery;
 }      /*整个字符输出结束 */

/****************************************/
/* 清屏,全屏幕清零  */
/****************************************/
void Lcmcls( void )
 {
 for(row=0;row<64;row+=8)
   { //col=20;
    // Locatexy();  /*坐标定位 */
     for(col=20;col<132;col++) 
	 {  
	 //    Locatexy();  /*坐标定位 */
    	 Wrdata(0x00);
 	   //  TestPin();
		
	 }
    }	 
	 
 }

/****************************************/
/*  从液晶片上读数据,保留在全局变量中 */
/****************************************/

void Rddata(void)
 {
  Locatexy();  /*坐标定位,返回时保留分区状态不变 */

  DDRB=0x00;    
  DilcmON; /*数据*/
  
  WrlcmON; /*读数据*/
  RDlcmOFF; /*读入到LCM*/
  
  CS1lcmOFF;//选中芯片
  
  //DelayLCM();

  cbyte = PINB; /*虚读一次 */

  RDlcmON;
  //Locatexy();  /*坐标定位,返回时保留分区状态不变 */
  //DelayLCM();
  DilcmON; /*数据*/
  WrlcmON; /*读数据*/
  RDlcmOFF; /*读入到单片机*/
  //DelayLCM();
  
  DDRB=0x00;
  cbyte = PINB; /*从数据口读数据,真读 */
  RDlcmON;  
  CS1lcmON;
 }

/****************************************/
/* 数据写输出   */
/****************************************/

void Wrdata(Uchar X)
 {
  RDlcmON;
  Locatexy();  /*坐标定位,返回时保留分区状态不变 */
  lcdbusy();
  
  DDRB=0xff;
  DilcmON; /*数据输出*/
  WrlcmOFF; /*写输出  */
  CS1lcmOFF; //片选
  
  
  Datalcm = X; /*数据输出到数据口 */
    
  WrlcmON;  /*读入到LCM*/
  CS1lcmON; //片选
  RDlcmON;
 }


/********************************/
/* 命令输出到液晶控制口  */
/********************************/

void Wrcmd(Uchar X)
 {
  lcdbusy();  /*确定分区,返回时保留分区状态不变*/
  
  DDRB=0xFF; 
  DilcmOFF;   /*命令操作 */

  RDlcmON;
  WrlcmOFF;   /*写输出   */
  CS1lcmOFF;
      
  Datalcm = X;   /*数据输出到数据口 */
  WrlcmON;
  CS1lcmON;
  DilcmON;     //写到LCM中
  //RDlcmON;DelayLCM();RDlcmON; /*读入到LCM*/
 }


/********************************************************/
/* 分区操作允许等待,返回时保留分区选择状态  */
/********************************************************/
void lcdbusy(void)
 {
       //return;//debug 
        DilcmOFF;  /*CLR DI  */
 		WrlcmON;  /*SETB RW  */
        RDlcmOFF;
   	 	CS1lcmOFF; // CS1LCM = 0;  /*CLR CS1  */
				
        DDRB=0x00;
 		
		// 
        while(PINB & Lcdbusy);
    
		CS1lcmON;		
		RDlcmON;
		WrlcmON;
		DilcmON;   
 }


/********************************************************/
/*根据设定的坐标数据,定位LCM上的下一个操作单元位置 */
/********************************************************/
void Locatexy(void)
 {
  cbyte=((row&0x3F) >>3)  |SETP;
  Wrcmd(cbyte);//设置页地址
  
  cbyte=col&0x0f |SETCL;
  Wrcmd(cbyte);        //设置列地址 低
  cbyte=((col&0xF0)>>4)|SETCH;
  Wrcmd(cbyte);  //设置列地址 高
 
 }

/********************************/
/*液晶屏初始化   */
/********************************/

void Lcminit(void)
 {
  int i;
  DilcmOFF;//LCD的D/C脚在一开始的时候应该设为0
  
 
  cbyte = 0xA0; /*段重排*/
  Wrcmd(cbyte);
  
  cbyte = 0xC0; /*设置输出扫描方向*/
  Wrcmd(cbyte);
  
  cbyte = 0xA2; /*设置偏压1/9*/
  Wrcmd(cbyte);  
      
 // cbyte = 0xA7; /*设置反显*/
 // Wrcmd(cbyte);  
  

  cbyte = 0x2F; /*设置电源控制寄存器 内部负压生成,内部调理模块,内部输出缓冲*/
  Wrcmd(cbyte);
   
  cbyte = 0x27; /*设置内部电阻调整比*/
  Wrcmd(cbyte);
  
  cbyte = 0x81; /*设置对比度*/
  Wrcmd(cbyte); 
  cbyte = 0xff; /*对比度选择*/
  Wrcmd(cbyte);
    
   
  cbyte = 0xAF;  /*打开显示屏 */
  Wrcmd(cbyte);
 
    
  cbyte = DISPFIRST; /*定义显示起始行为零 */
  Wrcmd(cbyte);
  
  Wrcmd(0xE0);  //进入读改写模式
//  Wrcmd(0xEE);  
  
  Lcmcls();
   
  col=20;  /*清屏  */
  row=0;
  Locatexy();
 }

 
 
void DelayLCM(void)      /*液晶指令延时*/
{
  Uchar i;
  for(i=0;i<2;i++);
} 

/********************************/
/* 延时 */
/********************************/
void Delay(Uchar MS)
{
Uchar us,usn;
while(MS!=0)
{ usn = 4;
while(usn!=0)
{
us=0xf0;
while (us!=0){us--;};
usn--;
}
MS--;
}
}

⌨️ 快捷键说明

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