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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9742|回復: 10
收起左側

單片機+TLC549 AD采樣LCD12864顯示的仿真與程序源碼

[復制鏈接]
ID:305196 發表于 2018-5-4 09:08 | 顯示全部樓層 |閱讀模式
本帖最后由 destiny_xl 于 2018-6-2 13:49 編輯


AD采樣顯示(TLC549+LCD12864)

大家好,第一次發帖,本來準備早點發的,但是有個程序bug調了幾天都沒有解決,因為快畢業啦,手頭許多硬件都賣啦。然后無意間在51黑電子論壇看到個帶字庫的LCD12864,有點感興趣,順便用了一款8位的串行接口采用逐次逼近型的A/D轉換器TLC549,合在一起做了一個AD實時采樣電壓并用LCD12864顯示的電路,整體圖如下圖所示,因為縮放的太小啦,LCD12864的字符無法顯示,無奈屏幕不夠大,講究看下把。


TLC549進行AD轉換用LCD12864顯示

TLC549進行AD轉換用LCD12864顯示

圖1 TLC549進行AD轉換用LCD12864顯示

下面我簡單地來介紹一下,代碼部分注釋的也比較詳細,我只簡單地說下原理,具體的還得看datesheet搞懂原理和時序,編寫程序才能得心應手。因為時間關系,很多代碼也是基于別人基礎上改的,我主要解決的問題是讓LCD12864能顯示數字。大家可能覺得很奇怪,LCD12864本來就可以顯示數字啊,但是有時候手頭沒硬件,又急需測試下自己的LCD12864能否正常工作,proteus沒有找到帶字庫的LCD12864。但是論壇有個人分享了一個LCD12864的庫,我按照他的方法真的可以實現在proteus仿真LCD12864,具體操作方法請看帖子:使用proteus中12864液晶再也不用擔心沒有字庫了?,我在這里就不詳述了。


大家也像我迫不及待的裝好LCD12864的庫之后,發現不能顯示數字、英文符號和英文標點,同時測試的時候發現,有些復雜的漢字也無法顯示。畢竟字符種類太多,也沒有辦法全部一一封裝進去。意外發現有個數字帶圈的特殊字符可以顯示,然后就到網上收集,發現可以完全支持我的實驗需要的字符,分享給大家◎①②③④⑤⑥⑦⑧⑨⊙Ⅴ,值得一題的是,是中文的數字5,不是英文的V,前者是漢字2個字符,后者是英文1個字符。


顯示字符

顯示字符

圖2 顯示字符


東西都齊啦,就開始編寫程序啦,C語言也很久沒學啦,對于字符的處理費了很大一部分時間,不過終于寫好了,就是程序中的字符轉換函數

bitchange,這個函數的功能主要是將英文的字符轉換成帶圈的中文字符,原理就是把一個字節的字符轉換成2個字符,具體的大家分析下程序就可以看
懂,利用了一個strcpy復制函數,包含在string.h的頭文件中。


程序的大致流程是首先我們通過AD采樣,將采樣的數據進行簡單的補償后儲存,然后調用LCD12864顯示模塊進行顯示。期間一直有個問題,調了幾天還是沒有解決,開始都是分開調的,后面發現聯調的時候這個bug又消失啦,所以大家還是有硬件的最好測試喜愛,順便告訴下我。TLC549的處理模塊,比較簡單,按照時序進行移位儲存即可,bug的原因出現在LCD12864中,就是我加上Ⅴ字符后程序顯示有問題,去掉這個字符顯示一切正常,問題的截圖和去掉當我把b[n]=zf[22];b[n+1]=zf[23];兩條語句去掉后的結果如下圖所示。


顯示異常結果.png

圖3 顯示異常結果  


去掉Ⅴ的顯示結果.png

                                      圖4 去掉Ⅴ之后的顯示結果


