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

📄 气体检测.txt

📁 OCM240128-7.rar
💻 TXT
📖 第 1 页 / 共 2 页
字号:
module_init(LCD_at91_init);   
module_exit(LCD_at91_cleanup);   
   
MODULE_AUTHOR("<LUXG@HYESCO.COM>");   
MODULE_DESCRIPTION("AT91 LCD Driver (AT91_LCD)");   
MODULE_LICENSE("GPL");   
         

/***************************************************************************** 
;Institue of Automation, Chinese Academy of Sciences 
;www.hyesco.com 
;Description: 	main 
;Date:					2006-3-12	 
;Author:				hyesco		 
;E_mail:	      luxg@hyesco.com 
*****************************************************************************/ 
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
 
#include  
#include  
#include  
#include "cm240128-7.h" 
 
#define uchar unsigned char 
#define uint  unsigned int 
#define cchar const unsigned char  
#define U32 unsigned long 
 
#define WriteDelay    10  
 
static devfs_handle_t devfs_handle;			//设备文件的句柄 
static char lcd_name[]="lcddrv";				//设备的模块名 
static U32 major =0;										//设备的主设备号(动态配置) 
 
//********************************************************* 
//函数定义; 
//********************************************************* 
static int lcd_release(struct inode * inode,struct file * filp); 
static int lcd_open(struct inode *,struct file *); 
static int lcd_write(struct file *filp, const char *buf, size_t count,loff_t *f_pos); 
static int lcd_ioctl(struct inode *,struct file *, unsigned int, unsigned long); 
 
//********************************************************* 
//文件操作结构体; 
//********************************************************* 
struct file_operations lcd_fops = { 
 	owner:		        THIS_MODULE, 
	release:        	lcd_release, 
  open:           	lcd_open,	 
  write:            lcd_write, 
  ioctl:            lcd_ioctl, 
}; 
 
//********************************************************** 
// 大延迟程序(毫秒级) 
//********************************************************** 
void delay_m(uint time) 
{ 
        uint i; 
        while(time--){ 
                i=1000; 
                while(--i); 
        } 
} 
 
 
//********************************************************** 
// 延迟程序 
//********************************************************** 
void lcd_delay(uchar time1,uchar time2) 
{ 
        uchar  z; 
        z=time2; 
        do 
          { 
           z=time2; 
           do{ ;}while(z--); 
          }while(time1--); 
} 
 
 
//********************************************************* 
// LCD连接的Gpio端口配置函数 : 
//********************************************************* 
void Gpio_Config(void) 
{    
		AT91_SYS->PMC_PCER |=1<PIOB_PER |=0x1fff00;                //PB8-PB15  PB16 PB17 PB18 PB19 PB20 使能PIO      
		AT91_SYS->PIOB_PER |=LCD_BACKLIGHT;           //PB29 使能PIO 
		AT91_SYS->PIOB_OER |=0x1fff00;                //PB8-PB15  PB16 PB17 PB18 PB19 PB20 为输出 
		AT91_SYS->PIOB_OER |=LCD_BACKLIGHT;           //PB29 为输出 
		AT91_SYS->PIOB_OWER |=LCD_PORT;               //PB8-PB15 使能PIO_ODSR    
		AT91_SYS->PIOB_PPUER |=LCD_PORT;							//PB8-PB15 使能PIO_ODSR  
		AT91_SYS->PIOB_SODR |=LCD_BACKLIGHT;          //开背光 
} 
 
//********************************************************* 
//写命令到LCD : 
//********************************************************* 
void lcd_wc(uchar lcd_code)/*写命令*/ 
{      
		AT91_SYS->PIOB_CODR |=LCD_CS1;					//使能LCD 
		AT91_SYS->PIOB_CODR |=LCD_RS;						//RS=0  选择写缓存器 
		lcd_delay(WriteDelay,WriteDelay);  
		AT91_SYS->PIOB_SODR |=LCD_RD;						//RD=1   
		AT91_SYS->PIOB_CODR |=LCD_WR;						//WR=0   
		AT91_SYS->PIOB_ODSR &= ~LCD_PORT;				//数据线清零 
		AT91_SYS->PIOB_ODSR |=(lcd_code<<8);		//写数据 
		lcd_delay(WriteDelay,WriteDelay);  
		AT91_SYS->PIOB_SODR |= LCD_WR;					//WR=1 
		lcd_delay(WriteDelay,WriteDelay);  
		AT91_SYS->PIOB_SODR |= LCD_RS;    			//RS=1 
		AT91_SYS->PIOB_SODR |= LCD_CS1; 				//CS1=1 禁能LCD 
		lcd_delay(WriteDelay,WriteDelay);           					//延迟,代替等待LCD不忙 
} 
 
