160*160液晶 LCD160160 UC1698U 控制器 的液晶资料以及驱动源码 先分享在战舰MINI板上实现过程

2019-07-20 06:52发布

闲来无事拆了一些电网监控盒上面一个液晶是正方形的单 {MOD}屏一看是160*160的,我这边是信利的屏幕找不到资料,不过看电路板猜应该是18脚的通用引脚顺序控制器应该也是UC1698U的,熟悉的8080接口驱动起来。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
15条回答
cornrn
1楼-- · 2019-07-20 11:54
[mw_shl_code=applescript,true]#include "LCD160160.h"
#include "LCD160160font.h"         
#include "delay.h"
#include "stdlib.h"
/**************************************************************************************
**作者:秋水之下  QQ:858860583.
**说明:160160液晶一般控制器都是UC1698 ,Modules Controlled By UltraChip'S UC1698.
***************************************************************************************/

//初始化LCD160160                                            
void LCD160160_Init(void)
{                                                                                                
        GPIO_InitTypeDef  GPIO_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE );
       
        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);        //JTAG-DP 失能 + SW-DP使能

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);                                                             
        GPIO_Write(GPIOB,0XFF);
         
        GPIO_ResetBits(GPIOB,GPIO_Pin_1);//打开LCD电源 VSS=0, VDD=1
  GPIO_SetBits(GPIOB,GPIO_Pin_7);
  UC1698U_RST_L();                 //硬件复位
  delay_ms(10);
        UC1698U_RST_H();
        delay_ms(800);
        //power control                                       
        LCD160160_WR_Byte(0xE9,LCD160160_CMD);                                  //设置偏压比1/10
        LCD160160_WR_Byte(0x2B,LCD160160_CMD);                                  //内部电源DC-DC
        LCD160160_WR_Byte(0x24,LCD160160_CMD);                                  //set temperate compensation as 0%
        LCD160160_WR_Byte(0x81,LCD160160_CMD);                                  //electronic potentionmeter
        LCD160160_WR_Byte(198,LCD160160_CMD);                        //0xc6不起作用

        //lcd control
        LCD160160_WR_Byte(0xc0,LCD160160_CMD);                                  //19:partial display and MX disable,MY enable
  //LCD160160_WR_Byte(0xc7,LCD160160_CMD);               
       
        LCD160160_WR_Byte(0xA1,LCD160160_CMD);                                  //行扫描频率62.5HZ
        LCD160160_WR_Byte(0xd1,LCD160160_CMD);                                  //彩 {MOD}数据格式R-G-B
        //LCD160160_WR_Byte(0xd0,LCD160160_CMD);              //彩 {MOD}数据格式BGR-BGR
       
        LCD160160_WR_Byte(0xd5,LCD160160_CMD);                                  //设置数据位为12位RRRR-GGGG-BBBB 4k彩模式
  //LCD160160_WR_Byte(0xd6,LCD160160_CMD);                          //设置数据位为12位5R-6G-5B 64k彩模式
       
        LCD160160_WR_Byte(0x84,LCD160160_CMD);                                  //12:partial display control disable

        //n-line inversion
        LCD160160_WR_Byte(0xc8,LCD160160_CMD);         
        //LCD160160_WR_Byte(0x10,LCD160160_CMD);                    //enable NIV

        //com scan fuction
        LCD160160_WR_Byte(0xd8,LCD160160_CMD);                                  //enable FRC,PWM,LRM sequence

        //window 显示窗口大小设置
        LCD160160_WR_Byte(0xf4,LCD160160_CMD);                                  //wpc0:column        starting column address        列起始地址
        LCD160160_WR_Byte(0x25,LCD160160_CMD);                                  //start from 130   37
        LCD160160_WR_Byte(0xf6,LCD160160_CMD);                                  //wpc1                         ending column address         列结束地址
        LCD160160_WR_Byte(0x5A,LCD160160_CMD);                                  //end:272            90
                                        //因为列开始到结尾共90-37=53个数所以 一个数代表160/53=3个像素

        LCD160160_WR_Byte(0xf5,LCD160160_CMD);                                  //wpp0:row                 starting row address          行起始地址
        LCD160160_WR_Byte(0x00,LCD160160_CMD);                                  //start from 0
        LCD160160_WR_Byte(0xf7,LCD160160_CMD);                                  //wpp1                         ending  row address           行结束地址
        LCD160160_WR_Byte(0x9F,LCD160160_CMD);                                  //end 160  0x9F=159
                                        //行开始到结束共160个数所以一个数代表160/160=1个像素

        LCD160160_WR_Byte(0xf8,LCD160160_CMD);                                  //inside mode   set window program mode

        LCD160160_WR_Byte(0x89,LCD160160_CMD);                            //RAM control 地址自动加一  AC1=0 列先增加        AC2=0 控制行增加+1还是-1 AC0=1
  //LCD160160_WR_Byte(0x8b,LCD160160_CMD);                    //是0x89的90°翻转显示        AC1=1 行先增加 AC0=1
  //LCD160160_WR_Byte(0x8d,LCD160160_CMD);                    //        AC1=0   AC2=1  控制行增加+1还是-1         AC0=1
        //LCD160160_WR_Byte(0x8a,LCD160160_CMD);         

        LCD160160_WR_Byte(0xad,LCD160160_CMD);                          //display on,select on/off mode.Green Enhance mode disable        背景深黑雪花
        //LCD160160_WR_Byte(0xa8,LCD160160_CMD);              //wrong       
  //LCD160160_WR_Byte(0xa9,LCD160160_CMD);              //和0xad一个效果  有雪花       
  //LCD160160_WR_Byte(0xac,LCD160160_CMD);                    //wrong
  //LCD160160_WR_Byte(0xaf,LCD160160_CMD);                      //另一种灰度  浅黑雪花

        //scroll line 滚动行
