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

📄 head_12864.h

📁 使用AVR单片机对OCM12864-4型LCD液晶进行控制,使用CodeVisionAVR编写,头文件包括各种操作的函数
💻 H
字号:
//#include "font.h"\

#define	LCD_WR 	(1 << 0)		// PA0----WR
#define	LCD_RD 	(1 << 1)	           	// PA1----RD
#define	LCD_CE 	(1 << 2)	          	// PA2----CE
#define	LCD_CD 	(1 << 3)	         	// PA3----CD
#define	LCD_RST 	(1 << 4)	          	// PA4----RST
#define	LCD_SDATA	(1 << 5)                     //PA5---SDATA
#define	LCD_CLK	(1 << 6)		//PA----CLK

#define 	LCD_PORT  PORTA                 //PA口连接到了5个控制脚,具体定义如上

#define	LCD_SET_RST()    (LCD_PORT |= LCD_RST)	// 位置位,输出1
#define	LCD_SET_CD()    (LCD_PORT |= LCD_CD)
#define	LCD_SET_CE()     (LCD_PORT |= LCD_CE)
#define	LCD_SET_RD()     (LCD_PORT |= LCD_RD)
#define	LCD_SET_WR()      (LCD_PORT |= LCD_WR)
#define	LCD_SET_SDATA()      (LCD_PORT |= LCD_SDATA)
#define	LCD_SET_CLK()      (LCD_PORT |= LCD_CLK)

#define	LCD_CLEAR_RST()  (LCD_PORT &= ~LCD_RST)			// 位清零,输出0
#define	LCD_CLEAR_CD()  (LCD_PORT &= ~LCD_CD)
#define	LCD_CLEAR_CE()   (LCD_PORT &= ~LCD_CE)
#define	LCD_CLEAR_RD()   (LCD_PORT &= ~LCD_RD)
#define	LCD_CLEAR_WR()    (LCD_PORT &= ~LCD_WR)
#define	LCD_CLEAR_SDATA()      (LCD_PORT &= ~LCD_SDATA)
#define	LCD_CLEAR_CLK()      (LCD_PORT &= ~LCD_CLK)


#define	LCD_DATA_OUT	 PORTC				//LCD数据输出口
#define	LCD_DATA_IN 	 PINC				//LCD数据输出口
#define	LCD_DDR 	     	DDRA				//LCD数据口方向
/* Define the register command code */
#define Disp_On  0x9f
#define Disp_Off 0x90
//#define Col_Add  0x40
//#define Page_Add 0xb8
#define Start_Line 0xc0
#define byte unsigned char
#define word_home_adder 0x00
#define pic_home_adder  0x80


void check(void);
void write_com(unsigned char cmdcode);
void write_data(unsigned char Dispdata);
void init_lcd(void);
unsigned char read_data(void);
//void DisplayWord(unsigned int Add,unsigned char xAdd,unsigned char yAdd,
//unsigned char SelscP,unsigned char num,unsigned char flag);
//void DisplayLine(unsigned int Add,unsigned char com,unsigned char line,unsigned char flag);
void ClearDisplay(void);
//void Test(unsigned int lcd_data);
//void Testlcd2(unsigned char lcd_datah,unsigned char lcd_datal);

void disp_picture(flash char * pic_adder);
void write_word(byte ww);
void disp_text(char flash * text_adder);
void goto_xy(char xx,char yy);
void goto_wh(void);
void goto_ph(void); 

/*--------------------CHECK-------------------------------*/
void check(void)
{
    LCD_SET_CD();
    LCD_CLEAR_RD();
    LCD_SET_WR();
    LCD_DDR=0x00;
    LCD_DDR=0x00;
    LCD_CLEAR_CE();
    LCD_SET_CE();
}


/*------------------写命令到LCD------------------------------*/
void write_com(unsigned char cmdcode)
{
//check();
byte i;
LCD_DDR=0xff;
LCD_SET_CD();
LCD_CLEAR_WR();
LCD_SET_RD();

//LCD_DATA_OUT=cmdcode;
for (i=0;i<8;i++)
{
  if (cmdcode & 0x01) LCD_SET_SDATA();
    else LCD_CLEAR_SDATA();
  LCD_SET_CLK();
  LCD_CLEAR_CLK();
  cmdcode=cmdcode>>1;
}  
LCD_CLEAR_CE();
LCD_SET_CE();
}

/*-------------------写数据到LCD----------------------------*/

void write_data(unsigned char Dispdata)
{
//check();
byte i;
LCD_DDR=0xff;
LCD_CLEAR_CD();
LCD_CLEAR_WR();
LCD_SET_RD();
LCD_DDR=0xff;

//LCD_DATA_OUT=Dispdata;
for (i=0;i<8;i++)
{
  if (Dispdata & 0x01) LCD_SET_SDATA();
    else LCD_CLEAR_SDATA();
  LCD_SET_CLK();
  LCD_CLEAR_CLK();
  Dispdata=Dispdata>>1;
}

LCD_CLEAR_CE();
LCD_SET_CE();
}

