迪文科技论坛

 找回密码
 立即注册
搜索
查看: 404|回复: 1

【开源】T5L迪文屏的无线蓝牙打印机

[复制链接]

4

主题

6

回帖

461

积分

中级会员

Rank: 3Rank: 3

积分
461
发表于 2023-8-25 20:00:08 | 显示全部楼层 |阅读模式
前言:
这是一个实战已上线的功能,相信大多数开发者也遇到过这种打印的实际需求,打印的方式有很多种,今天基于T5L迪文屏开源一种蓝牙无线打印方式,
打印机使用的是具有蓝牙功能的热敏打印机,某宝一搜,很容易买到,而且价格也是比较实惠的,如下图:


而蓝牙模块使用的是汇辰的HC-05模块,具有主从一体模式,也是某宝一搜,如下图:


硬件设计:


   我们的T5L迪文屏采用串口5来驱动HC-05蓝牙模块,然后由HC-05蓝牙模块无线连接到热敏打印机,硬件框图如下:


这里还给大家分享实现了T5L串口5驱动的干货,可能大家通常用的都是串口2吧,为了给大家带来技术干货,我这里特定选用了串口5

GUI界面设计:
这里先直接给大家上实物界面效果图吧,看得明白
DGUS Tool软件预览效果如下:


主界面:


打印文本功能:


通讯设置:


打印二维码:


打印条形码:


所用到的图片素材和图标素材如下:



就上面效果而言,实现的功能框图如下:



程序设计:

串口5驱动代码:

void uart5_init(u32 baud)
{
        SCON3T = 0x80;
        SCON3R = 0x80;
        baud = (u32)((double)(FOSC/8.0)/baud);
        BODE3_DIV_H = (baud>>8)&0xff;
        BODE3_DIV_L = baud&0xff;
        ES3R = 0;
        ES3T = 0;
}


void u5_send_byte(u8 byte)
{
        SBUF3_TX = byte;
        while(!(SCON3T&0x01));
        SCON3T &= 0xfe;
}


void u5_send_bytes(u8 *bytes,u16 len)
{
        u16 i;

        for(i=0;i<len;i++)
        {
                SBUF3_TX = bytes;
                while(!(SCON3T&0x01));
                SCON3T &= 0xfe;
        }
}


打印驱动代码如下:

sbit BT_KEY        =        P0^0;

#define BT_KEY_H  BT_KEY=1
#define BT_KEY_L        BT_KEY=0


#define printer_send_byte   u5_send_byte
#define printer_send_bytes  u5_send_bytes

#define PRINT_AND_LINE_CMD 1
#define EN_UNDERLINE_MODE_CMD 4
#define ALIGN_CMD 8
#define FONT_SIZE_CMD        9
#define PRINT_INIT_CMD 10
#define CN_UNDERLINE_MODE_CMD 14
#define BOLD_CMD 15
#define NO_ARG 0Xff

typedef enum{
        PDF417 = 0,
        DATAMATRIX = 1,
        QRCODE = 2,
        CODE39 = 4,
        ITF = 5,
        CODABAR = 6
}code_type;


void printer_init(void);
void printer_print_text(u8 *text);
void printer_set_cmd(u8 cmd,u8 arg);
void printer_set_font(u8 width, u8 height, u8 is_bold, u8 underline);
void pinter_print_2code(code_type type,u8 *content,u16 len);
void pinter_print_1code(code_type type,u8 *content,u8 len,u8 hri_pos);
void pinter_set_1code(u8 width,u8 height);

void printer_init()
{
        P0MDOUT |= 0x01;
        BT_KEY_L;
        uart5_init(9600);
}


code u8 PRINTER_CMD[][4]={
  {27,74,0,2},
  {27,100,0,2},
  {27,33,0,2},
  {27,86,0,2},
  {27,45,0,2},
  {27,99,0,2},
  {27,51,0,2},
  {27,32,0,2},
  {27,97,0,2},
  {29,33,0,2},
  {27,64,0,2},
  {10,0,0,1},
  {9,0,0,1},
  {27,50,0,2},
  {28,45,0,2},
  {27,69,0,2},
};

void printer_print_text(u8 *text)
{
          u8 *end = text;
        while((*end)&&(*end!=0xFF))
          end++;
        printer_send_bytes(text,end-text);
}

void printer_set_cmd(u8 cmd,u8 arg)
{
        printer_send_bytes((u8 *)(PRINTER_CMD[cmd]),PRINTER_CMD[cmd][3]);
        if(arg!=NO_ARG)
                printer_send_byte(arg);
}

