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

📄 lcd.h

📁 AVR(ATmega16)的LCD_KS0108控制器的驱动程序。
💻 H
字号:
/*-----------------------------------------------------
 显示开/关:    0x3E:Off,0x3F:On
 设置列(y)地址: 0x40+y,y:0-63
 设置页(x)地址: 0xB8+x,x:0-7
 设置起始行:    0xC0+l,l:0-63
 写显示数据:    0x**
  DI  R/W    Function
  0    0      写指令
  1    0      写数据
 引脚连接:
   CS1:PA0
   CS2:PA1
   DI: PA2
   RW: PA3
   E:  PA4
   DB0-DB7:PB0-PB7
 ------------------------------------------------------*/
 
 #define uchar unsigned char
 #define uint  unsigned int 
 
 #define L  0x10
 #define R  0x20
 #define LR 0x30
 
 #define CS1_PORT PORTA
 #define CS2_PORT PORTA
 #define DI_PORT  PORTA
 #define RW_PORT  PORTA
 #define E_PORT  PORTA
 
 #define CS1_DDR DDRA
 #define CS2_DDR DDRA
 #define RW_DDR  DDRA
 #define E_DDR  DDRA
 #define DI_DDR  DDRA
 
 #define DATA_PORT PORTB
 #define DATA_DDR  DDRB
 #define DATA_IN   PINB
 
 #define LCD_DI   (1<<PA2)
 #define LCD_CS1  (1<<PA0)
 #define LCD_CS2  (1<<PA1)
 #define LCD_RW   (1<<PA3)
 #define LCD_E   (1<<PA4)
 #define LCD_DATA_OUT  0xff
 #define LCD_DATA_IN   0x00
 
 #define Set_RW_0  RW_PORT&=~LCD_RW
 #define Set_RW_1  RW_PORT|=LCD_RW
 #define Set_E_0  E_PORT&=~LCD_E
 #define Set_E_1  E_PORT|=LCD_E
 #define Set_DI_I  DI_PORT&=~LCD_DI   //instruction
 #define Set_DI_D  DI_PORT|=LCD_DI    //data
 #define Set_CS1_0  CS1_PORT&=~LCD_CS1
 #define Set_CS1_1  CS1_PORT|=LCD_CS1
 #define Set_CS2_0  CS2_PORT&=~LCD_CS2
 #define Set_CS2_1  CS2_PORT|=LCD_CS2
 
 void LCD_WriteC(uchar cmd)
{Set_RW_0;
 Set_DI_I;
 Set_E_0;
 DATA_PORT=cmd;
 Set_E_1;
 delay_nus(1);
 Set_E_0;
 delay_nus(20);
}
 void LCD_WriteD(uchar data)
{Set_RW_0;
 Set_DI_D;
 Set_E_0;
 DATA_PORT=data;
 Set_E_1;
 delay_nus(1);
 Set_E_0;
 delay_nus(20);
}
 /*------------------------------------
 设置显示位置坐标
 x:页地址:0-7 :0xB8+x
 y:列地址:0-63:0x40+y
 -------------------------------------*/
 void Set_XY(uchar x,uchar y)
 {x+=0xB8;
  y+=0x40;
  LCD_WriteC(x);
  LCD_WriteC(y);
 }
 /*-------------------------------------
  设置起始行 0xC0+i,i:0-63
  -------------------------------------*/
 void Set_Startline(uchar i)
 {
  LCD_WriteC(i+0xC0);
 }
 /*-------------------------------------
 左右屏幕选择:
    L:左;R:右;LR:左右
 ---------------------------------------*/
 void LCD_Select(uchar x)
{if(x==L){
     Set_CS1_1;
     Set_CS2_0;}
 else if(x==R){
     Set_CS1_0;
     Set_CS2_1;}
 else if(x==LR){
     Set_CS2_1;
     Set_CS1_1;}
 else{
     Set_CS1_0;
	 Set_CS2_0;}
}
 /*-----------------------------------
 清屏:
     从k(0-7)行开始清屏
 ------------------------------------*/
 void LCD_Clear(uchar k)
{uchar i,j;
 LCD_Select(LR);
 for(i=k;i<8;i++){
     Set_XY(i,0);
	 for(j=0;j<64;j++){
	     LCD_WriteD(0x00);}}
}
 /*---------------------------
 LCD初始化
 显示开/关:0x3E:Off,0x3F:On
 ----------------------------*/
 void LCD_Init()
{CS1_DDR|=LCD_CS1;
 CS2_DDR|=LCD_CS2;
 RW_DDR|=LCD_RW;
 E_DDR|=LCD_E;
 DI_DDR|=LCD_DI;          
 DATA_DDR=LCD_DATA_OUT;//设置各端口为输出                       
 LCD_WriteC(0x3F); //开显示
 LCD_WriteC(0xC0);//设置起始行为0
 Set_XY(0,0);        //设置显示位置坐标(0,0);
}
 /*-------------------------------------------------
 LCD汉字显示函数:
   x:页地址,y:列地址,cs:屏幕选择,x:0-7;y:0-63
   在cs选择的LCD x行y列显示hz[]所存的汉字(16*16)
 -------------------------------------------------*/
void LCD_WriteHZ(uchar x,uchar y,uchar cs,uchar const *hz)
{uchar i;
 LCD_Select(cs);
 Set_XY(x,y);
 for(i=0;i<16;i++){
     LCD_WriteD(*hz);
	 hz++;}
 Set_XY(x+1,y);
 for(i=0;i<16;i++){
     LCD_WriteD(*hz);
	 hz++;}
}
 
/*--------------------------------------------------
 LCD字符显示函数:
   x:页地址,y:列地址,cs:屏幕选择,
   在cs选择的LCD x行y列显示ch[]所存的字符(8*16)
----------------------------------------------------*/
 void LCD_WriteCH(uchar x,uchar y,uchar cs,uchar const *ch)
{uchar i;
 LCD_Select(cs);
 Set_XY(x,y);
 for(i=0;i<8;i++){
     LCD_WriteD(*ch);
	 ch++;}
 Set_XY(x+1,y);
 for(i=0;i<8;i++){
     LCD_WriteD(*ch);
	 ch++;}
}
/*-------------------------------------------------
 LCD图象显示函数
   i:起始行,j:结束行
   从LCD的i行到j行显示数组pic[]所存的图象
--------------------------------------------------*/
 void LCD_WritePIC(uchar i,uchar j,uchar const *pic)
{uchar ii,jj,kk;
 ii=0;jj=0;kk=0;
 for(ii=i;ii<j;ii++){
     for(kk=0;kk<64;kk++){  //写左屏幕
	     LCD_Select(L);
		 Set_XY(ii,kk);
		 LCD_WriteD(*pic);
		 pic++;}
	for(kk=0;kk<64;kk++){  //写右屏幕
	     LCD_Select(R);
		 Set_XY(ii,kk);
		 LCD_WriteD(*pic);
		 pic++;}
	}
}
		
				  

⌨️ 快捷键说明

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