久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10604|回復: 19
打印 上一主題 下一主題
收起左側

單片機根據字符串生成二維碼并在OLED顯示 附源程序

  [復制鏈接]
跳轉到指定樓層
樓主
以前因為某些需要,需要單片機根據字符串自動生成二維碼,(而不是把二維碼圖片取模再用LCD顯示圖片)恰好https://blog.csdn.net/qq_21475601/article/details/71480028這位前輩中找到了好資源,并利用這位前輩提供的LCD顯示方法成功在LCD12864中顯示了出來,效果圖如下:

可以看到圖片清晰地顯示了出來,且用任意掃碼工具都能快速掃描出結果。感謝前輩的無私分享。
        好了,回歸正題,最近手頭有一塊0.96OLED 屏幕,閑來無事就顯示個二維碼玩玩。首先移植前輩的二維碼庫,只需要QR_Encode.cQR_Encode.h這兩個就足夠了。移植到任何一個能正常使用的oled驅動例程中,編寫打點和畫矩形函數,再調用QR_Encode.c中的bool EncodeData(char *lpsSource)函數就會根據你輸入的字符串生成二維碼數據并保存在全局數組m_byModuleData[MAX_MODULESIZE][MAX_MODULESIZE];中了,二維碼的數據都是01,顯示到屏幕時只需要一個個判斷,遇1打點,遇0擦點(二維碼正顯)或遇1擦點,遇0打點(二維碼反顯),最后再刷新到oled上就好了。但這樣的話得出來的二維碼是比較小的,我們需要寫算法進行放大。放大的原理是一個點用幾個點表示,我用的方法是遇到0就畫一個實心的矩形,遇到1就擦除一個實心矩形里面的所有點(反顯),效果圖如下:
我們看到,這個反顯的二維碼是能生成并顯示出來了,但是沒有打底或沒有邊框就顯得很難看。所以為了好看,需要給它加個邊框或打個白底,效果圖如下(右)

此時可以看到右邊這個打了白底的邊框就顯得很好看了。圖中左邊是沒有打底的正顯二維碼,為何要用反顯而不用正顯呢?因為正顯的除非掃碼算法優化得特別好(如QQ、微信等),不然一般的掃碼比較難掃描出結果,而反顯的一掃就出來了,不信你們可以用瀏覽器的掃碼或多試幾個掃碼軟件看看。下圖是正顯的二維碼

顯示二維碼到LCD最重要的是打點函數,可以開辟一個緩存用來存儲打點的數據,最后把二維碼數據和其他數據如邊框或打底的數據都存完進這個緩存后再調用刷新屏幕函數刷新到oled即可。
打點函數如下:
  1. void OLED_DrawPoint(u8 x, u8 y, u8 t)
  2. {
  3.     u8 pos, bx, temp = 0;
  4.     if(x > 127 || y > 63)
  5.     {
  6.         return;//超出范圍了.
  7.     }
  8.         pos = 7 - y/8;
  9.         bx = y % 8;
  10.         temp = 1 << (7 - bx);
  11.         t ? (OLED_GRAM[x][pos] |= temp) : (OLED_GRAM[x][pos] &= ~temp);   
  12. }
復制代碼
刷新顯存函數如下:
  1. void OLED_Refresh_Gram(void)//更新顯存到OLED
  2. {
  3.         u8 i, n;                    
  4.         for(i = 0; i < 8; i++)  
  5.         {  
  6.                 WriteCmd(0xb0 + i);    //設置頁地址(0~7)
  7.                 WriteCmd(0x00);      //設置顯示位置—列低地址
  8.                 WriteCmd(0x10);      //設置顯示位置—列高地址   
  9.                 for(n = 0; n < 128; n++)
  10.                 {
  11.                         WriteDat(OLED_GRAM[n]);
  12.                 }
  13.         }   
  14. }
