找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2029|回复: 6
打印 上一主题 下一主题
收起左侧

国网集中屏HYG160160的单片机驱动子程序

[复制链接]
跳转到指定楼层
楼主
学习单片机中,想做电动车仪表盘。用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, 下载次数: 69)

评分

参与人数 1黑币 +90 收起 理由
admin + 90 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:34298 发表于 2023-2-24 13:18 | 只看该作者
非常好 我也买了2块 刚好学习一下
回复

使用道具 举报

板凳
ID:309610 发表于 2023-3-2 22:10 | 只看该作者
补充一下  时序延时问题原因找到了是我的MCU P1口驱动能力不足。真坑! 原版是并口驱动占用IO较多搭焊一片74HC164改成了串口。RD可直接接VDD,res 也可用电阻阻电容组成上电复位。最终只需要6个IO脚。
速度问题 我是49Mhz 主频单周期执行指令不需要延时,比起并口一点也不慢。全屏数据刷新大约20HZ。[img][/img]
下附串口驱动和显示例子

20230302_214849.jpg (1.81 MB, 下载次数: 44)

20230302_214849.jpg

LCD160160串口驱动.rar

13.85 KB, 下载次数: 18, 下载积分: 黑币 -5

回复

使用道具 举报

地板
ID:688905 发表于 2023-3-9 16:54 来自手机 | 只看该作者
感谢高手分享!我收了几个用排针的,原想接到esp8266上做成天气万年历,无奈实力不济,您能将上面的代码封装成arduino的库吗?
回复

使用道具 举报

5#
ID:34298 发表于 2023-7-29 19:17 | 只看该作者
高手   这样的屏5元一个咸鱼到处在卖
回复

使用道具 举报

6#
ID:34298 发表于 2023-9-23 01:04 来自手机 | 只看该作者
有stc单片机的160160屏程序没有
回复

使用道具 举报

7#
ID:774081 发表于 2023-12-29 15:42 | 只看该作者
直接用两片级联来驱动,只需要3个口就可以了。话说这屏本来可跳线成3线或4线SPI串口,楼主研究了吗?这个屏幕是否引出了可跳线的管脚?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表