单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 408|回复: 0
打印 上一主题 下一主题
收起左侧

STM8移植Qrduino打印二维码源码

[复制链接]
跳转到指定楼层
楼主
看看有没有需要的


单片机源程序如下:
  1. #include "main.h"
  2. #include "qrencode.h"

  3. #define strcopy(dsr,scr)   memcpy(dsr,scr,sizeof(scr))

  4. extern unsigned char WD, WDB;
  5. extern void qrencode();
  6. extern const unsigned char framebase[];
  7. extern const unsigned char framask[];
  8. extern unsigned char ismasked(unsigned char x, unsigned char y);


  9. Uint8 printbuf[64*8];//QR版本不能过高,缓冲不够.
  10. Uint8 temp8;
  11. Uint32 temp32;

  12. //使能放大打印倍数.
  13. #define PRINT_9_MAG   
  14. #define PRINT_6_MAG  
  15. #define PRINT_3_MAG  

  16. /*******************************************************************************
  17. * Function Name  : main
  18. * Description    : main loop
  19. * Input          : None
  20. * Output         : None
  21. * Return         : None
  22. *******************************************************************************/
  23. //选择不同的version文件实现打印不同版本.
  24. int main( void )
  25. {
  26.     Uint8 i,j,k,l,loop;
  27.     Uint8 x,y;
  28.     Uint8 rowmag;//列放大.
  29.     Uint8 data1,data2;
  30.     Uint16 printrow;//打印输出的列数.

  31.     init_clk();
  32.     init_gpio();
  33.    
  34.     // BAUD_57600  BAUD_115200 BAUD_230400  BAUD_460800
  35.     init_uart(BAUD_115200);
  36.     init_oled();     
  37.     enable_interrupt();   

  38.     oled_xy(0,0);        //在哪行那列开始显示

  39.     //OLED显示QR基本框架.
  40.     for(y=0;y<WDB;y++)
  41.     {
  42.         oled_xy(y,0);  
  43.         for(x=0;x<WD;x++)
  44.         {         
  45.             data1 = framebase[x*WDB+y];
  46.             for(l=0;l<8;l++)
  47.             {
  48.                 data2 <<= 1;
  49.                 if(data1&0x01) data2|=0x01;
  50.                 data1 >>= 1;
  51.             }
  52.             oled_writ_data(data2);
  53.         }
  54.     }
  55.    
  56.     //计算QR码.
  57.     strcopy(strinbuf,"www.hawkbell.com");
  58.     qrencode();
  59.    
  60.     //OLED显示QR计算结果.
  61.     for (i = 0; i < WDB; i++)
  62.     {
  63.                 oled_xy(i, 0);
  64.                 for (j = 0; j < WD; j++)
  65.         {
  66.                         data1 = 0;
  67.                         for (k = 0; k < 8; k++)
  68.             {
  69.                                 data1 |= QRBIT(j, ((i*8)+k)) << k;
  70.                         }

  71.                         oled_writ_data(data1);
  72.             
  73.             //高低位倒过来.
  74.              for(l=0;l<8;l++)
  75.             {
  76.                 data2 <<= 1;
  77.                 if(data1&0x01) data2|=0x01;
  78.                 data1 >>= 1;
  79.             }
  80.             
  81.             //保存到缓冲中,发送到打印机时可以用.
  82.             printbuf[i*WD+j] = data2;
  83.                 }
  84.         }
  85.    
  86. #ifdef PRINT_9_MAG      
  87. ///////-----放大9倍--热敏打印机打印-----------------////////
  88.     Uint8 mut;
  89.     Uint8 ti,tj;      
  90.     Uint8 table[3]={27,54,72};
  91.     Uint8 shik[3]={3,6,0};   
  92.     Uint16 mutmask = 0x1ff;
  93.    
  94.     mut = 9;
  95.     printrow = WD*mut;

  96.     for (j = 0; j < WDB; j++)
  97.     {
  98.         for(ti=0;ti<3;ti++)
  99.         {
  100.             uart_send_byte(0x1B);
  101.             uart_send_byte(0x2A);
  102.             uart_send_byte(0x21);
  103.             uart_send_byte(printrow);
  104.             uart_send_byte(printrow>>8);
  105.    
  106.             rowmag=0;
  107.             for (i = 0; i < WD; )
  108.             {
  109.                 tj =0;
  110.                 temp8 = printbuf[j*WD+i];
  111.                 temp32 = 0;
  112.                 for(loop=0;loop<8;loop++)
  113.                 {
  114.                     temp32 <<= mut;
  115.                     if(temp8&0x80)  temp32 |= mutmask;
  116.                     temp8 <<= 1;
  117.                     
  118.                     tj += mut;
  119.                     if(tj>=table[ti])
  120.                     {
  121.                         temp32 >>= shik[ti];
  122.                         break;
  123.                     }
  124.                 }
  125.          
  126.                  uart_send_byte(temp32>>16);
  127.                  uart_send_byte(temp32>>8);
  128.                  uart_send_byte(temp32);
  129.                
  130.                 if(rowmag >= 8)//水平放大一倍.
  131.                 {
  132.                     rowmag = 0;
  133.                     i++;
  134.                 } else rowmag++;
  135.             }
  136.             
  137.             //打印一行.
  138.             uart_send_byte(0x1B);  
  139.             uart_send_byte(0x4A);
  140.             uart_send_byte(0x18);
  141.         }
  142.     }

  143.     ////////////////////////////////////////////////
  144.     uart_send_byte(0x1B);  
  145.     uart_send_byte(0x4A);
  146.     uart_send_byte(0x18);
  147.     //打印空白行
  148.     uart_send_byte(0x1B);  
  149.     uart_send_byte(0x4A);
  150.     uart_send_byte(0x18);
  151.     ////////////////////////////////////////////////
  152. #endif
  153. #ifdef PRINT_6_MAG         
  154. ///////-----放大6倍----热敏打印机打印-----------------////////
  155.     Uint8 bitflag = 0;
  156.    
  157.     printrow = WD*6;
  158.    
  159.     for (j = 0; j < WDB;j++)
  160.     {
  161.         for(bitflag = 0;bitflag<2;bitflag++)
  162.         {      
  163.             uart_send_byte(0x1B);
  164.             uart_send_byte(0x2A);
  165.             uart_send_byte(0x21);
  166.             uart_send_byte(printrow);
  167.             uart_send_byte(printrow>>8);
  168.             
  169.             rowmag=0;
  170.             for (i = 0; i < WD; )
  171.             {
  172.                  if(bitflag==0)//前4BIT.
  173.                     temp8 = printbuf[j*WD+i]&0xf0;
  174.                  else temp8 = printbuf[j*WD+i]<<4;
  175.                   
  176.                  temp32 = 0;
  177.                  for(loop=0;loop<4;loop++)
  178.                  {
  179.                     temp32 <<= 6;
  180.                     if(temp8&0x80)  temp32 |= 0x3f;
  181.                     temp8 <<= 1;
  182.                  }
  183.             
  184.                 uart_send_byte(temp32>>16);
  185.                 uart_send_byte(temp32>>8);
  186.                 uart_send_byte(temp32);
  187.            
  188.                 if(rowmag >= 5)//水平放大一倍.
  189.                 {
  190.                     rowmag = 0;
  191.                     i++;
  192.                 } else rowmag++;
  193.             }
  194.    
  195.             uart_send_byte(0x1B);  
  196.             uart_send_byte(0x4A);
  197.             uart_send_byte(0x18);     
  198.         }
  199.     }
  200.    
  201.     ////////////////////////////////////////////////
  202.     uart_send_byte(0x1B);  
  203.     uart_send_byte(0x4A);
  204.     uart_send_byte(0x18);
  205.     //打印空白行
  206.     uart_send_byte(0x1B);  
  207.     uart_send_byte(0x4A);
  208.     uart_send_byte(0x18);
  209.     ////////////////////////////////////////////////
  210. #endif
  211. #ifdef PRINT_3_MAG      
  212. ///////-----放大3倍--------热敏打印机打印-----------------////////
  213.     printrow = WD*3;
  214.    
  215.     for (j = 0; j < WDB; j++)
  216.     {
  217.         uart_send_byte(0x1B);
  218.         uart_send_byte(0x2A);
  219.         uart_send_byte(0x21);
  220.         uart_send_byte(printrow);
  221.         uart_send_byte(printrow>>8);
  222.       
  223.         rowmag=0;
  224.         for (i = 0; i < WD; )
  225.         {
  226.             temp8 = printbuf[j*WD+i];
  227.             temp32 = 0;
  228.             for(loop=0;loop<8;loop++)
  229.             {
  230.                 temp32 <<= 3;
  231.                 if(temp8&0x80)  temp32 |= 0x07;
  232.                 temp8 <<= 1;
  233.             }
  234.    
  235.             uart_send_byte(temp32>>16);
  236.             uart_send_byte(temp32>>8);
  237.             uart_send_byte(temp32);
  238.    
  239.             if(rowmag >= 2)//水平放大3倍.
  240.             {
  241.                 rowmag = 0;
  242.                 i++;
  243.             }
  244.             else rowmag++;
  245.          }
  246.       
  247.         uart_send_byte(0x1B);  
  248.         uart_send_byte(0x4A);
  249.         uart_send_byte(0x18);   
  250.     }

  251.     ////////////////////////////////////////////////
  252.     uart_send_byte(0x1B);  
  253.     uart_send_byte(0x4A);
  254.     uart_send_byte(0x18);
  255.     //打印空白行
  256.     uart_send_byte(0x1B);  
  257.     uart_send_byte(0x4A);
  258.     uart_send_byte(0x18);
  259.     ////////////////////////////////////////////////   
  260. #endif
  261.    
  262.     //切纸
  263.     uart_send_byte(0x1D);
  264.     uart_send_byte(0x56);
  265.     uart_send_byte(0x42);
  266.     uart_send_byte(0x80);
  267.    
  268.     while(1);
  269. }
复制代码

所有资料51hei提供下载:
STM8移植Qrduino打印二维码.rar (767.61 KB, 下载次数: 5)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 转播转播 分享分享 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51Hei单片机16群 联系QQ:125739409;技术交流QQ群7344883

Powered by 单片机教程网

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