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

2019-07-20 06:52发布

闲来无事拆了一些电网监控盒上面一个液晶是正方形的单 {MOD}屏一看是160*160的,我这边是信利的屏幕找不到资料,不过看电路板猜应该是18脚的通用引脚顺序控制器应该也是UC1698U的,熟悉的8080接口驱动起来。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
15条回答
cornrn
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]

一周热门 更多>