我初步估計可能有兩個原因,一是我的字符轉換函數bitchange有問題,但是我VC6.0編譯通過才拿來用的,可能還是有什么隱藏的bug;二是那個LCD12864的bug,希望和大家一起討論,共同進步,教程就到這里,代碼如下。

  1. #include <reg51.h>
  2. #include <stdio.h> //sprintf函數包含庫
  3. #include <intrins.h>
  4. #include <string.h> //strcpy函數包含庫
  5. #define uchar unsigned char
  6. #define uint  unsigned int
  7. #define LCD_data  P0             //數據口
  8. #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};

  9. //LCD型號:TS12864A-3(帶漢字庫) 控制器ST7920
  10. sbit LCD_RS = P2^0; //寄存器選擇輸入
  11. sbit LCD_RW = P2^1; //液晶讀/寫控制
  12. sbit LCD_EN = P2^2; //液晶使能控制
  13. sbit LCD_PSB= P2^3; //串/并方式控制

  14. //TLC549端口定義
  15. sbit DIO=P3^5; //數據線
  16. sbit CS=P3^6;        //片選
  17. sbit CLK=P3^4; //io口時鐘

  18. //proteus的帶字庫LCD12864不支持數字、英文符號和英文標點
  19. //顯示字符:◎①②③④⑤⑥⑦⑧⑨⊙Ⅴ
  20. uchar code dis1[]="電壓值:";
  21. uchar code zf[]="◎①②③④⑤⑥⑦⑧⑨⊙Ⅴ";
  22. uchar a[14]; //直接給數組a賦值,會出現V.34V,就是第一個字符被吞并,沒實物測試,不知道原因,希望有硬件的幫忙測試下^_^

  23. void bitchange(uchar c[]) //字符轉換函數
  24. {
  25.         uchar i,m=0,n=0,b[14];
  26.         for(i=0;c[i]!='\0';i++,n+=2)
  27.         {
  28.                 if(c[i]!='.')
  29.                 {
  30.                         m=c[i]-48;
  31.                         b[n]=zf[m*2];
  32.                         b[n+1]=zf[m*2+1];
  33.                 }
  34.                 else
  35.                 {
  36.                         b[n]=zf[20];
  37.                         b[n+1]=zf[21];
  38.                 }
  39.         }
  40.         b[n]=zf[22];
  41.         b[n+1]=zf[23];
  42.         b[n+2]='\0';
  43.         strcpy(c,b);
  44. }

  45. void delay(int ms) //延時函數
  46. {
  47.     while(ms--)
  48.         {
  49.       uchar i;
  50.           for(i=0;i<250;i++)  
  51.            {
  52.                         _nop_();                           
  53.                         _nop_();
  54.                         _nop_();
  55.                         _nop_();
  56.            }
  57.         }
  58. }               

  59. bit lcd_busy() //檢查LCD忙狀態,lcd_busy為1時,忙,等待;lcd-busy為0時,閑,可寫指令與數據。
  60. {                          
  61.     bit result;
  62.     LCD_RS=0;
  63.     LCD_RW=1;
  64.     LCD_EN=1;
  65.     delayNOP();
  66.     result=(bit)(P0&0x80); //強制取最高位P0.7的狀態
  67.     LCD_EN=0;
  68.     return(result);
  69. }

  70. void lcd_wcmd(uchar cmd) //寫指令數據到LCD,RS=L,RW=L,E=高脈沖,D0-D7=指令碼。
  71. {                          
  72.    while(lcd_busy());
  73.     LCD_RS=0;
  74.     LCD_RW=0;
  75.     LCD_EN=0;
  76.     _nop_();
  77.     _nop_();
  78.     P0=cmd;
  79.     delayNOP();
  80.     LCD_EN=1;
  81.     delayNOP();
  82.     LCD_EN=0;  
  83. }

  84. void lcd_wdat(uchar dat) //寫顯示數據到LCD,RS=H,RW=L,E=高脈沖,D0-D7=數據。
  85. {                          
  86.    while(lcd_busy());
  87.     LCD_RS=1;
  88.     LCD_RW=0;
  89.     LCD_EN=0;
  90.     P0=dat;
  91.     delayNOP();
  92.     LCD_EN=1;
  93.     delayNOP();
  94.     LCD_EN=0;
  95. }

  96. void lcd_pos(uchar X,uchar Y) //設定顯示位置
  97. {                          
  98.    uchar  pos;
  99.    if (X==0)
  100.      {X=0x80;}
  101.    else if (X==1)
  102.      {X=0x90;}
  103.    else if (X==2)
  104.      {X=0x88;}
  105.    else if (X==3)
  106.      {X=0x98;}
  107.    pos=X+Y ;  
  108.    lcd_wcmd(pos); //顯示地址
  109. }

  110. void lcd_init() //LCD初始化設定
  111. {

  112.     LCD_PSB=1; //并口方式
  113.     lcd_wcmd(0x30); //基本指令操作
  114.     delay(5);
  115.     lcd_wcmd(0x0C); //顯示開,關光標
  116.     delay(5);
  117.     lcd_wcmd(0x01); //清除LCD的顯示內容
  118.     delay(5);
  119. }

  120. uint TLC549_AD() //TLC549處理
  121. {
  122.         uchar i;
  123.         uint data_ad=0;
  124.         CS=1; //初始化,啟動
  125.         CLK=0;
  126.         DIO=1;
  127.         CS=0;
  128.         _nop_();                    
  129.         for(i=0;i<8;i++) //讀取采集數據,讀取的是上一次采集數據
  130.         {
  131.                 CLK=1;         
  132.                 if(DIO)data_ad|=0x01;
  133.                 CLK=0;  
  134.                 data_ad<<=1;  
  135.         }         
  136.         CS=1;
  137.         data_ad=data_ad*(500/256)+0.5; //0.5V進行四舍五入補償
  138.         return(data_ad);
  139. }

  140. void main()
  141. {
  142.     uchar i;
  143.         float AD_convert;
  144.         uchar AD1=35;
  145.     delay(10); //延時
  146.     lcd_init(); //初始化LCD      
  147.         while(1)
  148.         {
  149.             AD_convert=TLC549_AD()/100.0;
  150.         sprintf(a, "%.2f", AD_convert); //將轉換結果轉換成字符
  151.         i=0;
  152.             lcd_pos(1,0);             //設置顯示位置為第一行的第1個字符
  153.             while(dis1[i] != '\0')
  154.              {                         //顯示“電壓值:”
  155.                lcd_wdat(dis1[i]);
  156.                i++;
  157.              }
  158.                 i=0;
  159.             lcd_pos(2,3);             //設置顯示位置為第二行的第3個字符
  160.                 bitchange(a);
  161.             while(a[i] != '\0')
  162.              {                         //顯示采集的電壓值
  163.                lcd_wdat(a[i]);
  164.                    i++;
  165.              }
  166.          }   
  167. }

