您的位置:首页单片机AVR单片机
内容搜索:
阅读内容
背景:#EDF0F5 #FAFBE6 #FFF2E2 #FDE6E0 #F3FFE1 #DAFAF3 #EAEAEF 默认  

AT90S8515与点阵液晶模块的C语言编程实例源程序

[日期:2008-05-08 ] [来源:网络 作者:佚名] [字体: (投递新闻)

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

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

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

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

void Rddata(void)
 {
 Locatexy();  /*坐标定位,返回时保留分区状态不变 */
  DDRA = 0; /*改变PA口的状态,作为输入口  */
  Datalcm=0xFF;
  lcd_set_di(); /*数据  */
  lcd_set_rw(); /*读数据 */
  lcd_set_e();
  NOP();  /*读入到LCM */
  cbyte = PINA; /*虚读一次 */
  lcd_clear_e();
 Locatexy();  /*坐标定位,返回时保留分区状态不变 */
  DDRA = 0;
  Datalcm=0xFF;
  lcd_set_di(); /*数据  */
  lcd_set_rw(); /*读数据 */
  lcd_set_e();
  NOP();  /*读入到LCM */
  cbyte = PINA; /*从数据口读数据,真读 */
  lcd_clear_e();NOP();
  DDRA = 0xFF; /*改变PA口的状态,作为输出口  */
 }

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

void Wrdata(Uchar X)
{
 Locatexy();  /*坐标定位,保留分区状态不变 */
 wtcom();
 lcd_set_di();  /*数据输出*/
 lcd_clear_rw();
 NOP();   /*写输出  */
 Datalcm = X;  /*数据输出到数据口 */
 lcd_set_e();  /*LCM读入*/
 NOP();
 lcd_clear_e();
}

/********************************/
/* 命令输出到左区控制口  */
/********************************/

void WrcmdL(Uchar X)
 {
  lcdbusyL();  /*确定分区,返回时保留分区状态不变*/
  lcd_clear_di();   /*命令操作 */
  lcd_clear_rw();NOP();  /*写输出 */
  Datalcm = X;   /*数据写到数据口 */
  lcd_set_e();NOP();lcd_clear_e(); /*LCM读入*/
 }

/********************************/
/* 命令输出到中区控制口  */
/********************************/

void WrcmdM(Uchar X)
 {
  lcdbusyM();  /*确定分区,保留分区状态不变*/
  lcd_clear_di();   /*命令操作 */
  lcd_clear_rw();NOP();  /*写输出 */
  Datalcm = X;   /*命令写到数据口*/
  lcd_set_e();NOP();lcd_clear_e(); /*LCM读入*/
 }

/********************************/
/* 命令输出到右区控制口  */
/********************************/

void WrcmdR(Uchar X)
 {
  lcdbusyR();  /*确定分区,保留分区状态不变 */
  lcd_clear_di();   /*命令操作  */
  lcd_clear_rw();NOP();  /*写输出  */
  Datalcm = X;   /*命令输出到数据口 */
  lcd_set_e();NOP();lcd_clear_e(); /*读入到LCM */
 }

/********************************************************/
/* 分区操作允许等待,返回时保留分区选择状态  */
/********************************************************/
void lcdbusyL(void)
 {
 lcd_clear_cs1(); /*CLR CS1  */
 lcd_set_cs2();  /*SETB CS2  */
 lcd_set_cs3();  /*SETB CS3  */
 wtcom();  /* waitting for enable */
 }

void lcdbusyM(void)
 {
 lcd_set_cs1();  /*SETB CS1  */
 lcd_clear_cs2(); /*CLR CS2  */
 lcd_set_cs3();  /*SETB CS3  */
 wtcom();  /* waitting for enable */
 }

void lcdbusyR(void)
 {
 lcd_set_cs1();  /*SETB CS1  */
 lcd_set_cs2();  /*SETB CS2  */
 lcd_clear_cs3(); /*CLR CS3  */
 wtcom();  /* waitting for enable */
 }

void wtcom(void)
 {
 DDRA = 0;
 lcd_clear_di();  /*CLR DI  */
 lcd_set_rw();  /*SETB RW  */
 Datalcm = 0xFF;  /*MOV DATA_LCM,#0FFH */
 lcd_set_e();NOP();
 while(lcd_read_status());
 lcd_clear_e();
 DDRA=0xFF;
 }

/********************************************************/
/*根据设定的坐标数据,定位LCM上的下一个操作单元位置 */
/********************************************************/
void Locatexy(void)
 {
 Uchar  x,y;
 switch (col&0xc0)  /*  col.and.0xC0 */
  {   /*条件分支执行  */
  case 0:  {lcdbusyL();break;} /*左区 */
  case 0x40: {lcdbusyM();break;} /*中区 */
  case 0x80: {lcdbusyR();break;} /*右区 */
  }
 x = col&0x3F|SETX;  /*  col.and.0x3f.or.setx */
 y = row&0x07|SETY;  /*  row.and.0x07.or.sety */
  wtcom();  /*  waitting for enable  */
  lcd_clear_di();   /*CLR DI */
  lcd_clear_rw();   /*CLR RW */
  NOP();
  Datalcm = y;   /*MOV P0,Y */
  lcd_set_e();NOP();lcd_clear_e();
  wtcom();   /*  waitting for enable */
  lcd_clear_di();   /*CLR DI */
  lcd_clear_rw();   /*CLR RW */
  NOP();
  Datalcm = x;   /*MOV P0,X */
  lcd_set_e();NOP();lcd_clear_e();
 }

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

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();  /*清屏  */
 }
/********************************/
/* 延时    */
/********************************/
void Delay(Uchar MS)
 {
 timer1=MS;
 while(timer1);
 }

/********************************/
//定义字符串数组  */
/********************************/

Uchar flash STR1[]=
  {
  0x80,0x81,0x82,0x83,0x84,0x85,
  0x86,0x87,0x88,0x89,0x8a,0x8B
  };
   
Uchar flash STR2[]="http://www.xiao-qi.com/ ";
Uchar flash STR3[]="Program by ICCAVR V6.23B";
Uchar flash STR4[]="Thank you @_@ 1234567890";

上一页1234下一页  GO
阅读:
录入:JETTA

推荐 】 【 打印
本文评论
      全部评论
发表评论


点评: 字数
姓名:
赞助商广告