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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 11413|回復: 13
收起左側

STM8S st7565-LCD12864 USB電壓電流表PCB與單片機源程序

  [復制鏈接]
ID:379340 發表于 2018-7-26 11:29 | 顯示全部樓層 |閱讀模式
STM8S003F3P6 LCD12864USB電壓電流表

之前看到sabaka發的帖子“STM8S003F3表頭自校準版”,正好在 學習STM8S003F3P6,加上之前手頭有廢棄的U,已參考網上帖子成功點亮其中的ST7565 12864LCD屏,就 想著利用這12864屏來做這個USB電壓電流表。原帖采用1602顯示,經過一番摸索改寫ST7565驅動,略微調整源程序,終于完成了這個試驗品。
先上圖。正面:
背面:
點亮:
帶個USB小臺燈:
改變小臺燈亮度:
使用的(中間長條型的)
拆開的樣子:排線印字FPC11289B-V0.3

試驗品考慮不周,PCB切割飛線,STM8調試接口也沒預留,帶來很多麻煩,LCD屏接口線也只好飛線連接。下面提供經修改改善的PCB工程和IAR源程序工程供大家參考。程序中電量統計只畫了界面,計算部分未加入。
電路圖:
PCB:打算12864LCD屏單獨一層PCB,2層疊放,有空再做一個。

附件:


另手頭還有2種,屏幕都不一樣,其中一種背光與屏幕一體的,排線印字12864-898  A4-A, FPC-9的接口,只用到7根線,適合做個模塊使用。
根據原電路大致測出接口如下,也不知道對不對。
1、9空,2、3接背光LED,7接3.3V電源,8接GND,4、5、6接MCU,功能不明。LCD控制IC不明,猜測是否也是ST7565?三線SPI模式?              期待高手搞定

Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
0.png 0.png