復制代碼
下面就是最重要的我封裝好了的二維碼顯示函數:
  1. /**************************************************************************************************************
  2. 功能:在oled上顯示二維碼
  3. 參數:str->二維碼內容;   offset->二維碼在X軸上的位置,范圍為0-127;  colour=1->二維碼正顯  colour=0->二維碼反顯
  4. **************************************************************************************************************/
  5. void OLED_QRcode_Display(char *str,uint8_t offset,uint8_t colour)//二維碼的內容和第一個點再X軸的位置
  6. {
  7.         uint32_t i,j,point;
  8.         uint8_t exp = 1;//放大倍數
  9.         uint8_t pos_X,pos_Y;   
  10.     if(colour)
  11.         point = 1;
  12.     else
  13.         point = 0;   

  14.     EncodeData(str);        
  15.         exp = 64 / m_nSymbleSize;           //根據屏幕尺寸自動計算最佳放大倍數
  16.         pos_Y = (64 - exp*m_nSymbleSize)/2;        //這是二維碼左下角第一個點的縱坐標
  17.         pos_X = pos_Y + offset;             //這是二維碼左下角第一個點的橫坐標

  18.     if(point==0)
  19.         OLED_Fill2(pos_X-2,pos_Y-2,pos_X + exp*m_nSymbleSize+2,pos_Y + exp*m_nSymbleSize+2,1);//給反顯的二維碼填充底色
  20.     //exp*m_nSymbleSize為放大后二維碼的邊長(二維碼是正方形)
  21.         for(i=0;i<m_nSymbleSize;i++)
  22.         {
  23.                 for(j=0;j<m_nSymbleSize;j++)
  24.                 {
  25.                                 if(m_byModuleData[j] == 1)
  26.                                 {
  27.                                         OLED_Fill2(pos_X,pos_Y,pos_X+exp,pos_Y+exp,point);//畫矩形并填充
  28.                                 }
  29.                                 if(m_byModuleData[j] == 0)
  30.                                 {
  31.                                         OLED_Fill2(pos_X,pos_Y,pos_X+exp,pos_Y+exp,1-point);//清空矩形區域
  32.                                 }
  33.                                 pos_Y += exp;
  34.                 }
  35.                 pos_X += exp;
  36.                 pos_Y -= m_nSymbleSize*exp;
  37.         }
  38.     OLED_Refresh_Gram();
  39. }
復制代碼
調用方法如下:

file:///C:\Users\梁溥開\AppData\Local\Temp\ksohtml16084\wps6.jpg
其中,str是二維碼的內容,可中英文和數字,若要掃碼時自動打開網頁,則需要在前面加https:// ;offset是二維碼在X軸上的初始橫坐標,范圍為0-127,可用此調整二維碼的橫坐標讓它居左居中等,縱坐標我現在設定的是自動調整到最大,可以自己修改。colour是正反顯選擇,0是反顯,1是正顯。如我要生成一個掃碼就自動進入百度網頁的居中反顯二維碼時參數如下:OLED_QRcode_Display("https://baidu.com",63,0);這樣就能達到我們想要的效果了。下面是一正一反顯二維碼圖:

下面是我的硬件平臺:STM32F103C8T6核心板和0.96oled。移植到其他平臺時內存8K以下的慎用,可能內存會爆。。

大家可以多多評論,多多交流。
下方有完整工程可下載,用的HAL庫,STM32Cubemx配置的工程。
我的更多實用帖子大家也可看下哈,說不定某天用到呢哈哈
1、按鍵自由定義的矩陣鍵盤程序:http://www.zg4o1577.cn/bbs/dpj-150013-1.html
2、GSM獲取網絡時間的三種方法:http://www.zg4o1577.cn/bbs/dpj-163719-1.html
3、后續可能偶爾出新帖分享有趣的東西。
沒黑幣或黑幣不夠的小可愛請點擊這里下載:https://download.csdn.net/download/qq_36112455/12503413
大家覺得不錯的可以多多評論或轉發收藏點贊哈,還有,轉載注明出處,謝謝~

全部資料51hei下載地址:
IIC_OLED_QR_Code.7z (14.33 MB, 下載次數: 408)

評分

參與人數 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏36 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:560778 發表于 2020-11-5 15:22 | 只看該作者
樓主,我想問問 如果將 二維碼的數據通過熱敏打印機輸出需要如何做?
不知道你有么有頭緒,我自己寫的輸出在紙上是一串亂碼
回復

使用道具 舉報

板凳
ID:435174 發表于 2020-11-5 22:41 | 只看該作者
爐石 發表于 2020-11-5 15:22
樓主,我想問問 如果將 二維碼的數據通過熱敏打印機輸出需要如何做?
不知道你有么有頭緒,我自己寫的輸出 ...

二維碼的所有數據不是0就是1,字符串轉換成二維碼數據后所有數據就都已經存儲在m_byModuleData[][]這個二維數組中了,附件代碼里面有個QR_Print.c,里面有把二維碼打印到串口調試助手的代碼,是我以前調試用的,你可以看看,不知道對你有沒有幫助。
回復

使用道具 舉報

地板
ID:560778 發表于 2020-11-6 17:08 | 只看該作者
Linux— 發表于 2020-11-5 22:41
二維碼的所有數據不是0就是1,字符串轉換成二維碼數據后所有數據就都已經存儲在m_byModuleData[][]這個二 ...

嗯,我去看看,謝謝樓主
回復

使用道具 舉報

5#
ID:843004 發表于 2020-11-13 11:23 | 只看該作者
樓主,我這邊需要弄一個二維碼顯示的東西。需要開發。請問有沒有時間和興趣
回復

使用道具 舉報

6#
ID:435174 發表于 2020-11-16 20:12 | 只看該作者
易活小乙 發表于 2020-11-13 11:23
樓主,我這邊需要弄一個二維碼顯示的東西。需要開發。請問有沒有時間和興趣

