学习单片机中,想做电动车仪表盘。用12864总觉得屏小,就掏了几块国网集中屏HYG160160,主要是拆机的便宜货源足,折腾了几天终于把驱动调通了,做一般显示够用了,51单片机的网上驱动程序太难找了,参考手册里的例程做了大量修改,可以任意位置显示任意大小文字和图片。自由修改字库。可方便使用sprintf函数对接。使用方便分享给需要的朋友。说明和注意事项都放在程序注释中了。
显示效果
调试中遇到很多坑终于跳出来了。
1,时序问题 例程给的时序延时远远不够,手册说明是10-100ns ,但我的实际情况是5us,还是cup推逸输出,不知道是不是模块自身问题,模块接口有100欧电阻+47PF电容滤波。子程序延时中我用的是C8051F410 的硬件延时。移植其他51需要根据CPU主频修改延时函数和更换子程序内的头文件。
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
}
}
C8051F410单片机程序下载:
LCD_160160.rar
(105.23 KB, 下载次数: 81)
|