void printer_set_font(u8 width, u8 height, u8 is_bold, u8 underline)
{
        printer_set_cmd(BOLD_CMD,is_bold);
        printer_set_cmd(EN_UNDERLINE_MODE_CMD,underline);
        printer_set_cmd(CN_UNDERLINE_MODE_CMD,underline);
        width &= 0x07;
        height &= 0x07;
        
        printer_set_cmd(FONT_SIZE_CMD,(width<<4)+height);//字体大小
}


void pinter_print_2code(code_type type,u8 *content,u16 len)
{
        u8 frame[5] = {0x1d,0x5a,0,0x1b,0x5a};
        frame[2] = (u8)type;
        printer_send_bytes(frame,sizeof(frame));
        frame[0] = 0x02;
        frame[1] = 0x03;
        frame[2] = 0x08;
        frame[3] = (u8)(len&0xff);
        frame[4] = (u8)(len>>8);
        printer_send_bytes(frame,sizeof(frame));
        printer_send_bytes(content,len);
}


void pinter_print_1code(code_type type,u8 *content,u8 len,u8 hri_pos)
{
  u8 frame[3] = {0x1d,0x48,0};
        frame[2] = hri_pos;
        printer_send_bytes(frame,sizeof(frame));
        frame[0] = 0x1d;
        frame[1] = 0x6b;
        frame[2] = (u8)type;
        printer_send_bytes(frame,sizeof(frame));
        printer_send_bytes(content,len);
        printer_send_byte(0x00);
}


void pinter_set_1code(u8 width,u8 height)
{
  u8 frame[3] = {0x1d,0x77,0};
        frame[2] = width;
  printer_send_bytes(frame,sizeof(frame));
  frame[0] = 0x1d;
  frame[1] = 0x68;
  frame[2] = height;
  printer_send_bytes(frame,sizeof(frame));
}


main函数运行流程代码如下:

void main(void)
{   
        u16 btn_val;
        u16 is_underline;
        u16 is_bold;
        u16 font_size;
        u16 align_way;
        u16 qrcode_type;
        u16 lcode_type;
        u8 i,len;
        
        sys_init();
        printer_init();

        while(1)
        {   
                sys_read_vp(0x1000,(u8*)&btn_val,1);
                if(btn_val)
                {
                        if(btn_val==1)
                        {
                                sys_read_vp(0x2020,(u8*)&is_underline,1);
                                sys_read_vp(0x2030,(u8*)&is_bold,1);
                                sys_read_vp(0x2040,(u8*)&font_size,1);
                                sys_read_vp(0x2050,(u8*)&align_way,1);
                                printer_set_cmd(PRINT_INIT_CMD,NO_ARG);
                                printer_set_cmd(ALIGN_CMD,align_way);
                                printer_set_font(font_size,font_size,!is_bold,!is_underline);
                                sys_read_vp(0x2060,text,30);
                                printer_print_text(text);
                                printer_set_cmd(PRINT_AND_LINE_CMD,3);
                        }else if(btn_val==2)
                        {
                                printer_set_cmd(PRINT_AND_LINE_CMD,3);
                        }else if(btn_val==3)
                        {
                                printer_set_cmd(PRINT_INIT_CMD,NO_ARG);
                        }else if(btn_val==4)
                        {
                                sys_read_vp(0x2100,(u8*)&qrcode_type,1);
                                sys_read_vp(0x2120,text,30);
                                len = 0;
                                for(i=0;i<200;i++)
                                {
                                        if((text!=0)&&(text!=0xff))
                                                len++;
                                        else
                                                break;
                                }
                                printer_set_cmd(PRINT_INIT_CMD,NO_ARG);
                                printer_set_font(0,0,0,0);
                                pinter_print_2code(qrcode_type,text,len);
                        }else if(btn_val==5)
                        {
                                sys_read_vp(0x2200,(u8*)&lcode_type,1);
                                sys_read_vp(0x2220,text,30);
                                len = 0;
                                for(i=0;i<200;i++)
                                {
                                        if((text!=0)&&(text!=0xff))
                                                len++;
                                        else
                                                break;
                                }
                                printer_set_cmd(PRINT_INIT_CMD,NO_ARG);
                                printer_set_font(0,0,0,0);
                                pinter_set_1code(2,70);
                                pinter_print_1code(lcode_type+CODE39,text,len,0);
                        }
                        
                        btn_val = 0;
                        sys_write_vp(0x1000,(u8*)&btn_val,1);
                }
               
               
        }
}



打印效果拍照:

上图中有字体加粗, 下划线, 文本对齐, 字体大小调节等打印效果, 因为打印纸已经存放很久了,有点潮湿,所以看上去有些白点


上图为条形码打印效果

视频演示: https://b23.tv/OogXT6r





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0

主题

118

回帖

1499

积分

金牌会员

Rank: 6Rank: 6

积分
1499
发表于 2023-8-28 08:47:01 | 显示全部楼层
厉害了,楼主
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2024-5-14 02:07 , Processed in 0.089789 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表