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

📄 lcd.c

📁 Atmega128 学习板的详细制作资料
💻 C
字号:
/**********************************************************************
-----------4脚   rs = PC.0;  
-----------5脚   rw = PC.1;  
-----------6脚   e = PC.2; 
-----------数据口为 P0口
-----------1脚 VSS - GND(0V) 
-----------2脚 VDD - Supply Voltage For Logic (+5V)
-----------15脚 PSB  接高电平5V
-----------17脚 /RST 接高电平5V
-----------19脚 LEDA - 背光源正极(+5V)  //或通过华东变阻器分压  取3.0V时,亮度适中
-----------20脚 LEDK - 背光源负极(OV)
*****************************************************************************
汉字字符显示坐标(OCMJ4X8C、OCMJ4X8C_3、OCMJ4X8C_6)
				X 坐标
Line1 80H 81H 82H 83H 84H 85H 86H 87H
Line2 90H 91H 92H 93H 94H 95H 96H 97H
Line3 88H 89H 8AH 8BH 8CH 8DH 8EH 8FH
Line4 98H 99H 9AH 9BH 9CH 9DH 9EH 9FH

*************************************************************************/ 
#define uint  unsigned int
#define uchar unsigned char
#define x1    0x80
#define x2    0x88
#define y     0x80
#define comm  0
#define dat   1
#define Data   PORTA

#define	rs 4
#define	rw 5
#define	 e 6

#define	rs_H 		   PORTD|=  BIT(rs)
#define	rs_L		   PORTD&= ~BIT(rs)
#define	rw_H 		   PORTD|=  BIT(rw)
#define	rw_L 		   PORTD&= ~BIT(rw)
#define	 e_H 		   PORTD|=  BIT(e)
#define	 e_L 		   PORTD&= ~BIT(e)

/********************************应用程序**********************************/
void init_lcd (void);                       //LCD初始化
void chn_disp (uchar  *chn);                //显示汉字或字符
void disp_one_word (uchar addr,uchar  *chn);//显示一个汉字
void disp_two_char (uchar addr,uchar Data1,uchar Data2);//显示两个字符
void disp_one_char (uchar addr,uchar Data1);//显示一个字符
void lat_disp (uchar data1,uchar data2);    //显示点阵
void con_disp (uchar data1,uchar data2,uchar x0,uchar y0,uchar xl,uchar yl);//反白
void clrram (void);                         //清DDRAM
void wr_lcd (uchar dat_comm,uchar content); //向LCD写命令或数据
void delay1us (uint us);                       //微秒级延时
void delay1ms (uint ms);                    //毫秒级延时
/*************************************************************************/

uchar tab[10]={'0','1','2','3','4','5','6','7','8','9'};
uchar  tab1[200]={	//地址,参看此C文件开头的地址表
"  中国矿业大学  "	//80H~87H
"                "	//88H~8FH
"    信电学院    "	//90H~97H
"  2007年07月13日"	//98H~9FH
};