/*-------------------读LCD数据----------------------------*/

unsigned char read_data(void)
{
unsigned char tmpin;
LCD_DDR=0x00;
LCD_SET_WR();
LCD_CLEAR_RD();

LCD_CLEAR_CE();
tmpin=LCD_DATA_IN;
LCD_SET_CE();

return tmpin;}
/*------------------初始化LCD屏--------------------------*/
void init_lcd(void)
{
LCD_DDR=0xff;
LCD_CLEAR_RST();
LCD_SET_RST();

write_com(0X9f);       //9f启用图形字符,97关闭图形
write_com(0X80);       //逻辑或
write_com(0xa0);	//一行光标

write_data(word_home_adder);
write_data(0x00);
write_com(0X40);        //文本显示区首地址

write_data(0x10);
write_data(0x00);
write_com(0X41);        //文本显示区宽度、   

write_data(pic_home_adder);
write_data(0x00);
write_com(0X42);        //图形显示区首地址

write_data(0x10);
write_data(0x00);
write_com(0X43);        //图形显示区宽度

}

/*void DisplayWord(unsigned int Add,unsigned char xAdd,unsigned char yAdd,
unsigned char SelscP,unsigned char num,unsigned char flag)//Add:显示数据的起始地址
{ unsigned char i,m=0,dat;                                //xAdd,yAdd:显示位置
  switch (SelscP)
   {case 0:LCD_SET_CS1();
   		   LCD_SET_CS2();
		   break;
	case 1:LCD_SET_CS1();
   		   LCD_CLEAR_CS2();
		   break;
	case 2:LCD_CLEAR_CS1();
   		   LCD_SET_CS2();
		   break;	   	   
   }                                                       //SelscP:选择屏1,2,3
  write_com(xAdd++); //x首地址                          //mun显示宽度,一般为16
  write_com(yAdd); //y首地址							  //flag:是否清字位1不清
  while(m<num+2)
  { for(i=0;i<num;i++)
    { if(flag==0) dat=0;
	  else dat=font[Add+i+m];
	  write_data(dat);
	}
	write_com(xAdd++); 
	write_com(yAdd);
	m+=num;
   } 
}

void DisplayLine(unsigned int Add,unsigned char com,unsigned char line,unsigned char flag)
{ unsigned char i,p,l,r;  	  			   			     //Add:数据起始位置
  		   												 //com:空位置个数,4字为满
  r=com&0x0f;											 //line: 显示行位置
  l=4-com;												 //flag:是否清字符1不清
  for(i=0;i<r;i++)
    DisplayWord(Add+i*32,0xb8+(line%4)*2,0x40+(i+l)*16,(line/4)+1,16,flag);
}*/


void ClearDisplay(void)
{ unsigned char i,j;

goto_wh();
for(i=0;i<8;i++)
  { 
    for(j=0;j<16;j++)
      {
      write_data(0x00);
      write_com(0xc0);
       }
  }
goto_ph(); 
  for(i=0;i<64;i++)
  { 
    for(j=0;j<16;j++)
      {
      write_com(0xb0);
      write_data(0x00);
      write_com(0xb2);
       }
  } 
}

/*void Test(unsigned int lcd_data)
 {unsigned int K;
  write_com(0x01);
  write_com(0x40);
  for(K=0;K<148;K++)
  {write_data(lcd_data);
  }

 }
void Testlcd2(unsigned char lcd_datah,unsigned char lcd_datal)
{write_data(lcd_datal);
 delay_ms(1);
 write_data(lcd_datah);
}*/

void disp_picture(flash char * pic_adder)
{
  unsigned char i,j;
  goto_ph();
  for (i=0;i<64;i++)
   for (j=0;j<16;j++)
   {                 
   
     write_com(0xb0);
      write_data(*pic_adder);
      pic_adder++;
      write_com(0xb2);
   }
}

void disp_text(char flash * text_adder)
{
   while (*text_adder!=0){
    write_word(*text_adder);
    text_adder++;
   }
}                                      
   
    		
void write_word(byte ww)             //写字符,WW为ASCII码
{
   ww-=0x20;                         //ASCII转为内部ROM表
   write_data(ww);
   write_com(0xc0);
}


void goto_xy(char xx,char yy)
{
  write_data(xx+yy*16);
  write_data(0x00);
  write_com(0x24);
}
void goto_wh(void)
{
  write_data(word_home_adder);
   write_data(0x00); 
    write_com(0x24);
}
void goto_ph(void)
{
  write_data(pic_home_adder);
   write_data(0x00); 
    write_com(0x24);
}

⌨️ 快捷键说明

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