標題: STM8S st7565-LCD12864 USB電壓電流表PCB與單片機源程序 [打印本頁]
作者: 18758774924 時間: 2018-7-26 11:29
標題: STM8S st7565-LCD12864 USB電壓電流表PCB與單片機源程序
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 (42.4 KB, 下載次數: 76)
下載附件
2018-7-26 16:18 上傳
0.png (53.64 KB, 下載次數: 67)
下載附件
2018-7-26 16:18 上傳
單片機源程序如下:
- #include <iostm8s103f2.h>
- #include "ST7565_12864.h"
- #include "ziku.h"
- #define uchar unsigned char
- #define uint unsigned int
- #define KEY PA_IDR_IDR3 //PA 的第3位做KEY
- void EEP_Init(void) //EEPROM初始化
- {
- FLASH_CR1 = 0x00;
- FLASH_CR2 = 0x00;
- FLASH_NCR2 = 0xFF;
- FLASH_DUKR = 0xae; //寫入第一個秘鑰
- FLASH_DUKR = 0x56; //寫入第二個秘鑰
- while(!(FLASH_IAPSR&0x08)); //等待就緒
- }
- void EEP_W(uchar addr,float data) //寫EEPROM
- {
- float *p;
- p=(float *)(0x4000+addr);
- *p=data;
- while(!(FLASH_IAPSR&0x04)); //等待完成
- }
- float EEP_R(uchar addr) //讀EEPROM
- {
- float *p;
- p=(float *)(0x4000+addr);
- return *p;
- }
- void Hellow(void) //初始屏幕
- {
- ClearScreen(); //清除屏幕
- DisplayFont(2, 8+4, FONT_8X16,19); //U
- DisplayFont(2, 16+4, FONT_8X16,17); //S
- DisplayFont(2, 24+4, FONT_8X16,14); //B
- DisplayFont(2, 32+4, FONT_16X16,0);//電
- DisplayFont(2, 48+4, FONT_16X16,1);//壓
- DisplayFont(2, 64+4, FONT_16X16,0);//電
- DisplayFont(2, 80+4, FONT_16X16,2);//流
- DisplayFont(2, 96+4, FONT_16X16,3);//表
- DisplayFont(5, 40+4, FONT_16X16,9);//丑
- DisplayFont(5, 56+4, FONT_16X16,10);//孩
- }
- void ADC_Init(void)
- {
- ADC_CR1 = 0x20; //分頻系數為4 單次轉換模式 先不啟動ADC轉換
- ADC_CR2 = 0x00; //非外部觸發 數據左對齊 禁止掃描模式
- ADC_CSR = 0x03; //禁止轉換結束中斷 設置轉換通道為AIN3
- ADC_TDRL|= 0x60; //禁止AIN5AIN6施密特觸發器功能
- }
- uint Get_Adc(uchar ac) //獲取adc值
- {
- uint Value;
- ADC_CSR = ac; //選擇通道
- ADC_CR1 |= 0x01; //第一次寫1是從低功耗模式喚醒
- ADC_CSR &= ~0x80; //清除轉換標志
- ADC_CR1 |= 0x01; //開始轉換
- while(!(0x80&ADC_CSR)); //等待轉換完成
- Value = (uint) ADC_DRH; //取高8位
- Value = Value<<2; //左移兩位
- Value += ADC_DRL; //取低兩位
- return(Value); //返回adc值
- }
- float Ad_Av(uchar ac) //采樣400次求平均
- {
- float Val_Av=0;
- uint num;
- for(num=0;num<400;num++)
- {
- Val_Av += Get_Adc(ac);
- }
- Val_Av = Val_Av/400;
- return(Val_Av);
- }
- void Write_Lcd0(void) //固定顯示底板發去LCD
- {
- DisplayFont(0, 8+4, FONT_16X16,0); //電
- DisplayFont(0, 24+4, FONT_16X16,1); //壓
- DisplayFont(0, 40+4, FONT_8X16,12); //:
- DisplayFont(0, 112+4, FONT_8X16,20); //V
- DisplayFont(2, 8+4, FONT_16X16,0); //電
- DisplayFont(2, 24+4, FONT_16X16,2); //流
- DisplayFont(2, 40+4, FONT_8X16,12); //:
- DisplayFont(2, 112+4, FONT_8X16,13); //A
- DisplayFont(4, 8+4, FONT_16X16,4); //功
- DisplayFont(4, 24+4, FONT_16X16,5); //率
- DisplayFont(4, 40+4, FONT_8X16,12); //:
- DisplayFont(4, 104+4, FONT_16X16,11); //W
- DisplayFont(6, 8+4, FONT_16X16,14); //容
- DisplayFont(6, 24+4, FONT_16X16,15); //量
- DisplayFont(6, 40+4, FONT_8X16,12); //:
- DisplayFont(6, 96+4, FONT_8X16,22); //m
- DisplayFont(6, 104+4, FONT_8X16,13); //A
- DisplayFont(6, 112+4, FONT_8X16,15); //H
- // DisplayFont(6, 104+4, FONT_16X16,12); //Ω
- }
-
- void Write_Lcd1(int ad,uchar xl,uchar yl)//把電壓電阻功率發去LCD,ad采集數值,xl yl顯示位置
- {
- if(ad/1000>=1) //電壓如果不足10V,就把1位顯示為空
- {
- DisplayFont(xl,yl+4, FONT_8X16,ad/1000); //十位
- }
- else DisplayFont(xl,yl+4,FONT_8X16,10); //空格
- DisplayFont(xl,yl+8+4, FONT_8X16,(ad%1000)/100); //個位
- DisplayFont(xl,yl+16+4, FONT_8X16,11); //"."小數點
- DisplayFont(xl,yl+24+4, FONT_8X16,ad%100/10); //十分位
- DisplayFont(xl,yl+32+4, FONT_8X16,ad%10); //百分位
- }
- void Write_Lcd2(int ad,uchar xl,uchar yl) //把電流值發去LCD
- {
- DisplayFont(xl,yl+4, FONT_8X16,ad/1000); //個位
- DisplayFont(xl,yl+8+4, FONT_8X16,11); //"."小數點
- DisplayFont(xl,yl+16+4, FONT_8X16,ad%1000/100); //十分位
- DisplayFont(xl,yl+24+4, FONT_8X16,ad%100/10); //百分位
- DisplayFont(xl,yl+32+4, FONT_8X16,ad%10); //千分位
- }
- void Write_Lcd3(int ad,uchar xl,uchar yl) //把容量值發去LCD
- {
- DisplayFont(xl,yl+4, FONT_8X16,ad/10000); //萬位
- DisplayFont(xl,yl+8+4, FONT_8X16,ad%10000/1000); //千位
- DisplayFont(xl,yl+16+4, FONT_8X16,ad%1000/100); //百位
- DisplayFont(xl,yl+24+4, FONT_8X16,ad%100/10); //十位
- DisplayFont(xl,yl+32+4, FONT_8X16,ad%10); //個位
- }
- void Correct(void) //校準
- {
- float V2,Iov,I1,I2,I3,AIN7;
- uchar a,flag;
- ClearScreen(); //清除屏幕
- DisplayFont(1, 48+4, FONT_16X16,7); //校
- DisplayFont(1, 64+4, FONT_16X16,8); //準
- DisplayFont(4, 8+4, FONT_8X16,16); //I
- DisplayFont(4, 16+4, FONT_8X16,23); //n
- DisplayFont(4, 24+4, FONT_8X16,24); //p
- DisplayFont(4, 32+4, FONT_8X16,26); //u
- DisplayFont(4, 40+4, FONT_8X16,25); //t
- DisplayFont(4, 48+4, FONT_8X16,12); //:
-
- DisplayFont(4, 64+4, FONT_8X16,10); //空格
- DisplayFont(4, 72+4, FONT_8X16,10); //空格
- DisplayFont(4, 80+4, FONT_8X16,10); //空格
- DisplayFont(4, 88+4, FONT_8X16,5); //5
- DisplayFont(4, 96+4, FONT_8X16,10); //空格
- DisplayFont(4, 104+4, FONT_8X16,20); //V
- Delay(40);
- flag=1;
- while(flag)
- {
- if(!KEY)
- {
- Delay1(20);
- if(KEY)
- {
- AIN7 = Ad_Av(7); //取得基準的ADC數值
- V2 = Ad_Av(5); //取得校準電壓的ADC數值
- V2 = V2*10/AIN7; //????
- // V2 = V2/AIN7; //????
- EEP_W(0x04,V2);
- flag = 0;
- }
- }
- }
- for(a=0;a<16;a++)
- {
- DisplayFont(4, 64+4, FONT_8X16,10); //空格
- DisplayFont(4, 72+4, FONT_8X16,10); //空格
- DisplayFont(4, 80+4, FONT_8X16,10); //空格
- DisplayFont(4, 88+4, FONT_8X16,0); //0
- DisplayFont(4, 96+4, FONT_8X16,22); //m
- DisplayFont(4, 104+4, FONT_8X16,13); //A
- Delay(40);
- }
- flag=1;
- while(flag)
- {
- if(!KEY)
- {
- Delay1(20);
- if(KEY)
- {
- Iov = Ad_Av(6);
- EEP_W(0x10,Iov);
- flag = 0;
- }
- }
- }
- for(a=0;a<16;a++)
- {
- DisplayFont(4, 64+4, FONT_8X16,10); //空格
- DisplayFont(4, 72+4, FONT_8X16,1); //1
- DisplayFont(4, 80+4, FONT_8X16,0); //0
- DisplayFont(4, 88+4, FONT_8X16,0); //0
- DisplayFont(4, 96+4, FONT_8X16,22); //m
- DisplayFont(4, 104+4, FONT_8X16,13); //A
- Delay(40);
- }
- flag=1;
- while(flag)
- {
- if(!KEY)
- {
- Delay1(20);
- if(KEY)
- {
- AIN7 = Ad_Av(7);
- I1 = Ad_Av(6);
- I1 = (I1-Iov)/AIN7;
- EEP_W(0x08,I1);
- flag = 0;
- }
- }
- }
- for(a=0;a<16;a++)
- {
- DisplayFont(4, 64+4, FONT_8X16,1); //1
- DisplayFont(4, 72+4, FONT_8X16,0); //0
- DisplayFont(4, 80+4, FONT_8X16,0); //0
- DisplayFont(4, 88+4, FONT_8X16,0); //0
- DisplayFont(4, 96+4, FONT_8X16,22); //m
- DisplayFont(4, 104+4, FONT_8X16,13); //A
- Delay(40);
- }
- flag=1;
- while(flag)
- {
- if(!KEY)
- {
- Delay1(20);
- if(KEY)
- {
- AIN7 = Ad_Av(7);
- I2 = Ad_Av(6);
- I2 = (I2-Iov)/AIN7;
- EEP_W(0x0c,I2);
- flag = 0;
- }
- }
- }
- for(a=0;a<16;a++)
- {
- DisplayFont(4, 64+4, FONT_8X16,3); //3
- DisplayFont(4, 72+4, FONT_8X16,0); //0
- DisplayFont(4, 80+4, FONT_8X16,0); //0
- DisplayFont(4, 88+4, FONT_8X16,0); //0
- DisplayFont(4, 96+4, FONT_8X16,22); //m
- DisplayFont(4, 104+4, FONT_8X16,13); //A
- Delay(40);
- }
- flag=1;
- while(flag)
- {
- if(!KEY)
- {
- Delay1(20);
- if(KEY)
- {
- AIN7 = Ad_Av(7);
- I3 = Ad_Av(6);
- I3 = (I3-Iov)/AIN7;
- EEP_W(0x14,I3);
- flag = 0;
- }
- }
- }
- }
- void main() //主函數
- {
- float V,V2,I,I1,I2,I3,Iov,AIN7,R,W;
- CLK_CKDIVR=0x00;
- //Delay(1000);
- GPIO_Init();
- ADC_Init();
- EEP_Init();
- Lcd_Init();
- Hellow();
- Delay1(800);
- while(!KEY)
- {
- Delay1(10);
- if(KEY)
- Correct();
- }
- V2 = EEP_R(0x04); //對應5V
- I1 = EEP_R(0x08); //對應100MA 電流校正值
- I2 = EEP_R(0x0c); //對應1000MA 電流校正值
- Iov = EEP_R(0x10); //對應0MA 電流校正值
- I3 = EEP_R(0x14); //對應3000MA 電流校正值
- ClearScreen(); //清除屏幕
- while(1)
- {
- Write_Lcd0(); //顯示固定底版
- AIN7 = Ad_Av(7); //通道7為內部參考電壓
- I = Ad_Av(6); //通道6電流采樣
- V = Ad_Av(5); //通道5電壓采樣
- if(V>1)
- {
- V = V/AIN7/V2*5069; //5V校正時輸入5.069V
- }
- else
- {
- V = 0;
- }
- if((I-Iov)>0 & (I/AIN7)<=I1*2) //計算電流
- I = (I-Iov)/AIN7/I1*100;
- else if((I/AIN7)>I1*2 & (I/AIN7)<=I2*2)
- I = (I-Iov)/AIN7/I2*1000;
- else
- I = (I-Iov)/AIN7/I3*3000;
- R = V/I; //計算電阻
- W = V*I/1000; //計算功率
- Delay1(5);
- Write_Lcd1((int)V,0,56); //寫入電壓
- Write_Lcd2((int)I,2,64); //電流
- /*
- if(I<1)
- {
- Write_Lcd1(0,4,64); //寫入電阻
- }
- else
- {
- Write_Lcd1((int)R,4,64); //電阻。
- }
- */
- Write_Lcd1((int)W,4,56); //功率
- Write_Lcd3(0,6,56); //容量
- Delay1(400);
- }
- }
復制代碼
0.png (44.09 KB, 下載次數: 73)
下載附件
2018-7-26 16:19 上傳
所有資料51hei提供下載:
作者: kkfy888 時間: 2018-7-26 18:13
不錯,對著做個試下
作者: c20160526 時間: 2018-10-11 06:40
請問下,電壓電流的量程各是多少?還有精度怎么樣?
作者: xiaoqi976633690 時間: 2018-10-11 19:54
謝謝分享