//********************************************************* 
// 写数据到 LCD : 
//********************************************************* 
void lcd_wd(uchar lcd_data)/*写数据*/ 
{ 
		AT91_SYS->PIOB_ODSR &= ~LCD_PORT;					//数据线清零 
		AT91_SYS->PIOB_ODSR |=(lcd_data<<8);			//发送数据到数据线 
		AT91_SYS->PIOB_CODR |=LCD_CS1;						//使能LCD 
		AT91_SYS->PIOB_SODR |=LCD_RS;							//RS=1   
		AT91_SYS->PIOB_SODR |=LCD_RD;							//RD=1 
		AT91_SYS->PIOB_CODR |=LCD_WR; 						//WR=0 
		lcd_delay(WriteDelay,WriteDelay);         
		AT91_SYS->PIOB_SODR |= LCD_WR;  					//WR=1                 
		AT91_SYS->PIOB_CODR |= LCD_RS;						//RS=0 
		AT91_SYS->PIOB_SODR |= LCD_CS1;						//禁能LCD 
		lcd_delay(WriteDelay,WriteDelay);   
} 
 
//********************************************************* 
// 写命令(先写寄存器地址后写数据) 
//********************************************************* 
void LCD_CmdWrite(uchar lcd_code,uchar lcd_data) 
{ 
	lcd_wc(lcd_code);        //写命令 
	lcd_delay(20,20); 
	lcd_wc(lcd_data);        //写参数 
	lcd_delay(20,20); 
} 
 
//********************************************************* 
// 清屏: 
//********************************************************* 
void lcd_clear(void) 
{ 
	LCD_CmdWrite(0x60,0x0);			//设置X坐标 
	LCD_CmdWrite(0x70,0x0);			//设置Y坐标 
	LCD_CmdWrite(0xE0,0x00);		//写入需要填充的数据 0x00 
	LCD_CmdWrite(0xF0,0xa8);		//使F0的BIT[3]=1  开始填充   
	delay_m(500);              
} 
 
//********************************************************* 
// LCD 初始化函数 : 
//********************************************************* 
void lcd_init(void) 
{ 
	AT91_SYS->PIOB_SODR |=LCD_RES;     
  AT91_SYS->PIOB_CODR |=LCD_RES;			//复位										 
  delay_m(1000);											//至少延迟250ms 
  AT91_SYS->PIOB_SODR |=LCD_RES; 
  AT91_SYS->PIOB_SODR |=LCD_CS1|LCD_RS|LCD_RD|LCD_WR; 
  delay_m(1000);											//至少延迟50ms 
 
	LCD_CmdWrite(0x00,0xC1);	//	图形模式,不开显示 
	LCD_CmdWrite(0x02,0x10);	//  
	LCD_CmdWrite(0x03,0x80);	//  
	LCD_CmdWrite(0x10,0x6b);	// 不开光标  0x6f--开光标 
	LCD_CmdWrite(0x11,0x00);	// 设定光标高度与行距 
	LCD_CmdWrite(0x12,0x91);	// LCD 显示图层设定 
	 
	LCD_CmdWrite(0x20,0x1D);	// 工作窗口右边位置 1D=(240/8)-1=29 
	LCD_CmdWrite(0x30,0x7F);	// 工作窗口底边位置 7F=128-1 
	LCD_CmdWrite(0x40,0x00);	// 工作窗口左边位置 
	LCD_CmdWrite(0x50,0x00);	// 工作窗口左边位置 
	 
	LCD_CmdWrite(0x21,0x1D);	// 显示窗口右边位置 1D=(240/8)-1=29 
	LCD_CmdWrite(0x31,0x7F);	// 显示窗口底边位置 80=128 
	LCD_CmdWrite(0x41,0x00);	// 显示窗口左边位置 
	LCD_CmdWrite(0x51,0x00);	// 显示窗口左边位置 
	 
	LCD_CmdWrite(0xD0,0x80);	// 设定DAC 电流输出,可调整LCD 亮度 
	 
	LCD_CmdWrite(0xE0,0x00);	// 设定写入显示内存的数据(需搭配缓存器[F0] 
	LCD_CmdWrite(0xF0,0xa0);	// 设定中文字型为”GB2323” 
	LCD_CmdWrite(0xF1,0x0F);	// 改变字型垂直与水平显示大小 
 
	LCD_CmdWrite(0x01,0xF0);	// 系统工作频率与中断准位设定 
	LCD_CmdWrite(0x81,0x04);	// 变换FRM 极性的起始地址(Common) 
	LCD_CmdWrite(0x91,0x00);	// 变换FRM 极性的结束地址(Common) 
	LCD_CmdWrite(0x90,0x0f);	// 刷新频率	 
	 
	LCD_CmdWrite(0x60,0x0);		//清屏 
	LCD_CmdWrite(0x70,0x0);			 
	LCD_CmdWrite(0xE0,0x00);		 
	LCD_CmdWrite(0xF0,0xa8);		 
	delay_m(500); 
	 
	LCD_CmdWrite(0x00,0xcd);	 
	LCD_CmdWrite(0x60,0x00); 
	LCD_CmdWrite(0x70,0x00); 
	lcd_wd(0xd7);									//"注" 
	lcd_wd(0xa2); 
		 
	LCD_CmdWrite(0x60,0x02); 
	LCD_CmdWrite(0x70,0x00); 
	lcd_wd(0xb2);									//"测" 
	lcd_wd(0xe2); 
	 
	LCD_CmdWrite(0x60,0x04); 
	LCD_CmdWrite(0x70,0x00); 
	lcd_wd(0xb3);									//"成" 
	lcd_wd(0xc9); 
		 
	LCD_CmdWrite(0x60,0x06); 
	LCD_CmdWrite(0x70,0x00); 
	lcd_wd(0xb9);									//"功" 
	lcd_wd(0xa6); 
	 
	 
} 
 