單片機源程序如下:
  1. #include <iostm8s103f2.h>
  2. #include "ST7565_12864.h"
  3. #include "ziku.h"
  4. #define uchar  unsigned char
  5. #define uint   unsigned int
  6. #define KEY PA_IDR_IDR3    //PA 的第3位做KEY

  7. void EEP_Init(void)  //EEPROM初始化        
  8. {
  9.   FLASH_CR1  = 0x00;
  10.   FLASH_CR2  = 0x00;
  11.   FLASH_NCR2 = 0xFF;
  12.   FLASH_DUKR = 0xae;          //寫入第一個秘鑰
  13.   FLASH_DUKR = 0x56;          //寫入第二個秘鑰
  14.   while(!(FLASH_IAPSR&0x08)); //等待就緒
  15. }
  16. void EEP_W(uchar addr,float data) //寫EEPROM
  17. {
  18.   float *p;
  19.   p=(float *)(0x4000+addr);
  20.   *p=data;
  21.   while(!(FLASH_IAPSR&0x04)); //等待完成
  22. }
  23. float EEP_R(uchar addr)  //讀EEPROM
  24. {
  25.   float *p;
  26.   p=(float *)(0x4000+addr);
  27.   return *p;
  28. }

  29. void Hellow(void)     //初始屏幕
  30. {
  31.     ClearScreen();    //清除屏幕
  32.     DisplayFont(2, 8+4, FONT_8X16,19);  //U
  33.     DisplayFont(2, 16+4, FONT_8X16,17); //S
  34.     DisplayFont(2, 24+4, FONT_8X16,14); //B
  35.     DisplayFont(2, 32+4, FONT_16X16,0);//電
  36.     DisplayFont(2, 48+4, FONT_16X16,1);//壓
  37.     DisplayFont(2, 64+4, FONT_16X16,0);//電
  38.     DisplayFont(2, 80+4, FONT_16X16,2);//流
  39.     DisplayFont(2, 96+4, FONT_16X16,3);//表
  40.     DisplayFont(5, 40+4, FONT_16X16,9);//丑
  41.     DisplayFont(5, 56+4, FONT_16X16,10);//孩
  42. }

  43. void ADC_Init(void)
  44. {
  45.     ADC_CR1  = 0x20;       //分頻系數為4 單次轉換模式 先不啟動ADC轉換      
  46.     ADC_CR2  = 0x00;       //非外部觸發  數據左對齊   禁止掃描模式   
  47.     ADC_CSR  = 0x03;       //禁止轉換結束中斷 設置轉換通道為AIN3
  48.     ADC_TDRL|= 0x60;      //禁止AIN5AIN6施密特觸發器功能  
  49. }


  50. uint Get_Adc(uchar ac)           //獲取adc值
  51. {
  52.         uint Value;
  53.         ADC_CSR  = ac;                 //選擇通道
  54.     ADC_CR1 |= 0x01;       //第一次寫1是從低功耗模式喚醒
  55.         ADC_CSR &= ~0x80;              //清除轉換標志
  56.         ADC_CR1 |= 0x01;               //開始轉換
  57.         while(!(0x80&ADC_CSR));        //等待轉換完成
  58.         Value  = (uint) ADC_DRH;       //取高8位
  59.         Value  = Value<<2;             //左移兩位
  60.         Value += ADC_DRL;              //取低兩位
  61.         return(Value);                 //返回adc值
  62. }
  63. float Ad_Av(uchar ac)       //采樣400次求平均
  64. {
  65.         float Val_Av=0;                     
  66.         uint num;                           
  67.         for(num=0;num<400;num++)  
  68.         {
  69.                 Val_Av += Get_Adc(ac);               
  70.         }
  71.         Val_Av = Val_Av/400;                    
  72.         return(Val_Av);                       
  73. }


  74. void Write_Lcd0(void)    //固定顯示底板發去LCD
  75. {
  76.     DisplayFont(0, 8+4, FONT_16X16,0);    //電
  77.     DisplayFont(0, 24+4, FONT_16X16,1);   //壓
  78.     DisplayFont(0, 40+4, FONT_8X16,12);   //:
  79.     DisplayFont(0, 112+4, FONT_8X16,20);  //V
  80.     DisplayFont(2, 8+4, FONT_16X16,0);    //電
  81.     DisplayFont(2, 24+4, FONT_16X16,2);   //流
  82.     DisplayFont(2, 40+4, FONT_8X16,12);   //:
  83.     DisplayFont(2, 112+4, FONT_8X16,13);  //A
  84.     DisplayFont(4, 8+4, FONT_16X16,4);    //功
  85.     DisplayFont(4, 24+4, FONT_16X16,5);   //率  
  86.     DisplayFont(4, 40+4, FONT_8X16,12);   //:
  87.     DisplayFont(4, 104+4, FONT_16X16,11);  //W
  88.     DisplayFont(6, 8+4, FONT_16X16,14);    //容
  89.     DisplayFont(6, 24+4, FONT_16X16,15);   //量
  90.     DisplayFont(6, 40+4, FONT_8X16,12);   //:
  91.     DisplayFont(6, 96+4, FONT_8X16,22);  //m
  92.     DisplayFont(6, 104+4, FONT_8X16,13);  //A
  93.     DisplayFont(6, 112+4, FONT_8X16,15);  //H
  94. //    DisplayFont(6, 104+4, FONT_16X16,12);  //Ω
  95. }
  96.    
  97. void Write_Lcd1(int ad,uchar xl,uchar yl)//把電壓電阻功率發去LCD,ad采集數值,xl yl顯示位置
  98. {
  99.         if(ad/1000>=1)                         //電壓如果不足10V,就把1位顯示為空
  100.         {
  101.         DisplayFont(xl,yl+4, FONT_8X16,ad/1000);      //十位
  102.     }
  103.     else  DisplayFont(xl,yl+4,FONT_8X16,10);         //空格
  104.         DisplayFont(xl,yl+8+4, FONT_8X16,(ad%1000)/100);  //個位
  105.         DisplayFont(xl,yl+16+4, FONT_8X16,11);           //"."小數點
  106.         DisplayFont(xl,yl+24+4, FONT_8X16,ad%100/10);    //十分位
  107.         DisplayFont(xl,yl+32+4, FONT_8X16,ad%10);        //百分位
  108. }

  109. void Write_Lcd2(int ad,uchar xl,uchar yl) //把電流值發去LCD
  110. {
  111.     DisplayFont(xl,yl+4, FONT_8X16,ad/1000);       //個位
  112.     DisplayFont(xl,yl+8+4, FONT_8X16,11);           //"."小數點
  113.     DisplayFont(xl,yl+16+4, FONT_8X16,ad%1000/100);  //十分位
  114.     DisplayFont(xl,yl+24+4, FONT_8X16,ad%100/10);    //百分位
  115.     DisplayFont(xl,yl+32+4, FONT_8X16,ad%10);          //千分位
  116. }

  117. void Write_Lcd3(int ad,uchar xl,uchar yl) //把容量值發去LCD
  118. {
  119.     DisplayFont(xl,yl+4, FONT_8X16,ad/10000);       //萬位
  120.     DisplayFont(xl,yl+8+4, FONT_8X16,ad%10000/1000); //千位
  121.     DisplayFont(xl,yl+16+4, FONT_8X16,ad%1000/100);  //百位
  122.     DisplayFont(xl,yl+24+4, FONT_8X16,ad%100/10);    //十位
  123.     DisplayFont(xl,yl+32+4, FONT_8X16,ad%10);          //個位
  124. }




  125. void Correct(void)         //校準
  126. {
  127.         float V2,Iov,I1,I2,I3,AIN7;
  128.         uchar a,flag;
  129.     ClearScreen();    //清除屏幕
  130.     DisplayFont(1, 48+4, FONT_16X16,7);    //校
  131.     DisplayFont(1, 64+4, FONT_16X16,8);   //準
  132.     DisplayFont(4, 8+4, FONT_8X16,16);   //I
  133.     DisplayFont(4, 16+4, FONT_8X16,23);  //n
  134.     DisplayFont(4, 24+4, FONT_8X16,24);   //p
  135.     DisplayFont(4, 32+4, FONT_8X16,26);  //u
  136.     DisplayFont(4, 40+4, FONT_8X16,25);  //t
  137.     DisplayFont(4, 48+4, FONT_8X16,12);   //:
  138.    
  139.     DisplayFont(4, 64+4, FONT_8X16,10);   //空格
  140.     DisplayFont(4, 72+4, FONT_8X16,10);   //空格
  141.     DisplayFont(4, 80+4, FONT_8X16,10);  //空格
  142.     DisplayFont(4, 88+4, FONT_8X16,5);  //5
  143.     DisplayFont(4, 96+4, FONT_8X16,10);   //空格
  144.     DisplayFont(4, 104+4, FONT_8X16,20);   //V

  145.     Delay(40);               
  146.         flag=1;
  147.         while(flag)
  148.   {
  149.                 if(!KEY)
  150.           {
  151.                         Delay1(20);
  152.                         if(KEY)
  153.                         {
  154.                           AIN7 = Ad_Av(7);     //取得基準的ADC數值
  155.                     V2   = Ad_Av(5);         //取得校準電壓的ADC數值
  156.                           V2   = V2*10/AIN7;   //????
  157. //                          V2   = V2/AIN7;   //????
  158.                           EEP_W(0x04,V2);
  159.               flag = 0;
  160.                         }
  161.           }
  162.         }
  163.   for(a=0;a<16;a++)
  164.         {
  165.         DisplayFont(4, 64+4, FONT_8X16,10);   //空格
  166.         DisplayFont(4, 72+4, FONT_8X16,10);   //空格
  167.         DisplayFont(4, 80+4, FONT_8X16,10);  //空格
  168.         DisplayFont(4, 88+4, FONT_8X16,0);  //0
  169.         DisplayFont(4, 96+4, FONT_8X16,22);   //m
  170.         DisplayFont(4, 104+4, FONT_8X16,13);   //A
  171.                 Delay(40);               
  172.         }
  173.         flag=1;
  174.         while(flag)
  175.   {
  176.                 if(!KEY)
  177.           {
  178.                         Delay1(20);
  179.                         if(KEY)
  180.                         {
  181.                     Iov  = Ad_Av(6);
  182.                                 EEP_W(0x10,Iov);
  183.               flag = 0;
  184.                         }
  185.           }
  186.         }
  187.   for(a=0;a<16;a++)
  188.         {
  189.         DisplayFont(4, 64+4, FONT_8X16,10);   //空格
  190.         DisplayFont(4, 72+4, FONT_8X16,1);   //1
  191.         DisplayFont(4, 80+4, FONT_8X16,0);  //0
  192.         DisplayFont(4, 88+4, FONT_8X16,0);  //0
  193.         DisplayFont(4, 96+4, FONT_8X16,22);   //m
  194.         DisplayFont(4, 104+4, FONT_8X16,13);   //A
  195.                 Delay(40);               
  196.         }
  197.         flag=1;
  198.         while(flag)
  199.   {
  200.                 if(!KEY)
  201.           {
  202.                         Delay1(20);
  203.                         if(KEY)
  204.                         {
  205.                           AIN7 = Ad_Av(7);
  206.                     I1   = Ad_Av(6);
  207.                           I1   = (I1-Iov)/AIN7;
  208.                           EEP_W(0x08,I1);
  209.               flag = 0;
  210.                         }
  211.           }
  212.         }
  213.   for(a=0;a<16;a++)
  214.         {
  215.         DisplayFont(4, 64+4, FONT_8X16,1);   //1
  216.         DisplayFont(4, 72+4, FONT_8X16,0);   //0
  217.         DisplayFont(4, 80+4, FONT_8X16,0);  //0
  218.         DisplayFont(4, 88+4, FONT_8X16,0);  //0
  219.         DisplayFont(4, 96+4, FONT_8X16,22);   //m
  220.         DisplayFont(4, 104+4, FONT_8X16,13);   //A
  221.                 Delay(40);               
  222.         }
  223.         flag=1;
  224.         while(flag)
  225.   {
  226.                 if(!KEY)
  227.           {
  228.                         Delay1(20);
  229.                         if(KEY)
  230.                         {
  231.                           AIN7 = Ad_Av(7);
  232.                     I2   = Ad_Av(6);
  233.                           I2   = (I2-Iov)/AIN7;
  234.                           EEP_W(0x0c,I2);
  235.               flag = 0;
  236.                         }
  237.           }
  238.         }
  239.   for(a=0;a<16;a++)
  240.         {
  241.         DisplayFont(4, 64+4, FONT_8X16,3);   //3
  242.         DisplayFont(4, 72+4, FONT_8X16,0);   //0
  243.         DisplayFont(4, 80+4, FONT_8X16,0);  //0
  244.         DisplayFont(4, 88+4, FONT_8X16,0);  //0
  245.         DisplayFont(4, 96+4, FONT_8X16,22);   //m
  246.         DisplayFont(4, 104+4, FONT_8X16,13);   //A
  247.                 Delay(40);               
  248.         }
  249.         flag=1;
  250.         while(flag)
  251.   {
  252.                 if(!KEY)
  253.           {
  254.                         Delay1(20);
  255.                         if(KEY)
  256.                         {
  257.                           AIN7 = Ad_Av(7);
  258.                     I3   = Ad_Av(6);
  259.                           I3   = (I3-Iov)/AIN7;
  260.                           EEP_W(0x14,I3);
  261.               flag = 0;
  262.                         }
  263.           }
  264.         }
  265. }
  266. void main() //主函數
  267. {
  268.         float V,V2,I,I1,I2,I3,Iov,AIN7,R,W;
  269.         CLK_CKDIVR=0x00;
  270.         //Delay(1000);
  271.         GPIO_Init();
  272.     ADC_Init();
  273.         EEP_Init();
  274.         Lcd_Init();
  275.         Hellow();
  276.         Delay1(800);
  277.         while(!KEY)
  278.         {
  279.                 Delay1(10);
  280.                 if(KEY)
  281.         Correct();
  282.     }
  283.         V2  = EEP_R(0x04);      //對應5V
  284.         I1  = EEP_R(0x08);      //對應100MA  電流校正值
  285.         I2  = EEP_R(0x0c);      //對應1000MA   電流校正值
  286.         Iov = EEP_R(0x10);      //對應0MA  電流校正值
  287.         I3  = EEP_R(0x14);      //對應3000MA   電流校正值
  288.     ClearScreen();    //清除屏幕
  289.         while(1)
  290.         {
  291.         Write_Lcd0();                 //顯示固定底版
  292.         AIN7 = Ad_Av(7);              //通道7為內部參考電壓
  293.                    I = Ad_Av(6);               //通道6電流采樣
  294.                    V = Ad_Av(5);                                 //通道5電壓采樣
  295.                 if(V>1)
  296.                 {
  297.             V = V/AIN7/V2*5069;          //5V校正時輸入5.069V
  298.                 }
  299.                 else
  300.                 {
  301.                         V = 0;
  302.                 }
  303.                 if((I-Iov)>0 & (I/AIN7)<=I1*2)        //計算電流
  304.             I = (I-Iov)/AIN7/I1*100;
  305.                 else if((I/AIN7)>I1*2 & (I/AIN7)<=I2*2)
  306.                     I = (I-Iov)/AIN7/I2*1000;
  307.                 else
  308.                     I = (I-Iov)/AIN7/I3*3000;
  309.                 R = V/I;                 //計算電阻
  310.                 W = V*I/1000;       //計算功率
  311.                 Delay1(5);
  312.                 Write_Lcd1((int)V,0,56);    //寫入電壓
  313.                 Write_Lcd2((int)I,2,64);    //電流
  314. /*
  315.                 if(I<1)
  316.                 {
  317.                         Write_Lcd1(0,4,64);      //寫入電阻
  318.                 }
  319.                 else
  320.                 {
  321.                         Write_Lcd1((int)R,4,64); //電阻。
  322.                 }
  323. */
  324.                 Write_Lcd1((int)W,4,56);    //功率
  325.                 Write_Lcd3(0,6,56);         //容量
  326.                 Delay1(400);
  327.     }
  328. }
