/*斷碼LCD屏顯示方法用法總節
為什么要用LCD顯示。 便宜 省電 0.5-2元左右
為什么選插腳 好焊好調試
為什么選TM1621D qsop24 腳少個小 省電 省錢夠用。 專業芯片用于處理顯示LCD 某一個寶幾毛
為什么用STC32G做測試 因為簡單一個主文件搞定 分立模塊
最近是2024年11月用到不到兩個月把這個簡簡單單的東西看明白分享記錄一下。希望以后的人別用這么多的時間!
關于程序。這個程序用的是TM1621D的官方例子改的。用邏輯分析儀測試正常。用的是P2口做的驅通信口。
這個是可以用的程序。
最后看了太多的論壇還有CSDN上的文章,基本沒有人說出真正可以用的例子用51單片機驅動TM1621D顯示LCD。 為什么是這樣我也不懂。那就讓我來說一下吧。
關于單片機方面就不用說了就用STC32G 8K64 還是12K128都可以 用32腳是為了好手工焊接。開P2為準雙向口用于發送數據。用P3M0 |= 0x30; P3M1 &= ~0x30; //34 35 用于給屏供電
關于TM1621D 這個的規格書在百度上一找就可以找到。
關于TM1621D SSOP24 的引腳排列可以在立創上看。
4個COM對應好屏上的COM口。
SEG9-SEG22 畫版的時候用了哪些寫代碼的時候就操作哪些。然后自己對應。
關于屏幕要選不帶LCD的經角少便宜的 1/3偏壓 4公共口 的做測試。
關于程序:用這樣的一組就用這個程序就可以了。主要用下面的代碼做測試
// WriteOneData(0x09,0x04); //意思是寫到seg09 上 COM寫0001 0010 0100 1000 對應0x 01 02 04 08正常會顯示一個筆畫。
關于我踩過的坑
1 屏沒拿到廠家的對的真值表
2 屏的COM認錯
3 通信腳沒有改
4 通信腳沒做IO設置
5 問專業的人不給錢人家也沒法給你找到錯的地方。
6 屏的尺寸看錯PCB孔距畫錯
7 沒認真看TM1621D的規格書。直到到了20多次以后
8 問不懂的銷售沒什么用。
9 TM1621D的2013年的例子沒有詳細的注釋
10 買屏一定要要到規格書要到對的規格書。
11 如果顯示亂碼大概率就是COM搞錯了。
12 VCC和VLCD之間看規格書說需要接個可調電阻這個不要省。最少加個10K多的電阻
13 實踐出真知
14 之前顯示不到用了很久才又買了邏輯分析儀之前的找不到了。
15 驗證發送數據是對的之后才可以確定程序對不對。本程序已經修改了少量代碼使通信波形更穩定
16 為了以后別人和我都可以看懂下面的代碼。主機對這個做上有用的注釋方便移槙。
17 為什么沒寫出顯示0123456789的代碼 因為畫的板不一樣寫法不一樣。
*/
- /* 如果要在程序中使用此代碼,請在程序中注明使用了STC的資料及程序 */
- /************* 功能說明 **************
- 本例程基于STC32G為主控芯片的實驗箱進行編寫測試。
- 使用Keil C251編譯器,Memory Model推薦設置XSmall模式,默認定義變量在edata,單時鐘存取訪問速度快。
- edata建議保留1K給堆棧使用,空間不夠時可將大數組、不常用變量加xdata關鍵字定義到xdata空間。
- 下載時, 選擇時鐘 11.0592MHz ******************************************/
- #include "comm\STC32G.h" //STC官方文件沒做修改用的是STC32GLQFP32 32腳的芯片
- #include "stdio.h"
- #include "intrins.h"
- #define uchar unsigned char //數據類型宏定義
- #define uint unsigned int //數據類型宏定義
- /*斷碼LCD屏顯示方法用法總節
- 為什么要用LCD顯示。 便宜 省電 0.5-2元左右
- 為什么選插腳 好焊好調試
- 為什么選TM1621D qsop24 腳少個小 省電 省錢夠用。 專業芯片用于處理顯示LCD 某一個寶幾毛
- 為什么用STC32G做測試 因為簡單一個主文件搞定 分立模塊
- 最近是2024年11月用到不到兩個月把這個簡簡單單的東西看明白分享記錄一下。希望以后的人別用這么多的時間!
- 關于程序。這個程序用的是TM1621D的官方例子改的。用邏輯分析儀測試正常。用的是P2口做的驅通信口。
- 這個是可以用的程序。
- 最后看了太多的論壇還有CSDN上的文章,基本沒有人說出真正可以用的例子用51單片機驅動TM1621D顯示LCD。 為什么是這樣我也不懂。那就讓我來說一下吧。
- 關于單片機方面就不用說了就用STC32G 8K64 還是12K128都可以 用32腳是為了好手工焊接。開P2為準雙向口用于發送數據。用P3M0 |= 0x30; P3M1 &= ~0x30; //34 35 用于給屏供電
- 關于TM1621D 這個的規格書在百度上一找就可以找到。
- 關于TM1621D SSOP24 的引腳排列可以在立創上看。
- 4個COM對應好屏上的COM口。
- SEG9-SEG22 畫版的時候用了哪些寫代碼的時候就操作哪些。然后自己對應。
- 關于屏幕要選不帶LCD的經角少便宜的 1/3偏壓 4公共口 的做測試。
- 關于程序:用這樣的一組就用這個程序就可以了。主要用下面的代碼做測試
- // WriteOneData(0x09,0x04); //意思是寫到seg09 上 COM寫0001 0010 0100 1000 對應0x 01 02 04 08正常會顯示一個筆畫。
- 關于我踩過的坑
- 1 屏沒拿到廠家的對的真值表
- 2 屏的COM認錯
- 3 通信腳沒有改
- 4 通信腳沒做IO設置
- 5 問專業的人不給錢人家也沒法給你找到錯的地方。
- 6 屏的尺寸看錯PCB孔距畫錯
- 7 沒認真看TM1621D的規格書。直到到了20多次以后
- 8 問不懂的銷售沒什么用。
- 9 TM1621D的2013年的例子沒有詳細的注釋
- 10 買屏一定要要到規格書要到對的規格書。
- 11 如果顯示亂碼大概率就是COM搞錯了。
- 12 VCC和VLCD之間看規格書說需要接個可調電阻這個不要省。最少加個10K多的電阻
- 13 實踐出真知
- 14 之前顯示不到用了很久才又買了邏輯分析儀之前的找不到了。
- 15 驗證發送數據是對的之后才可以確定程序對不對。本程序已經修改了少量代碼使通信波形更穩定
- 16 為了以后別人和我都可以看懂下面的代碼。主機對這個做上有用的注釋方便移槙。
- 17 為什么沒寫出顯示0123456789的代碼 因為畫的板不一樣寫法不一樣。
- */
- /*斷碼LCD屏顯示方法-定義和其它功能無關的LCD顯示功能的引腳還有操作程序用P20 21 22 P34 35 用于給TM1621D和屏供電 1621D驅動*/
- #define nop _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //宏定義
- /******************TM1621D模塊命令定義*********************/
- #define SYSDIS 0x00 //關系統振蕩器和LCD偏壓發生器
- #define SYSEN 0x02 //打開系統振蕩器
- #define LCDOFF 0x04 //關LCD偏壓
- #define LCDON 0x06 //開LCD偏壓
- #define RC 0x30 //內部RC振蕩
- #define BIAS 0x52 //1/3偏壓 4公共口
- #define WDTDIS 0x0a //禁止看門狗
- #define WDTEN 0x0e //開啟看門狗
- /*根據屏設置用內部LCD偏壓也就是顯示不顯示到LCD 關看門狗 適合//1/3偏壓 4公共口 需求屏*/
- /********************定義控制端口這里要根據實際情況接線**********************/
- sbit CS=P2^0;
- sbit WRITE=P2^1;
- sbit DATA=P2^2;
- /********************定義數據這里可以說是沒有用的TM1621D官方代碼*************************/
- uchar code Smg[16]={0x05,0xff,0xc7,0xE5,0x6C,0xAD,0xaf,0xE0,0xef,0xed,0xee,0x2f,0x8b,0x67,0x8f,0x8e}; //0~F字型碼
- uchar code Tab0[16]={0x08,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //清屏
- /********************延時函數*************************/
- void delay_nms(uint n)
- {
- uint i;
- while(n--)
- for(i=0;i<500;i++);
- }
- /********************從高位寫入數據*************************/
- void Write_Data_H(uchar Data, uchar Cnt) //Data的高cnt位寫入TM1621D,高位在前
- {
- uchar i;
- for(i=0;i<Cnt;i++)
- {
- WRITE=0;
-
- if(Data&0x80) //從最高位發送
- DATA=1;
- else
- DATA=0;
- nop;
- WRITE=1;
- nop;
- Data<<=1;
- }
- WRITE=0;
- DATA=0;
- }
- /********************從低位寫入數據*************************/
- void Write_Data_L(uchar Data,uchar Cnt) //Data 的低cnt位寫入TM1621D,低位在前
- {
- unsigned char i;
- for(i=0;i<Cnt;i++)
- {
- WRITE=0;
- nop;
- if(Data&0x01) //從低位發送
- DATA=1;
- else
- DATA=0;
- nop;
- WRITE=1;
- nop;
- Data>>=1;
- }
- WRITE=0;
- DATA=0;
- }
- /********************寫入控制命令*************************/
- void WriteCmd(uchar Cmd)
- {
- CS=0;
- nop;
- Write_Data_H(0x80,4); //寫入命令標志100
- Write_Data_H(Cmd,8); //寫入命令數據
- CS=1;
- nop;
- }
- /*********指定地址寫入數據,實際寫入后4位************/
- void WriteOneData(uchar Addr, uchar Data)
- {
-
- Addr=Addr<<2;
- CS=0;
- nop;
- Write_Data_H(0xa0,3); //寫入數據標志101
-
- Write_Data_H(Addr,6); //寫入地址數據
- Write_Data_L(Data,4); //寫入數據
- nop;
- CS=1;
- nop;
- }
- /*********連續寫入方式,每次數據為8位,寫入數據(基本不用可以去掉)************/
- void WriteAllData(uchar Addr,uchar *p,uchar cnt)
- {
- uchar i;
- CS=0;
- Write_Data_H(0xa0,3); //寫入數據標志101
- Write_Data_H(Addr<<2,6); //寫入地址數據
- for(i=0;i<cnt;i++) //寫入數據
- {
- Write_Data_L(*p,8);
- p++;
- }
- CS=1;
- nop;
- }
- /*******************TM1621D初始化**********************/
- void TM1621D_init()
- {
- CS=1;
- WRITE=1;
- DATA=1;
- nop;
- delay_nms(1);
- WriteCmd(BIAS); //1/3偏壓 4公共口
- WriteCmd(RC); //內部RC振蕩
- WriteCmd(SYSDIS); //關系統振蕩器和LCD偏壓發生器
- WriteCmd(WDTDIS); //禁止看門狗
- WriteCmd(SYSEN); //打開系統振蕩器
- WriteCmd(LCDON); //開LCD偏壓
- }
- /*************TM1621清屏函數用了這個對1621D應該是全屏清空才是對的*****************/
- void Clear1621()
- {
- uchar i;
- for(i=0;i<32;i++) //9-21可以清屏
- {
- WriteOneData(i, 0x00);
- }
- }
- /*************TM1621全屏函數 如果用了沒有全顯示則有不對的地方,主要是屏焊接的問題*****************/
- void quanping1621()
- {
- uchar i;
- for(i=9;i<22;i++) //9-21可以清屏
- {
- WriteOneData(i, 0x0f);
- }
- }
- /*斷碼LCD屏顯示方法-定義和其它功能無關的LCD顯示功能的引腳還有操作程序用P20 21 22 P34 35 用于給TM1621D和屏供電 1621D驅動*/
- void main()
- {
- /*斷碼LCD屏顯示方法-定義和其它功能無關的LCD顯示功能的引腳還有操作程序用P20 21 22 P34 35 用于給TM1621D和屏供電 1621D驅動*/
- P3M0 |= 0x30; P3M1 &= ~0x30; //34 35
- P2M0 &= ~0x07; P2M1 &= ~0x07;
- P34=0;
- P35=1;
- /*斷碼LCD屏顯示方法-定義和其它功能無關的LCD顯示功能的引腳還有操作程序用P20 21 22 P34 35 用于給TM1621D和屏供電 1621D驅動*/
- TM1621D_init(); //開機初始化(可以重復初使化主到主循環如果有需要的話)
- delay_nms(1);
- //WriteAllData(0,Tab0,16); //LCD清顯存
-
- //WriteOneData(0x0e, 0x06);
-
-
- Clear1621();//LCD清顯存
-
- //quanping1621(); //應該可以全顯示才對
-
- while(1)
- {
-
- }
- }
-
- /*
- WriteOneData(0x01,0x00);
- WriteOneData(0x02,0x00);
- WriteOneData(0x03,0x00);
- WriteOneData(0x04,0x00);
- WriteOneData(0x05,0x00);
- WriteOneData(0x06,0x00);
- WriteOneData(0x07,0x00);
- WriteOneData(0x08,0x00);
- WriteOneData(0x09,0x00);
- */
- //第一位顯示8
- // WriteOneData(0x09,0x0f);
- // WriteOneData(0x0e,0x0e);
- //第二位顯示5
-
- // WriteOneData(0x0c,0x0A);
- // WriteOneData(0x0d,0x0d);
-
-
-
- //第三位顯示2
-
- // WriteOneData(0x10,0x04);
- /*
- 09 01 3b
- 09 02 3c
- 09 04 3d
- 09 08 空
- 0a 01 3a
- 0a 02 3g
- 0a 04 3e
- 0a 08 空
- 0b 01 電池1
- 0b 02 2f
- 0b 04 1p
- 0b 08 空
- 0c 01 2b
- 0c 02 2c
- 0c 04 2d
- 0c 08 空
- 0d 01 2a
- 0d 02 2g
- 0d 04 2e
- 0d 08 空
- 0e 01 電池空
- 0e 02 1f
- 0e 04 電池3
- 0e 08 空
- 0f 01 1b
- 0f 02 1c
- 0f 04 1d
- 0f 08 空
- 10 01 1a
- 10 02 1g
- 10 04 1e
- 10 08 空
- */
-
-
-
-
- //WriteOneData(0x0a,0x0f);
- //WriteOneData(0x0b,0x0f);
-
- //WriteOneData(0x0B,0x07);
-
- //WriteOneData(0x15,0x0f);
-
-
-
- //WriteOneData(0x12,0x0f); //G2 9 3
-
-
-
- //WriteOneData(0x0b,0x01); //G3 7 1
-
- //WriteOneData(0x0b,0x02); //c2 8 2
-
- //WriteOneData(0x0b,0x04); //D2 9 1
-
-
- //WriteOneData(0x0b,0x08); //c1 10 2
- //WriteOneData(0x0b,0x01); //D2 7 1
- /*
- WriteOneData(0x0c,0x01); //E3 7 2
- WriteOneData(0x0c,0x02); //G2 9 3
- WriteOneData(0x0c,0x04); //G2 9 3
- WriteOneData(0x0c,0x08); //G3 7 3
- WriteOneData(0x0d,0x01); //f3 7 4
- WriteOneData(0x0d,0x02); //b2 8 3
- WriteOneData(0x0d,0x04); //f2 9 4
- WriteOneData(0x0d,0x08); //b1 10 3
- */
-
- //第二位基本可以顯示
- /*
- WriteOneData(0x0e,0x03);
- WriteOneData(0x0f,0x07);
- WriteOneData(0x10,0x03);
- */
-
- /*
-
- WriteOneData(0x01,0x00);
- WriteOneData(0x02,0x00);
- WriteOneData(0x03,0x00);
- WriteOneData(0x04,0x00);
- WriteOneData(0x05,0x00);
- WriteOneData(0x06,0x00);
- WriteOneData(0x07,0x00);
- WriteOneData(0x08,0x00);
- WriteOneData(0x09,0x00);
- WriteOneData(0x0a,0x00);
-
-
-
-
-
-
- WriteOneData(0x11,0x00);
- WriteOneData(0x12,0x00);
- WriteOneData(0x13,0x00);
- WriteOneData(0x14,0x00);
- WriteOneData(0x15,0x00);
- WriteOneData(0x16,0x00);
- WriteOneData(0x17,0x00);
- WriteOneData(0x18,0x00);
- WriteOneData(0x19,0x00);
- WriteOneData(0x1a,0x00);
- WriteOneData(0x1b,0x00);
- WriteOneData(0x1c,0x00);
- WriteOneData(0x1d,0x00);
- WriteOneData(0x1e,0x00);
- WriteOneData(0x1f,0x00);
- WriteOneData(0x20,0x00);
- WriteOneData(0x21,0x00);
- WriteOneData(0x22,0x00);
- WriteOneData(0x23,0x00);
- WriteOneData(0x24,0x00);
- WriteOneData(0x25,0x00);
- WriteOneData(0x26,0x00);
-
-
- */
- /*
- //101 001110 0001 1100
- //WriteOneData(0x0a,0x0d);
-
- //WriteOneData(0x0d,0x0f);
-
- // WriteOneData(0x10,0x02); //LCD SEG10到SEG21顯示0~5
-
-
- // WriteOneData(0x0b,0x00);
- // WriteOneData(0x0c,0x08);
-
-
- // WriteOneData(0x0d,0x00);
- // WriteOneData(0x0e,0x0a);
-
- //WriteOneData(0x0b, 0x00);
- //WriteOneData(0x0A, 0x05);
- //WriteOneData(0x0b, 0x0b);
- //WriteOneData(0x0f, 0x04);
- //WriteOneData(0x09, 0x01);
- // WriteOneData(0x09, 0x0b);
-
- // WriteOneData(0x0b, 0x0b);
- // WriteOneData(0x0c, 0x0b);
- //WriteOneData(0x09, 0x0d);
- //WriteOneData(0x0f, 0x02);
-
- //ping1621();
- //
-
-
-
-
-
-
- //WriteOneData(0x0e, 0x02);
- //WriteOneData(0x0e, 0x04);
- //WriteOneData(0x09, 0x0d);
- //WriteAllData(0x09,Smg,1); //LCD清顯存
-
- //Clear1621();
-
- //WriteOneData(0x0f,0x08);
- // WriteOneData(0x09, 0x05);
-
- */
復制代碼
LCD驅動芯片TM1621D『官方最新規格書』.pdf
(1.98 MB, 下載次數: 0)
2024-11-23 13:25 上傳
點擊文件名下載附件
LCD驅動芯片TM1621D『官方最新規格書 下載積分: 黑幣 -5
規格書
lCdstc32GGGGGGGGGGGG.rar
(63.12 KB, 下載次數: 0)
2024-11-23 13:26 上傳
點擊文件名下載附件
絕對通過的源碼 下載積分: 黑幣 -5
絕對通過的源碼
|