Chinaunix首页 | 论坛 | 博客
  • 博客访问: 631888
  • 博文数量: 1008
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 5175
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-31 09:44
文章分类
文章存档

2012年(1008)

我的朋友

分类:

2012-08-01 11:03:45

原文地址:并口打印机驱动 作者: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;            /*定义bit11个二进制位,其范围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设为输出模式

 * 2STROBE也设为输出模式

 * 3、将BUSYERROR设为输入模式

 * 4、将SET1SET2设为输出模式

 * 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);

}

 

 HK-P110DM打印机含ESC命令.pdf   


 完整驱动:

       并口打印机驱动.rar   

双打印机驱动:

    双打印机驱动.rar   

阅读(223) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~