//        LCD160160_WR_Byte(0x40,LCD160160_CMD);                                  //low bit of scroll line
//        LCD160160_WR_Byte(0x50,LCD160160_CMD);                                  //high bit of scroll line
//               
//        LCD160160_WR_Byte(0xc4,LCD160160_CMD);                                  //[命令序号:18]LCD映像 MY=1,MX=0,LC0=0
//        LCD160160_WR_Byte(0x90,LCD160160_CMD);                                  //[命令序号:13]Set Fixed Lines
//        LCD160160_WR_Byte(0x00,LCD160160_CMD);         

        //partial display 部分显示
//        LCD160160_WR_Byte(0x84,LCD160160_CMD);                                  //set partial display controlff
//        LCD160160_WR_Byte(0xf1,LCD160160_CMD);                                  //com end
//        LCD160160_WR_Byte(0x9f,LCD160160_CMD);                                  //160
//        LCD160160_WR_Byte(0xf2,LCD160160_CMD);                                  //display start
//        LCD160160_WR_Byte(0,LCD160160_CMD);                                            //0
//        LCD160160_WR_Byte(0xf3,LCD160160_CMD);                                  //display end
//        LCD160160_WR_Byte(159,LCD160160_CMD);                                    //160       
       
                //display control
        LCD160160_WR_Byte(0xa4,LCD160160_CMD);                //关闭所有像素                        //all pixel off
        //LCD160160_WR_Byte(0xa5,LCD160160_CMD);              //打开所有像素点 即点亮整个屏幕
       
        LCD160160_WR_Byte(0xa6,LCD160160_CMD);                //关闭像素反显 决定屏幕反显                        //inverse display off
  //LCD160160_WR_Byte(0xa7,LCD160160_CMD);              //打开像素反显 决定屏幕反显

}  


//向LCD160160写入一个字节。
//dat:要写入的数据/命令
//CMDorDATA:数据/命令标志;
void LCD160160_WR_Byte(u8 dat,CMDorDATA CorD)
{
        if (CorD==LCD160160_CMD)
        {
          UC1698U_CD_L();        //CD低电平操作指令
        }
        else
        {
                UC1698U_CD_H();        //CD高电平显示数据
        }
          
          UC1698U_RD_H();       
    UC1698U_CS_L();       
    UC1698U_Bus(dat);         
    UC1698U_WR_L();                
    UC1698U_WR_H();       
    UC1698U_CS_H();
}                         
                    