uchar  tab2[]={	//地址,参看此C文件开头的地址表
"杂散电流测试仪  "	//80H~87H
"                "	//88H~8FH
"                "	//90H~97H
"                "	//98H~9FH
};
uchar SetTimeTab[]={	//地址,参看此C文件开头的地址表
"    调整时间    "	//80H~87H
"                "	//88H~8FH
"                "	//90H~97H
"                "	//98H~9FH
};
/******************LCD初始化************************/
void init_lcd (void)
{
  //rst=1;  //硬件中 已经直接接+5V   
  //psb=1;
  wr_lcd (comm,0x30);  /*30---基本指令动作*/   
  wr_lcd (comm,0x01);  /*清屏,地址指针指向00H*/
  wr_lcd (comm,0x06);  /*光标的移动方向*/
  wr_lcd (comm,0x0c);  /*开显示,关游标*/
}
/****************************************************/
/*****************显示汉字或字符*********************/
void chn_disp (uchar  *chn)
{
  uchar i,j;
  wr_lcd (comm,0x30);
  wr_lcd (comm,0x80);
  for (j=0;j<4;j++)				//第一行到第四行 显示 
  {
    for (i=0;i<16;i++)
    wr_lcd (dat,chn[j*16+i]);
  }
}
/****************************************************/
/*******************显示一个汉字*********************/
void disp_one_word (uchar addr,uchar  *chn)//
{
  uchar i;
  wr_lcd (comm,0x30);
  wr_lcd (comm,addr);

    for (i=0;i<2;i++)
    wr_lcd (dat,chn[i]);
}
/****************************************************/
/*******************显示两个字符*********************/
void disp_two_char (uchar addr,uchar Data1,uchar Data2)
{
  wr_lcd (comm,0x30);
  //wr_lcd (comm,0x80);
  wr_lcd (comm,addr);	//在addr地址里写字符 
  wr_lcd (dat,Data1);	//写第一个字符
  wr_lcd (dat,Data2);	//写第二个字符
}
/****************************************************/
/*******************显示一个字符*********************/
void disp_one_char (uchar addr,uchar Data1)
{
  wr_lcd (comm,0x30);
  wr_lcd (comm,addr);	//在addr地址里写字符 
  wr_lcd (dat,Data1);	//写第一个字符
}
/****************************************************/
/*********************显示点阵***********************/
void lat_disp (uchar data1,uchar data2)
{
  uchar i,j,k,x;
  x=x1;
  for(k=0;k<2;k++)
  {
    for(j=0;j<16;j++)
    {
      for(i=0;i<8;i++)
      {
        wr_lcd (comm,0x34);
        wr_lcd (comm,y+j*2);
        wr_lcd (comm,x+i);
        wr_lcd (comm,0x30);
        wr_lcd (dat,data1);
        wr_lcd (dat,data1);
      }
      for(i=0;i<8;i++)
      {
        wr_lcd (comm,0x34);
        wr_lcd (comm,y+j*2+1);
        wr_lcd (comm,x+i);
        wr_lcd (comm,0x30);
        wr_lcd (dat,data2);
        wr_lcd (dat,data2);
      }
    }
    x=x2;
  }
  wr_lcd (comm,0x36);
}
/****************************************************/
/*********************反白显示***********************/
//当data1=0xff,data2=0xff时,在x0,y0处反白显示16 xl * yl
void con_disp (uchar data1,uchar data2,uchar x0,uchar y0,uchar xl,uchar yl)
{
  uchar i,j;
  for(j=0;j<yl;j++)
  {
    for(i=0;i<xl;i++)
    {
      wr_lcd (comm,0x34);
      wr_lcd (comm,y0+j);
      wr_lcd (comm,x0+i);
      wr_lcd (comm,0x30);
      wr_lcd (dat,data1);
      wr_lcd (dat,data2);
    }
  }
  wr_lcd (comm,0x36);
}
/****************************************************/
/**********************清DDRAM***********************/
void clrram (void)
{
  wr_lcd (comm,0x30);
  wr_lcd (comm,0x01);
}
/****************************************************/
/****************向LCD写入命令或数据*****************/
void wr_lcd (uchar dat_comm,uchar content)
{
  //chk_busy ();
  delay1us(100);
  if(dat_comm)
   {
	rs_H;
	rw_L;
   }
  else 
   {
	rs_L;
	rw_L;
   }
  Data=content;   //output data or comm
  
  e_H;
  asm("nop");
  asm("nop");
  asm("nop");
  e_L;
}
/****************************************************/
/*********************延时1uS************************/
void delay1us (uint us)   //delay time
{
  while(us--);
}
/****************************************************/
/*********************延时1mS************************/
void delay1ms(uint ms)
{
	uint i; 
	for (; ms>0; ms--)
		for (i=0; i<1500; i++)
			;						 
}
/****************************************************/

⌨️ 快捷键说明

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