類似主題:
http://m.zg4o1577.cn/bbs/dpj-27356-1.html
http://m.zg4o1577.cn/bbs/dpj-190973-1.html
http://m.zg4o1577.cn/bbs/dpj-35520-1.html
http://m.zg4o1577.cn/bbs/dpj-213269-1.html
http://m.zg4o1577.cn/bbs/dpj-186003-1.html
http://m.zg4o1577.cn/bbs/dpj-59981-1.html
http://m.zg4o1577.cn/bbs/dpj-129947-1.html
http://m.zg4o1577.cn/bbs/dpj-202400-1.html
http://m.zg4o1577.cn/bbs/dpj-88462-1.html
http://m.zg4o1577.cn/bbs/dpj-36379-1.html
http://m.zg4o1577.cn/bbs/dpj-80238-1.html
http://m.zg4o1577.cn/bbs/dpj-178374-1.html
http://m.zg4o1577.cn/bbs/dpj-151707-1.html
http://m.zg4o1577.cn/bbs/dpj-155801-1.html
作者: c20160526 時間: 2018-10-17 11:29
我也要問下精度和量程多少
作者: c20160526 時間: 2018-11-18 20:14
請問下stm8這芯片怎么編譯程序以及燒寫?可以幫我編譯一份軟件不?謝了
作者: dhtfish 時間: 2018-11-26 11:51
這芯片里面的HEX數據可以直接讀取出來嗎
作者: rbd 時間: 2019-1-23 19:09
請問這個電流是雙相的還是單相的
作者: scl690115 時間: 2020-3-29 19:34
留一個記號,備用。
作者: mkkop 時間: 2020-3-30 14:54
謝謝分享,最近也在學習STM8
作者: chenppo 時間: 2020-8-10 16:10
謝謝分享,最近在學習7565驅動。
作者: 長風007 時間: 2020-10-21 17:47
這個驅動寫得很好的。
作者: 35547749 時間: 2021-8-12 17:40
很厲害的發明,敬佩
作者: 初雪 時間: 2021-10-29 14:35
你好,可以解析一下LM358的電路嗎?
歡迎光臨 (http://m.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
色综合久久天天综合网
|
黄色影视
|
日韩欧美在线视频
|
亚洲福利在线观看
|
久久精品网
|
中文字幕第7页
|
日韩免费高清视频
|
久久超|
成人日韩在线
|
波多野吉衣一二三区乱码
|
欧美片网站yy
|
99在线精品视频
|
黄色成人毛片
|
黄色一级视频
|
天天操夜夜摸
|
91综合在线
|
www.久久|
天天干天天操天天摸
|
久久精品视频网
|
国产精品视频网
|
超碰在线观看免费版
|
欧美又大又硬又粗bbbbb
|
国产超级av
|
亚洲区一区二
|
狠狠草视频
|
国产裸体永久免费视频网站
|
国产天堂av
|
亚洲精品久久久蜜桃
|
黄大色黄大片女爽一次
|
中文字幕欧美日韩
|
女人高潮特级毛片
|
国产又粗又猛
|
黄色片免费看
|
日韩一区二区在线播放
|
欧美黄色片在线观看
|
欧美成人三级在线观看
|
日韩视频在线免费观看
|
在线观看www|
日韩黄色小视频
|
久久久久久综合
|
一区二区在线视频
|