全部博文(489)
分类:
2011-12-22 20:57:20
原文地址:并口打印机驱动 作者:luozhiyong131
/**
* 打印机数据打印功能函数实现
* 包括字符串打印函数和打印机引脚初始化
* 处理器:9G45 打印机:LQ 635k
* Lzy 2011--12-14
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include "printdev.h"
/*****************************************打印机功能函数部分***************************/
struct BSEG
{
unsigned char bit0: 1;
unsigned char bit1: 1; /*定义bit1占1个二进制位,其范围0~1*/
unsigned char bit2: 1;
unsigned char bit3: 1;
unsigned char bit4: 1;
unsigned char bit5: 1;
unsigned char bit6: 1;
unsigned char bit7: 1;
};
union DATA /*定义联合体*/
{
unsigned char ch;
struct BSEG byte;
};
/**
* 将Strobe信号设置为高电平
*/
void SetStrobe(void)
{
at91_set_gpio_value(STROBE, 0); /* 因硬件接反向器 所以把引脚位0 */
}
/**
* 将Strobe信号设置为低电平
*/
void ClrStrobe(void)
{
at91_set_gpio_value(STROBE, 1); /* 因硬件接反向器 所以把引脚位1 */
}
/**
* 初始化外部引脚
* 1、将数据D0-D7设为输出模式
* 2、STROBE也设为输出模式
* 3、将BUSY、ERROR设为输入模式
* 4、将SET1、SET2设为输出模式
* lzy 2011-11-14
*/
void PProtInit(void)
{
at91_set_gpio_output(EN, 0);
at91_set_gpio_value(EN, 1);
SetDataOut(); /* 将数据D0-D7设为输出模式 */
at91_set_gpio_output(STROBE, 0);
at91_set_gpio_input(BUSY, 0);
at91_set_gpio_input(ERROR, 0);
at91_set_gpio_output(SET1, 0);
at91_set_gpio_output(SET2, 0);
at91_set_gpio_value(SET1, 0); /* 使能打印机1 */
at91_set_gpio_value(SET2, 0); /* 禁用打印机2 */
}
/**
* 描述: 输出数据
* A&T@: Lzy 2011-12-14
*/
void POutData(unsigned char Data)
{
union DATA data;
data.ch = Data;
at91_set_gpio_value(DAT0, data.byte.bit0);
at91_set_gpio_value(DAT1, data.byte.bit1);
at91_set_gpio_value(DAT2, data.byte.bit2);
at91_set_gpio_value(DAT3, data.byte.bit3);
at91_set_gpio_value(DAT4, data.byte.bit4);
at91_set_gpio_value(DAT5, data.byte.bit5);
at91_set_gpio_value(DAT6, data.byte.bit6);
at91_set_gpio_value(DAT7, data.byte.bit7);
}
/*
* 描述: 读取打印机状态
* A&T@: Lzy 2011-12-14
*/
int PStateRead(void)
{
/* 功能 BUSY ERR
* 故障值: 1 0
*/
if(at91_get_gpio_value(ERROR) == 1)
return PRINTER_ERROR;
if(at91_get_gpio_value(BUSY) == 0) /* 因接有反向器所以需变换电平 */
return PRINTER_BUSY;
return PRINTER_OK;
}
/**
* 描述: 向打印机输出一个字符
* 输入: Data-> 要打印的字符
* A&T@: Lzy 2011-12-14
*/
int printchr(unsigned char Data)
{
int k = 0, State;
SetStrobe();
State = PStateRead();
while(State != PRINTER_OK) /* 检测打印机状态 */
{
msleep(1); /* 2ms的延时 */
if(++k > 100)
{
if(State == PRINTER_ERROR ) /* 2s后打印机还是错误 */
{
printk("打印机错误,请检查打印机!!!");
return PRINTER_ERROR;
}
if(State == PRINTER_BUSY ) /* 2s后打印机还是忙 */
{
printk("打印机正忙,请等待!!!");
return PRINTER_BUSY;
}
}
State = PStateRead();
}
POutData(Data); /* 数据输出 */
msleep(1); /* 注意: 因是并口打印机传输数据慢,并打印机反应速度比较慢,所以延时需长一点 */
ClrStrobe();
msleep(1);
SetStrobe();
msleep(1);
return PRINTER_OK;
}
/**
* 描述: 向打印机输出一个字符串
* 输入: Str-> 要打印的字符串
* A&T@: Lzy 2011-12-14
*/
int printstr(char *Str)
{
int status;
while (*Str != 0)
{
status = printchr(*Str++); /* 字符串打印 */
if(status != PRINTER_OK) /* 打印机检查 */
return status;
}
return PRINTER_OK;
}
/**
* 描述: 将DATA信号设置为输出
* A&T@: Lzy 2011-12-14
*/
void SetDataOut(void)
{
at91_set_gpio_output(DAT0, 0);
at91_set_gpio_output(DAT1, 0);
at91_set_gpio_output(DAT2, 0);
at91_set_gpio_output(DAT3, 0);
at91_set_gpio_output(DAT4, 0);
at91_set_gpio_output(DAT5, 0);
at91_set_gpio_output(DAT6, 0);
at91_set_gpio_output(DAT7, 0);
}
/**
* 描述: 将DATA信号设置为输入
* A&T@: Lzy 2011-12-14
*/
void SetDataIn(void)
{
at91_set_gpio_input(DAT0, 0);
at91_set_gpio_input(DAT1, 0);
at91_set_gpio_input(DAT2, 0);
at91_set_gpio_input(DAT3, 0);
at91_set_gpio_input(DAT4, 0);
at91_set_gpio_input(DAT5, 0);
at91_set_gpio_input(DAT6, 0);
at91_set_gpio_input(DAT7, 0);
}
完整驱动:
双打印机驱动: