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

📄 气体检测.txt

📁 OCM240128-7.rar
💻 TXT
📖 第 1 页 / 共 2 页
字号:
气体检测信号:
探头输出范围0--2.5V
故障点下限0V,上限2.4V
调零:0.39V
报警下限:25%=0.78V,上限50%=1.2V





www.pudn.com > CM240128-7.rar > cm240128-7.c

   

/*****************************************************************************  
;Institue of Automation, Chinese Academy of Sciences  
;www.hyesco.com  
;Description:   main  
;Date:                  2006-3-12     
;Author:                hyesco        
;E_mail:          luxg@hyesco.com  
*****************************************************************************/   
#include <LINUX module.h>    
#include <LINUX kernel.h>    
#include <LINUX init.h>    
#include <LINUX sched.h>    
#include <LINUX fs.h>    
#include <LINUX mm.h>    
#include <LINUX poll.h>    
#include <LINUX slab.h>    
#include <LINUX ioport.h>    
#include <ASM uaccess.h>    
#include <ASM io.h>    
#include <LINUX fcntl.h>    
#include <LINUX string.h>    
#include <LINUX delay.h>    
   
#include <ASM bitops.h>    
#include <ASM AT91RM9200_SYS.h arch>    
#include <LINUX devfs_fs_kernel.h>    
#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<<AT91C_ID_PIOB; AT91_SYS- 开PB口时钟>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;i<LEN;I++) printk(?<1 { 0) < &lcd_fops)) lcd_name, if((result="devfs_register_chrdev(major," 注册设备驱动模块 result="0;" int unsigned LCD_at91_init(void) __init ********************************************************* 注册模块: } ; 0 return udelay(10); lcd_wd(tempbuf[i]); 写字符数据到DDRAM>devfs_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;   
      }   
}   
   
   

⌨️ 快捷键说明

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