//********************************************************* 
//  LCD open 函数: 
//********************************************************* 
int lcd_open(struct inode * inode, struct file * filp) 
{ 
	MOD_INC_USE_COUNT; 
	return 0; 
} 
 
//********************************************************* 
//LCD release 函数 : 
//********************************************************* 
int lcd_release(struct inode * inode,struct file * filp) 
{ 
	MOD_DEC_USE_COUNT; 
	return 0; 
}	 
 
//********************************************************* 
// LCD ioctl 函数: 
//********************************************************* 
int lcd_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg) 
{ 
	 switch (cmd)  
	    {	 
	      case DISPLAY_T_ON:       //开文本显示     
	    		{ 
	    			 LCD_CmdWrite(0x00,0xcd);  
	    		 	 break;  
	      	} 
	      case DISPLAY_G_ON:			//开图形显示   
	    		{ 
	    			 LCD_CmdWrite(0x00,0xc5);  
	    		 	 break;  
	      	} 
	      case BACKLIGHT_ON:			//开背光 
	    		{ 
	    			 AT91_SYS->PIOB_SODR |=LCD_BACKLIGHT;		 
	    		 	 break;  
	      	} 
	      case BACKLIGHT_OFF:			//关背光 
	    		{ 
	    			 AT91_SYS->PIOB_CODR |=LCD_BACKLIGHT;		 
	    		 	 break;  
	      	} 
	      case SET_X:							//设置X坐标 
	    		{ 
	    			 LCD_CmdWrite(0x60,(unsigned char)arg);  
	    		 	 break;  
	      	} 
	       case SET_Y:						//设置Y坐标 
	    		{ 
	    			 LCD_CmdWrite(0x60,(unsigned char)arg); 
	    		 	 break;  
	      	} 
	      	case CLR:							//清屏 
	      		{  
	      		  lcd_clear();    
	      		  break; 
	      		} 
	      
	       default: 
	       	break; 
	    } 
	 
	return 0;	  	       	             
} 
 
//********************************************************* 
// 写数据到LCD: 
//********************************************************* 
int lcd_write(struct file *filp, const char *buf, size_t count,loff_t *f_pos) 
{   
		uint len,i; 
	  uchar tempbuf[128*30]; 
	   
	  len=count; 
	  if(len > 128*30) 
	  	return -1; 
	  	 
		//拷贝用户数据到内核 
		copy_from_user(tempbuf, buf, len); 
              
		for(i=0;idevfs_register_chrdev err!\n"); 
		      return result; 
	      } 
 
     if(major==0) 
        major=result; 
 
     // 建立设备文件节点      
      devfs_handle = devfs_register(NULL, "cm240128-7",DEVFS_FL_DEFAULT, 
                        major, 0, S_IFCHR | S_IRUSR | S_IWUSR,&lcd_fops, NULL); 
 
     Gpio_Config();   // LCD连接的Gpio端口配置 
	   lcd_init();     // 初始化LCD 
     return 0; 
} 
 
//********************************************************* 
// 注销模块: 
//********************************************************* 
void __exit LCD_at91_cleanup(void) 
{ 
	int retv; 
     
  AT91_SYS->PIOB_CODR |=LCD_BACKLIGHT;		//开背光 
  LCD_CmdWrite(0x00,0xC1); 										//关显示 
  if((retv=devfs_unregister_chrdev(major,lcd_name))<0) 
      { 
        printk("<1>UnRegister Fail!\n"); 
        return; 
      } 
} 
 
 
module_init(LCD_at91_init); 
module_exit(LCD_at91_cleanup); 
 
MODULE_AUTHOR(""); 
MODULE_DESCRIPTION("AT91 LCD Driver (AT91_LCD)"); 
MODULE_LICENSE("GPL"); 

⌨️ 快捷键说明

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