復制代碼
0.png
所有資料51hei提供下載:
STM8S st7565-12864 USB電壓電流表源程序及PCB工程.zip (3.29 MB, 下載次數: 210)

評分

參與人數 2黑幣 +62 收起 理由
YJGG + 12 很給力!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:98767 發表于 2018-7-26 18:13 | 顯示全部樓層
不錯,對著做個試下
回復

使用道具 舉報

ID:239055 發表于 2018-10-11 06:40 來自手機 | 顯示全部樓層
請問下,電壓電流的量程各是多少?還有精度怎么樣?
回復

使用道具 舉報

ID:378605 發表于 2018-10-11 19:54 | 顯示全部樓層
回復

使用道具 舉報

ID:239055 發表于 2018-10-17 11:29 來自手機 | 顯示全部樓層
我也要問下精度和量程多少
回復

使用道具 舉報

ID:239055 發表于 2018-11-18 20:14 來自手機 | 顯示全部樓層
請問下stm8這芯片怎么編譯程序以及燒寫?可以幫我編譯一份軟件不?謝了
回復

使用道具 舉報

ID:433321 發表于 2018-11-26 11:51 | 顯示全部樓層
這芯片里面的HEX數據可以直接讀取出來嗎
回復

使用道具 舉報

ID:471797 發表于 2019-1-23 19:09 | 顯示全部樓層
請問這個電流是雙相的還是單相的
回復