//开启LCD160160显示   
void LCD160160_Display_On(void)
{
        LCD160160_WR_Byte(0X8D,LCD160160_CMD);  //SET DCDC命令
        LCD160160_WR_Byte(0X14,LCD160160_CMD);  //DCDC ON
        LCD160160_WR_Byte(0XAF,LCD160160_CMD);  //DISPLAY ON
}
//关闭LCD160160显示     
void LCD160160_Display_Off(void)
{
        LCD160160_WR_Byte(0X8D,LCD160160_CMD);  //SET DCDC命令
        LCD160160_WR_Byte(0X10,LCD160160_CMD);  //DCDC OFF
        LCD160160_WR_Byte(0XAE,LCD160160_CMD);  //DISPLAY OFF
}                                            






// 在写入数据时被舍弃
// 坐标X 为RAM 地址坐标,X 地址包含有3 个像素,地址从0-159
// 坐标Y 为像素点行数0-159
// chinesecode 为中文字符代码,对应字库为CCTAB
void LCD160160_Print(u8 x, u8 y, u8 index,u8 len,FontType Type)
{
        u8 p;
        u8 i,m,k,Ddata;
        LCD160160_WR_Byte(0xf4,LCD160160_CMD); LCD160160_WR_Byte(0x25+x,LCD160160_CMD);   // 设置操作窗口左边界
        LCD160160_WR_Byte(0xf5,LCD160160_CMD); LCD160160_WR_Byte(y,LCD160160_CMD);        // 设置操作窗口上边界
        LCD160160_WR_Byte(0xf6,LCD160160_CMD); LCD160160_WR_Byte(0x5a-x,LCD160160_CMD); // 设置操作窗口右边界
        LCD160160_WR_Byte(0xf7,LCD160160_CMD); LCD160160_WR_Byte(0x9f-y,LCD160160_CMD);     // 设置操作窗口下边界
        LCD160160_WR_Byte(0xf8,LCD160160_CMD);// 设置窗口操作使能
        x=x+0x25;
        LCD160160_WR_Byte(x&0x0f,LCD160160_CMD);LCD160160_WR_Byte(0x10|(x>>4),LCD160160_CMD);         // 设置起始列地址
        LCD160160_WR_Byte(0x60+(y&0x0f),LCD160160_CMD); LCD160160_WR_Byte(0x70+(y>>4),LCD160160_CMD); // 设置起始行地址
        LCD160160_WR_Byte(0xa6,LCD160160_CMD);
        for(i=0;i<12;i++) // 循环12 行像素写入
        {
                k=CN_1212 [index]; // 取字符左半部分字模数据
                for (m=0;m<4;m++) // 1 字节转换成4 字节数据写入
                {
                        switch (k&0xc0) // 根据数据位值设置显示数据
                        {
                                case 0x00 : Ddata=0x00;break;
                                case 0x40 : Ddata=0x0f;break;
                                case 0x80 : Ddata=0xf0;break;
                                case 0xc0 : Ddata=0xff;break;
                        }
                        LCD160160_WR_Byte(Ddata,LCD160160_DATA); //数据写入
                        k=k<<2;
                }
                k=CN_1212 [index][i+12]; // 取字符左半部分字模数据
                for (m=0;m<2;m++) //仅转换1 字节的前4 位转换成2 字节数据写入
                {
                        switch (k&0xc0) //根据数据位值设置显示数据
                        {
                                case 0x00 : Ddata=0x00;break;
                                case 0x40 : Ddata=0x0f;break;
                                case 0x80 : Ddata=0xf0;break;
                                case 0xc0 : Ddata=0xff;break;
                        }
                        LCD160160_WR_Byte(Ddata,LCD160160_DATA); //数据写入
                        k=k<<2;
                }
        }
}