我沒時間哦,你QQ掃碼上面最后一張圖片右邊那個二維碼,進群找高手,那個是二維碼討論群,里面大佬非常多,源代碼和顯示的參考方法就是里面的群主分享的。
回復

使用道具 舉報

7#
ID:667992 發表于 2020-11-18 16:23 | 只看該作者
爐石 發表于 2020-11-5 15:22
樓主,我想問問 如果將 二維碼的數據通過熱敏打印機輸出需要如何做?
不知道你有么有頭緒,我自己寫的輸出 ...

c++我不懂,如果用c#可以在VSIDE用QR控件生成流數據加載到picture控件,然后保存為JPG供打印,我這個完全是windows操作思路,估計不是你的需求
回復

使用道具 舉報

8#
ID:710888 發表于 2020-11-20 07:54 | 只看該作者
收藏,有空看下
回復

使用道具 舉報

9#
ID:965054 發表于 2021-9-9 13:30 | 只看該作者
請問大神 OLED_Fill2()是什么函數?
回復

使用道具 舉報

10#
ID:430492 發表于 2021-9-9 17:12 | 只看該作者
感謝樓主分享,收藏,有空看下
回復

使用道具 舉報

11#
ID:830316 發表于 2022-3-31 10:15 | 只看該作者
大佬,你的調試器和燒錄方式是?
回復

使用道具 舉報

12#
ID:1019980 發表于 2022-4-20 11:29 | 只看該作者
正在研究二維碼顯示
回復

使用道具 舉報

13#
ID:203661 發表于 2022-5-16 16:48 | 只看該作者

感謝樓主分享,
正在研究二維碼顯示
回復

使用道具 舉報

14#
ID:581552 發表于 2022-9-13 17:07 | 只看該作者
有個項目需要用這個,也是OLED屏幕,剛好合適,下載來學習學習
回復

使用道具 舉報

15#
ID:970487 發表于 2022-10-19 09:00 | 只看該作者
好玩,樓主會玩
回復

使用道具 舉報

16#
ID:163817 發表于 2022-11-4 23:51 | 只看該作者
謝謝樓主分享。正好想搞這個。。
回復

使用道具 舉報

17#
ID:1133587 發表于 2024-10-15 13:59 | 只看該作者
爐石 發表于 2020-11-5 15:22
樓主,我想問問 如果將 二維碼的數據通過熱敏打印機輸出需要如何做?
不知道你有么有頭緒,我自己寫的輸出 ...

怎么解決的
回復

使用道具 舉報

18#
ID:169559 發表于 2024-10-16 06:51 | 只看該作者
這個挺有意思的,下一個學習一下
回復

使用道具 舉報

19#
ID:673612 發表于 2024-10-24 20:54 | 只看該作者
非常 好的教程。正是我需要的。感謝。不過我還差3個幣才能下載。。。
回復

使用道具 舉報

20#
ID:673612 發表于 2024-10-28 16:36 | 只看該作者
   if(m_byModuleData[j] == 1)
                                {
                                        OLED_Fill2(pos_X,pos_Y,pos_X+exp,pos_Y+exp,point);//畫矩形并填充
                                }
                                if(m_byModuleData[j] == 0)
                                {
                                        OLED_Fill2(pos_X,pos_Y,pos_X+exp,pos_Y+exp,1-point);//清空矩形區域
                                }


以上這段中,  if(m_byModuleData[j] == 1)  是錯誤的,
原因:m_byModuleData【i】[j] 是個二維數組,

所以應該更正為:  if(m_byModuleData[i] [j] == 1)  
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美精品久久久久久久久久 | 黄色免费三级 | 欧美一区二区三区精品 | 国产美女h视频 | 亚洲综合资源 | 精品亚洲一区二区三区 | 久久高潮| 亚洲综合字幕 | 欧美精品中文字幕久久二区 | 欧美成人精品 | a级毛片基地 | 综合国产 | 欧美日韩综合 | 精品1区| 欧美成人精品在线观看 | 国产免费一区二区 | 国产一极毛片 | 狠狠色狠狠色综合日日92 | 中文字幕1区 | 国产福利在线 | 天天激情综合 | 国产欧美在线播放 | 国产精品日本一区二区不卡视频 | 在线一区 | 国产午夜精品一区二区三区在线观看 | 成人免费视频 | 久久99网| aaaa日韩| 亚洲精品国产偷自在线观看 | 中文字幕精品一区二区三区在线 | 天天干狠狠操 | 国产国产精品 | 国产区久久 | 天天操综合网站 | 成人超碰 | 99国产视频 | 国产精品亚洲成在人线 | 九九九久久国产免费 | 艹逼网| 伊人伊人 | av在线天堂网 |