使用道具 舉報

ID:675521 發表于 2020-3-29 19:34 | 顯示全部樓層

留一個記號,備用。
回復

使用道具 舉報

ID:65297 發表于 2020-3-30 14:54 | 顯示全部樓層
謝謝分享,最近也在學習STM8
回復

使用道具 舉報

ID:57411 發表于 2020-8-10 16:10 | 顯示全部樓層
謝謝分享,最近在學習7565驅動。
回復

使用道具 舉報

ID:337139 發表于 2020-10-21 17:47 | 顯示全部樓層
這個驅動寫得很好的。
回復

使用道具 舉報

ID:960224 發表于 2021-8-12 17:40 | 顯示全部樓層
很厲害的發明,敬佩
回復

使用道具 舉報

ID:523221 發表于 2021-10-29 14:35 | 顯示全部樓層
你好,可以解析一下LM358的電路嗎?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91社影院在线观看 | 免费在线观看黄色av | 欧美videosex性极品hd | 国产综合精品一区二区三区 | 午夜黄色 | 免费一级淫片aaa片毛片a级 | 欧美色性| 嫩草91在线| 日韩欧美在线播放 | 久久久婷婷 | 91操操操| 国产精品国产精品国产专区不片 | 狠狠亚洲 | 一级做受毛片免费大片 | 亚洲精品乱码久久久久久按摩 | 韩国精品一区二区三区 | 在线观看免费av网 | 毛片免费在线观看 | 日产精品久久久一区二区福利 | 欧美一区二区三区在线 | 九色91视频 | 日本一区二区三区免费观看 | 国产亚洲久 | 久久久久亚洲 | 三级欧美| 欧美日韩不卡 | 麻豆精品久久 | 亚洲精品国产成人 | 欧美日韩国产高清 | 久久久久久国产 | 国产特一级黄色片 | 久久精品在线 | 久久精品视频网站 | 精品亚洲一区二区三区 | 国产精品区一区二区三 | 国产资源网 | 91视频在线 | 国内精品一区二区 | 久久99精品国产自在现线小黄鸭 | 欧美日韩国产精品一区二区 | 成人精品视频在线 |