📄 气体检测.txt
字号:
气体检测信号:
探头输出范围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 + -