|
前言:
这是一个实战已上线的功能,相信大多数开发者也遇到过这种打印的实际需求,打印的方式有很多种,今天基于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
|