//--图形写入函数-------------------
// 图形格式要求:水平方向宽度要以3 和8 的倍数出现
// 8 的倍数是数据以字节形式出现
// 3 的倍数是因为DDRAM 列地址以列块形式计算的,即3 点像素数据为一个列块
void LCD160160_DisplayBMP(u8 x,u8 y,u8 width,u8 high)
{
// 坐标X 为像素列块0-79 列块,3 像素点数据/列块
// 坐标Y 为像素点行数0-159 深圳市拓普微科技开发有限公司制作
// 图形宽度width 为水平方向点列数,要求该值为3 和8 的倍数
// 图形高度high 为垂直方向点行数,取值为0-159
// 图形数组bmp[]为所要写入的图形数据,以1bpp(8dots/byte)、水平排列格式表示
u8 p;
u8 i,j,k,m,Ddata;
LCD160160_WR_Byte(0xf4,LCD160160_CMD); LCD160160_WR_Byte(0x25+x,LCD160160_CMD); // 设置操作窗口左边界
LCD160160_WR_Byte(0xf5,LCD160160_CMD); LCD160160_WR_Byte(y,LCD160160_CMD); // 设置操作窗口上边界
LCD160160_WR_Byte(0xf6,LCD160160_CMD); LCD160160_WR_Byte(0x25+width/3,LCD160160_CMD); // 设置操作窗口右边界
LCD160160_WR_Byte(0xf7,LCD160160_CMD); LCD160160_WR_Byte(high-1,LCD160160_CMD); // 设置操作窗口下边界
LCD160160_WR_Byte(0xf8,LCD160160_CMD); // 设置窗口操作使能
x=x+0x25;
LCD160160_WR_Byte(x&0x0f,LCD160160_CMD);LCD160160_WR_Byte(0x10|(x>>4),LCD160160_CMD); // 设置起始列地址
LCD160160_WR_Byte(0x60+(y&0x0f),LCD160160_CMD); LCD160160_WR_Byte(0x70+(y>>4),LCD160160_CMD);// 设置起始行地址
p=0; // 数组指针初始化
for(i=0;i<high;i++) // 循环行数数据量
{
for ( j=0;j<width/8;j++) // 循环字节数/行
{
k=BMP1[p++]; // 取图形数据
for (m=0;m<4;m++) // 1 字节转换成4 字节数据写入
{
switch (k&0xc0) // 根据数据位值设置显示数据
{
case 0x00 : Ddata=0x00;break;
case 0x40 : Ddata=0x0f;break;
case 0x80 : Ddata=0xf0;break;
case 0xc0 : Ddata=0xff;break;
}
LCD160160_WR_Byte(Ddata,LCD160160_DATA); //数据写入
k=k<<2;
}
}
switch (width%3)
{
case 0 : break;
case 1 : LCD160160_WR_Byte(0x00,LCD160160_DATA); //数据写入;break; //补充余数据为0
case 2 : LCD160160_WR_Byte(0x00,LCD160160_DATA);break;// 补充余数据为0
}
}
}









[/mw_shl_code]
cornrn
2楼-- · 2019-07-20 10:20
 精彩回答 2  元偷偷看……
cornrn
3楼-- · 2019-07-20 17:22
现在加上ZLG_GUI如下[mw_shl_code=cpp,true]/****************************************************************************************
* 文件名:LCDDRIVE.H
* 功能:LCD驱动程序,包括底层驱动,刷新显示子程序。
* 作者:秋水之下
* 日期:2016.06.02
****************************************************************************************/
#ifndef  LCDDRIVE_H
#define  LCDDRIVE_H


/* 定义颜 {MOD}数据类型(可以是数据结构) */
#define  TCOLOR                                uint8

#define  GUI_LCM_XMAX                160                                                        /* 定义液晶x轴的点数 */
#define  GUI_LCM_YMAX                160                                                        /* 定义液晶y轴的点数 */


/****************************************************************************
* 名称:GUI_Initialize()
* 功能:初始化GUI,包括初始化显示缓冲区,初始化LCM并清屏。
* 入口参数:无
* 出口参数:无
* 说明:用户根据LCM的实际情况编写此函数。
****************************************************************************/
extern void  GUI_Initialize(void);


/****************************************************************************
* 名称:GUI_FillSCR()
* 功能:全屏填充。直接使用数据填充显示缓冲区。
* 入口参数:dat                填充的数据
* 出口参数:无
* 说明:用户根据LCM的实际情况编写此函数。
****************************************************************************/
extern void  GUI_FillSCR(TCOLOR dat);


/****************************************************************************
* 名称:GUI_ClearSCR()
* 功能:清屏。
* 入口参数:无
* 出口参数:无
* 说明:用户根据LCM的实际情况编写此函数。
****************************************************************************/
extern void  GUI_ClearSCR(void);