復制代碼

來張成功的圖片,老臉一紅。


AD采樣并用LCD12864顯示.png

圖5 顯示結果


還有壓縮包的內容,有寫好的程序和仿真,還有把LCD12864的程序分割出來啦,bug就出現啦。


程序與仿真.png

圖6 程序與仿真






AD采樣顯示(TLC549+LCD12864).zip

443.56 KB, 下載次數: 136, 下載積分: 黑幣 -5

全部代碼和程序

評分

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

查看全部評分

回復

使用道具 舉報

ID:305196 發表于 2018-5-4 09:44 | 顯示全部樓層
哎呀,格式一直用不好,出現各種問題,感覺好無奈。
回復

使用道具 舉報

ID:1 發表于 2018-5-4 16:48 | 顯示全部樓層
destiny_xl 發表于 2018-5-4 09:44
哎呀,格式一直用不好,出現各種問題,感覺好無奈。

格式還可以,資料也不錯 謝謝分享,編輯一下,有一個未使用附件 使用即可
回復

使用道具 舉報

ID:305196 發表于 2018-5-5 20:12 | 顯示全部樓層
admin 發表于 2018-5-4 16:48
格式還可以,資料也不錯 謝謝分享,編輯一下,有一個未使用附件 使用即可

我是準備上傳附件的,但是點了上傳不了,在試試
回復

使用道具 舉報

ID:305196 發表于 2018-10-23 10:36 | 顯示全部樓層
真是巧,最近要用LCD12864,原來12864還有多種規格啊,這個12864-S自帶對比度調節,不用焊接電位器了,還有并串口模式,今天檢測了下以前寫的一個程序,發現是同樣的問題, 實物顯示亂碼.jpg 開始以為是proteus中12864庫的問題,最后檢查程序發現,是while一直循環有問題,改成放到最后while(1); 程序修改.png 就可以啦,仿真和實物都可以通過。
仿真正常顯示 .png 實物正常顯示 _1.jpg 實物正常顯示 _2.jpg

回復

使用道具 舉報

ID:76408 發表于 2019-3-13 09:10 | 顯示全部樓層
謝謝樓主,收藏了。
回復

使用道具 舉報

ID:408974 發表于 2019-3-17 11:47 | 顯示全部樓層
在仿真軟件中沒有自帶的LCD12864要自己去下載嗎?
回復

使用道具 舉報

ID:408974 發表于 2019-3-17 11:48 | 顯示全部樓層
成森林 發表于 2019-3-13 09:10
謝謝樓主,收藏了。

ISIS仿真軟件中沒有自帶的LCD12864怎么辦,下載這個文件打開說沒有LCD12864這個中文字庫
回復

使用道具 舉報

ID:408974 發表于 2019-3-17 12:15 | 顯示全部樓層
在ISIS仿真軟件中沒有LCD12864怎么辦
回復

使用道具 舉報

ID:512403 發表于 2019-4-23 20:46 | 顯示全部樓層
怎么顯示不一樣
回復

使用道具 舉報

ID:964308 發表于 2021-10-17 15:34 來自觸屏版 | 顯示全部樓層
gongzuoshi 發表于 2019-3-17 11:48
ISIS仿真軟件中沒有自帶的LCD12864怎么辦,下載這個文件打開說沒有LCD12864這個中文字庫

百度應該能找到
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天天干天天插 | 91视频网 | 国产成人a亚洲精品 | 青青久在线视频 | 久久人人爽人人爽 | 午夜视频免费网站 | 国产精品一区在线播放 | 国产高清在线观看 | 中文字幕在线视频一区二区三区 | 精品日韩在线观看 | 国产精品久久久久999 | www.精品国产 | 国产精品久久久久久网站 | 国产精品永久 | 成人免费一区二区三区视频网站 | 91精品在线看 | 视频二区国产 | 欧美国产精品一区二区 | 国产美女精品视频免费观看 | 日韩男人天堂 | 久久精品青青大伊人av | 亚洲成av人片在线观看 | 91亚洲精品国偷拍自产在线观看 | 天堂资源最新在线 | 日韩欧美精品一区 | 成人福利电影 | 久久久久久综合 | 日韩免费看视频 | 国产在线观看免费 | 国产精品欧美一区二区三区不卡 | 久久精品国产a三级三级三级 | 国产精品99久久久久久动医院 | 蜜桃在线一区二区三区 | 成人在线观看免费观看 | 影音先锋久久 | 污视频免费在线观看 | 免费成人在线网 | 欧美日一区二区 | 国产欧美一级二级三级在线视频 | 男女羞羞视频在线看 | 亚洲精品在线观看网站 |