學習單片機中,想做電動車儀表盤。用12864總覺得屏小,就掏了幾塊國網集中屏HYG160160,主要是拆機的便宜貨源足,折騰了幾天終于把驅動調通了,做一般顯示夠用了,51單片機的網上驅動程序太難找了,參考手冊里的例程做了大量修改,可以任意位置顯示任意大小文字和圖片。自由修改字庫。可方便使用sprintf函數對接。使用方便分享給需要的朋友。說明和注意事項都放在程序注釋中了。
顯示效果
IMG_20230209_155521.jpg (2.07 MB, 下載次數: 54)
下載附件
2023-2-9 21:40 上傳
調試中遇到很多坑終于跳出來了。
1,時序問題 例程給的時序延時遠遠不夠,手冊說明是10-100ns ,但我的實際情況是5us,還是cup推逸輸出,不知道是不是模塊自身問題,模塊接口有100歐電阻+47PF電容濾波。子程序延時中我用的是C8051F410 的硬件延時。移植其他51需要根據CPU主頻修改延時函數和更換子程序內的頭文件。
IMG_20230209_211125.jpg (2.92 MB, 下載次數: 58)
下載附件
2023-2-9 21:40 上傳
2,字庫掃描方向,配合PCtolcd取模軟件修改即可
3,任意大小字模函數,坑在LCD160160使用的是UC1698驅動,這是彩屏驅動模塊驅動單色液晶需要數據變換,字模寬度必須是3的倍數,高度任意。
字庫較大多變根據自己需要添加刪除,例程中的繪圖函數沒有使用而是使用任意大小字模圖片顯示函數disp_PLH()替代,節約程序空間
吐槽一下sprintf函數非常好用但做浮點數整形顯示太費空間了 ,大神們做浮點數整形顯示有什么站空間比較小的程序分享一下
驅動函數.h
#ifndef __LCD_160160_H__
#define __LCD_160160_H__
#include<intrins.h>
#include "stdio.h"
#include <STRING.H>
sbit A0 = P1^7;
sbit _WR = P1^6;
sbit _RD = P1^5;
sbit _CS = P1^4;
sbit _RST= P1^3;
#define LCDBUS P0
extern uchar ContrastLevel ; //對比度寄存器
extern xdata u8 disp_tmp[24]; //顯示臨時存儲
extern unsigned char code ASCII_SY[];
extern unsigned char code ASCII6_8[];
extern unsigned char code ASCII9_12[];
extern unsigned char code shuzi2440[];
extern unsigned char code Chinese12_12[];
extern unsigned char code dianliang21_12[];
extern unsigned char code xinhao9_12[];
extern unsigned char code dianling3_12[];
extern void ClearRAM(); //3、清屏函數
extern void initLCDM(void); //初始化函數 (單色顯示時初始化設置)
extern void SdCmd(uchar Command); //指令代碼傳送函數
/*****************************************************************
函數功能: 任意大小字模圖片顯示函數
入口參數:x,y,num *ziku
說 明:掃描方式為列-行 列塊+1完成后自動換行+1
x起始列取值范圍0-53,uc1698驅動3色素為1個列塊對應單色像素為3*X點0-159
y行起始列取值范圍0-160
num 字塊/圖在字庫中的序號 范圍0-字庫內字數
*ziku 字庫名字
注 明:注意字模及圖片寬高XX基本信息放在字庫前4位 字模寬度必須是3的倍數
1寬度,2高度,3指向索引表,4備用
例:for(ii=0;ii<25;ii++){ disp_PLH( (ii*2+2), 16, (ii+52),ASCII6_8);}
disp_PLH( 3,1, 0,bmp_3256) //顯示一個圖片
******************************************************************/
extern void disp_PLH( uchar x,uchar y,uchar num,uchar *ziku);//任意大小字模顯示模塊
/*****************************************************************************
函數功能: ASCII顯示函數
入口參數:Y,X,*dat *ziku,sizo
說 明:Y行0-160 X_橫坐標0-53 *dat字符串 *ziku字庫, sizo顯示位數
注 明:顯示一串字符或顯示暫存 帶字庫索引功能 X實際像素x*3=159
要顯示一串字符串 sizo=0,sizo=!0表示顯示暫存位數
例 子:display_ASCII (7,16,disp_tmp, ASCII_68,8);
display_ASCII (0,0,"abdef+1 23", ASCII_68,0);
display_ASCII (3,120,"-12:00", shuzi2440,0);
*****************************************************************************/
extern void display_ASCII (u8 X,u8 Y,u8 *dat, u8 *ziku ,u8 sizo);
/*****************************************************************************
函數功能: 中文顯示函數
入口參數: X,Y,*dat *ziku,*SY
說 明:Y行0-160 X_橫坐標0-53 X實際像素x*3=159 *dat字符串 *ziku字庫
注 明:顯示一串中文字符帶字庫索引功能
例:display_chine(0,0,"電壓",Chinese );
*****************************************************************************/
extern void display_chine(u8 X,u8 Y,u8 *dat, u8 *ziku );
#endif
主程序.c
#include "C8051F410.h"
#include "C8051F410IO.h"
#include "LCD_160160.h"
u8 ii,dl;
u8 xx,yy,wi,hi;
float Wh;
/**********************************
void delay1(uint t) //1ms
{
unsigned int i,j;
for(j=0;j<t;j++)
for(i=0;i<125;i++);
}
*************************************/
/************************************************
電量指示
x 圖標顯示x坐標*3像素點 取值0-53
y 圖標顯示y坐標 取值0-160
DL 電量值 0-5格
*************************************************/
void dianliang(uchar x,y,DL)
{ uchar i,DY;
DY=0;
for (i=0;i<DL;i++)
{ DY=DY<<1; DY=DY|0x01; }
disp_PLH(x, y,0,dianling3_12);
for(i=0;i<5;i++)
{ if ((DY&0x10)==0x10) {disp_PLH(x+i+1,y,3,dianling3_12);}
else {disp_PLH(x+i+1,y,2,dianling3_12);}
DY=DY<<1;
}
disp_PLH(x+6,y,1,dianling3_12);
}
//-----------------------------------------------
void main()
{ //unsigned char i;
Init_Device();
ContrastLevel= 0xc8; //設置對比度參數 //直針c8 彎針fe
initLCDM();
//xx=0;wi=160; yy=0;hi=160; //xx左 wi右 yy上 hi下
ClearRAM();Delay_ms(10);
dl=4; //電量4格
Wh=113.4131879; //浮點數顯示演示
while(1)
{
disp_PLH(2,0,0,xinhao9_12); disp_PLH(5,0,5,xinhao9_12);//無線信號4格
display_ASCII (10,0,"2-09-12:39", ASCII9_12,0);
// disp_PLH(41,0,0,dianliang21_12);
dianliang(41,0,dl); //電量指示
for(ii=0;ii<26;ii++){ disp_PLH( (ii*2), 18, ii, ASCII6_8);} //(ii*4)x軸為列*3像素實際為ii*8
for(ii=0;ii<13;ii++){ disp_PLH( (ii*4), 30, (ii), Chinese12_12);} //(ii*4)x軸為列*3像素實際為ii*12
// for(ii=0;ii<17;ii++){ disp_PLH( (ii*3), 36, (ii), ASCII9_12);}
display_ASCII (1,42,"0123abcdDDS*-/]", ASCII9_12,0);
//for(ii=0;ii<13;ii++){ disp_PLH( (ii*4+2), 48, ii, Chinese12_12);}
display_chine(2,56,"電壓電流功率容量報警",Chinese12_12 );
// for(ii=0;ii<7;ii++){ disp_PLH( (ii*8), 72, ii+1, shuzi2440);}
sprintf(disp_tmp,"%5.2f",(float)Wh); //打印輸出至disp_temp數組內
display_ASCII (0,72,disp_tmp, shuzi2440 ,8);
display_ASCII (1,112,"PPTMabdef+1 23-/k8;\:", ASCII6_8,0);
display_ASCII (2,120,"-12:00", shuzi2440,0);
Delay_ms(1000);
//ShowBMP(xx,yy,wi,hi, CCTAB) ;
Delay_ms(100);
ClearRAM();Delay_ms(0);
SdCmd(0x81); SdCmd(ContrastLevel);Delay_ms(1);//設置對比度 bf
}
}
51hei.png (3.63 KB, 下載次數: 51)
下載附件
2023-2-9 23:51 上傳
C8051F410單片機程序下載:
LCD_160160.rar
(105.23 KB, 下載次數: 81)
2023-2-9 22:14 上傳
點擊文件名下載附件
HYG160160驅動子程序 下載積分: 黑幣 -5
|