/****************************************************************************
* 名称:GUI_Point()
* 功能:在指定位置上画点。
* 入口参数: x                指定点所在列的位置
*           y                指定点所在行的位置
*           color        显示颜 {MOD}(对于黑白 {MOD}LCM,为0时灭,为1时显示)
* 出口参数:返回值为1时表示操作成功,为0时表示操作失败。(操作失败原因是指定地址超出有
*          效范围)
* 说明:用户根据LCM的实际情况编写此函数。
****************************************************************************/
extern uint8  GUI_Point(uint32 x, uint32 y, TCOLOR color);


/****************************************************************************
* 名称:GUI_ReadPoint()
* 功能:读取指定点的颜 {MOD}。
* 入口参数:x                        指定点所在列的位置
*          y                指定点所在行的位置
*          ret                保存颜 {MOD}值的指针
* 出口参数:返回0时表示指定地址超出有效范围。
* 说明:对于单 {MOD},设置ret的d0位为1或0,4级灰度则为d0、d1有效,8位RGB则d0--d7有效,
*      RGB结构则R、G、B变量有效。
****************************************************************************/
extern int  GUI_ReadPoint(uint32 x, uint32 y, TCOLOR *ret);



/****************************************************************************
* 名称:GUI_HLine()
* 功能:画水平线。
* 入口参数: x0                水平线起点所在列的位置
*           y0                水平线起点所在行的位置
*           x1      水平线终点所在列的位置
*           color        显示颜 {MOD}(对于黑白 {MOD}LCM,为0时灭,为1时显示)
* 出口参数:无
* 说明:对于单 {MOD}、4级灰度的液晶,可通过修改此函数作图提高速度,如单 {MOD}LCM,可以一次更
*      新8个点,而不需要一个点一个点的写到LCM中。
****************************************************************************/
extern void  GUI_HLine(uint32 x0, uint32 y0, uint32 x1, TCOLOR color);



/****************************************************************************
* 名称:GUI_RLine()
* 功能:画垂直线。
* 入口参数: x0                垂直线起点所在列的位置
*           y0                垂直线起点所在行的位置
*           y1      垂直线终点所在行的位置
*           color        显示颜 {MOD}
* 出口参数:无
* 说明:对于单 {MOD}、4级灰度的液晶,可通过修改此函数作图提高速度,如单 {MOD}LCM,可以一次更
*      新8个点,而不需要一个点一个点的写到LCM中。
****************************************************************************/
extern void  GUI_RLine(uint32 x0, uint32 y0, uint32 y1, TCOLOR color);




/****************************************************************************
* 名称:GUI_CmpColor()
* 功能:判断颜 {MOD}值是否一致。
* 入口参数:color1                颜 {MOD}值1
*                   color2                颜 {MOD}值2
* 出口参数:返回1表示相同,返回0表示不相同。
* 说明:由于颜 {MOD}类型TCOLOR可以是结构类型,所以需要用户编写比较函数。
****************************************************************************/
//extern int  GUI_CmpColor(TCOLOR color1, TCOLOR color2);
#define  GUI_CmpColor(color1, color2)        (color1==color2)

/****************************************************************************
* 名称:GUI_CopyColor()
* 功能:颜 {MOD}值复制。
* 入口参数:color1                目标颜 {MOD}变量
*                   color2                源颜 {MOD}变量
* 出口参数:无
* 说明:由于颜 {MOD}类型TCOLOR可以是结构类型,所以需要用户编写复制函数。
****************************************************************************/
//extern void  GUI_CopyColor(TCOLOR *color1, TCOLOR color2);
#define  GUI_CopyColor(color1, color2)         *color1 = color2

extern  void GUI_UpdateDisplay(void);//更新显示

#endif
[/mw_shl_code]
cornrn
4楼-- · 2019-07-20 18:53
 精彩回答 2  元偷偷看……
九都多平
5楼-- · 2019-07-20 23:16
怎么没有找到主函数呢?
cornrn
6楼-- · 2019-07-21 00:12
 精彩回答 2  元偷偷看……

一周热门 更多>