OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 17506|回复: 31

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

[复制链接]

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1476
金钱
1476
注册时间
2014-5-21
在线时间
342 小时
发表于 2016-6-3 16:47:40 | 显示全部楼层 |阅读模式
闲来无事拆了一些电网监控盒上面一个液晶是正方形的单色屏一看是160*160的,我这边是信利的屏幕找不到资料,不过看电路板猜应该是18脚的通用引脚顺序控制器应该也是UC1698U的,熟悉的8080接口驱动起来。
2.jpg

UC1698u-Datasheet.pdf

655.42 KB, 下载次数: 1514

UC1698u-中文数据手册.pdf

709.64 KB, 下载次数: 1993

深圳安的利 ANDORIN 160160液晶手册 [ UC1698u ].pdf

334.37 KB, 下载次数: 1501

天马 TIANMA 160160中文手册.pdf

611.18 KB, 下载次数: 1539

信利 TRULY 160160液晶手册 [ UC1698u ].pdf

623.07 KB, 下载次数: 1548

彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1476
金钱
1476
注册时间
2014-5-21
在线时间
342 小时
 楼主| 发表于 2016-6-3 16:49:30 | 显示全部楼层
[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);                                  //彩色数据格式R-G-B
        //LCD160160_WR_Byte(0xd0,LCD160160_CMD);              //彩色数据格式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]
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 1 反对 0

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1476
金钱
1476
注册时间
2014-5-21
在线时间
342 小时
 楼主| 发表于 2016-6-3 16:48:57 | 显示全部楼层
[mw_shl_code=cpp,true]#ifndef __LCD160160_H
#define __LCD160160_H

/**************************************************************************************
**作者:秋水之下  QQ:858860583.
**说明:160160液晶一般控制器都是UC1698 ,Modules Controlled By UltraChip'S UC1698.
***************************************************************************************/

#include "sys.h"

//PB7~14,作为数据线
#define UC1698U_Bus(DataValue)       {GPIO_Write(GPIOB,(GPIO_ReadOutputData(GPIOB)&0x00FF)|((DataValue<<8)&0XFF00));}  


#define UC1698U_CD_H()     {GPIOB->BSRR = GPIO_Pin_2;}
#define UC1698U_CD_L()     {GPIOB->BRR  = GPIO_Pin_2;}
#define UC1698U_WR_H()     {GPIOB->BSRR = GPIO_Pin_3;}                          
#define UC1698U_WR_L()     {GPIOB->BRR  = GPIO_Pin_3;}
#define UC1698U_RD_H()     {GPIOB->BSRR = GPIO_Pin_4;}                                      
#define UC1698U_RD_L()     {GPIOB->BRR  = GPIO_Pin_4;}
#define UC1698U_CS_H()     {GPIOB->BSRR = GPIO_Pin_5;}
#define UC1698U_CS_L()     {GPIOB->BRR  = GPIO_Pin_5;}
#define UC1698U_RST_H()    {GPIOB->BSRR = GPIO_Pin_6;}
#define UC1698U_RST_L()    {GPIOB->BRR  = GPIO_Pin_6;}



typedef enum {LCD160160_CMD = 0, LCD160160_DATA = !LCD160160_CMD}CMDorDATA;
typedef enum {
  CN_12 = 0,
  ASCII_12 = 0,
        ASCII_16 = 0,
        ASCII_24 = 0
}FontType;

//LCD160160控制用函数
void LCD160160_WR_Byte(u8 dat,CMDorDATA CorD);            
void LCD160160_Display_On(void);
void LCD160160_Display_Off(void);
                                                       
void LCD160160_Init(void);
void LCD160160_Clear(void);
void LCD160160_DrawPoint(u8 x,u8 y,u8 t);
void LCD160160_Fill(u8 x1,u8 y1,u8 x2,u8 y2,u8 dot);
void LCD160160_Print(u8 x, u8 y, u8 index,u8 len,FontType Type);
void LCD160160_DisplayBMP(u8 x,u8 y,u8 width,u8 high);

#endif
[/mw_shl_code]
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1476
金钱
1476
注册时间
2014-5-21
在线时间
342 小时
 楼主| 发表于 2016-6-3 16:50:31 | 显示全部楼层
现在加上ZLG_GUI如下[mw_shl_code=cpp,true]/****************************************************************************************
* 文件名:LCDDRIVE.H
* 功能:LCD驱动程序,包括底层驱动,刷新显示子程序。
* 作者:秋水之下
* 日期:2016.06.02
****************************************************************************************/
#ifndef  LCDDRIVE_H
#define  LCDDRIVE_H


/* 定义颜色数据类型(可以是数据结构) */
#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        显示颜色(对于黑白色LCM,为0时灭,为1时显示)
* 出口参数:返回值为1时表示操作成功,为0时表示操作失败。(操作失败原因是指定地址超出有
*          效范围)
* 说明:用户根据LCM的实际情况编写此函数。
****************************************************************************/
extern uint8  GUI_Point(uint32 x, uint32 y, TCOLOR color);


/****************************************************************************
* 名称:GUI_ReadPoint()
* 功能:读取指定点的颜色。
* 入口参数:x                        指定点所在列的位置
*          y                指定点所在行的位置
*          ret                保存颜色值的指针
* 出口参数:返回0时表示指定地址超出有效范围。
* 说明:对于单色,设置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        显示颜色(对于黑白色LCM,为0时灭,为1时显示)
* 出口参数:无
* 说明:对于单色、4级灰度的液晶,可通过修改此函数作图提高速度,如单色LCM,可以一次更
*      新8个点,而不需要一个点一个点的写到LCM中。
****************************************************************************/
extern void  GUI_HLine(uint32 x0, uint32 y0, uint32 x1, TCOLOR color);



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




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

/****************************************************************************
* 名称:GUI_CopyColor()
* 功能:颜色值复制。
* 入口参数:color1                目标颜色变量
*                   color2                源颜色变量
* 出口参数:无
* 说明:由于颜色类型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]
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1476
金钱
1476
注册时间
2014-5-21
在线时间
342 小时
 楼主| 发表于 2016-6-3 16:50:54 | 显示全部楼层
[mw_shl_code=cpp,true]/****************************************************************************************
* 文件名:LCDDRIVE.C
* 功能:图形液晶160*160驱动(驱动型号为uc1698)。显示是横向字节,高位
*      在前。
* 说明:图形液晶采用UC1698为LCD控制芯片,内带负压产生器,单3.3伏供电,并行接口(使用stm32f103rbt6驱动)。
* 硬件连接:
*            VSS      <===>  GPIOB1
*            C/D      <===>  GPIOB2
*            /WR      <===>  GPIOB3
*            /RD      <===>  GPIOB4
*            /CS      <===>  GPIOB5
*            /RST     <===>  GPIOB6
*            VDD      <===>  GPIOB7
*            D0--D7   <===>  GPIOB8--GPIOB15

****************************************************************************************/
#include "config.h"

//PB7~14,作为数据线
#define UC1698U_Bus(DataValue)       {GPIO_Write(GPIOB,(GPIO_ReadOutputData(GPIOB)&0x00FF)|((DataValue<<8)&0XFF00));}  


#define UC1698U_CD_H()     {GPIOB->BSRR = GPIO_Pin_2;}
#define UC1698U_CD_L()     {GPIOB->BRR  = GPIO_Pin_2;}
#define UC1698U_WR_H()     {GPIOB->BSRR = GPIO_Pin_3;}                          
#define UC1698U_WR_L()     {GPIOB->BRR  = GPIO_Pin_3;}
#define UC1698U_RD_H()     {GPIOB->BSRR = GPIO_Pin_4;}                                      
#define UC1698U_RD_L()     {GPIOB->BRR  = GPIO_Pin_4;}
#define UC1698U_CS_H()     {GPIOB->BSRR = GPIO_Pin_5;}
#define UC1698U_CS_L()     {GPIOB->BRR  = GPIO_Pin_5;}
#define UC1698U_RST_H()    {GPIOB->BSRR = GPIO_Pin_6;}
#define UC1698U_RST_L()    {GPIOB->BRR  = GPIO_Pin_6;}

       
TCOLOR  gui_disp_buf[GUI_LCM_YMAX][GUI_LCM_XMAX/8];                                // 声明GUI显示缓冲区

INT8U Display_On = 0 ;

void LCD_GPIO_Config(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);
       
}
//=============================================================================
//函 数 名:  WriteCommandUC1698U()
//功 能:        写命令到UC1698U
//入口参数: CmdData:命令码
//出口参数: 无
//返 回 值: 无
//=============================================================================
void WriteCommandUC1698U(INT8U CmdData)
{
    UC1698U_CD_L();
          UC1698U_RD_H();               
    UC1698U_CS_L();       
    UC1698U_Bus(CmdData);       
    UC1698U_WR_L();   
    UC1698U_WR_H();               
    UC1698U_CS_H();
}
//=============================================================================
//函 数 名:  WriteDataUC1698U()
//功 能:        写数据到UC1698U
//入口参数: CmdData:写入的数据
//出口参数: 无
//返 回 值: 无
//=============================================================================
void WriteDataUC1698U(INT8U Data)
{
          UC1698U_CD_H();
          UC1698U_RD_H();       
    UC1698U_CS_L();       
    UC1698U_Bus(Data);         
    UC1698U_WR_L();                
    UC1698U_WR_H();       
    UC1698U_CS_H();
}
/* 以下为LCM的用户接口层,主要负责解释用户命令,并发送到LCM,为用户编程提供接口 */
/***********************************************************************
* 名称:LCD_Initialize()
* 功能:LCM初始化,将LCM初始化为纯图形模式,显示起始地址为0x0000,。
* 入口参数:无
* 出口参数:无
* 说明:函数会设置LCM数据总线为输出方式
***********************************************************************/
void  LCD_Initialize(void)
{

        LCD_GPIO_Config();
  UC1698U_RST_L();                 //硬件复位
  delay_ms(100);
        UC1698U_RST_H();
        delay_ms(100);
  WriteCommandUC1698U(0xE2);//命令方式复位
        delay_ms(5);       
       
        //power control                                       
        WriteCommandUC1698U(0xE9);                        //设置偏压比1/10
        WriteCommandUC1698U(0x2B);                        //内部电源DC-DC
        WriteCommandUC1698U(0x24);                        //set temperate compensation as 0%
        WriteCommandUC1698U(0x81);                        //electronic potentionmeter
        WriteCommandUC1698U(198);              //0xc6不起作用

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

        //n-line inversion
        WriteCommandUC1698U(0xc8);
        //WriteCommandUC1698U(0x10);          //enable NIV

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

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

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

        WriteCommandUC1698U(0xf8);                        //inside mode   set window program mode

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

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

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

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

                 
//=============================================================================
//函 数 名: Write8DotsUC1698U()
//功 能:         UC1698U横向写8个点的子函数
//入口参数:  Data:要显示的数据
//出口参数:  无
//返 回 值:  无
//=============================================================================
void Write8DotsUC1698U(INT8U Data)
{
    INT8U  TempData = 0;


   if(Data & 0x80)
       TempData=0xf0;
   if(Data & 0x40)
       TempData|=0x0f;
   WriteDataUC1698U(TempData);

   TempData=0;
   if(Data & 0x20)
       TempData=0xf0;
   if(Data & 0x10)
       TempData|=0x0f;
   WriteDataUC1698U(TempData);

   TempData=0;
   if(Data & 0x08)
       TempData=0xf0;
   if(Data & 0x04)
       TempData|=0x0f;
   WriteDataUC1698U(TempData);

   TempData=0;
   if(Data & 0x02)
       TempData=0xf0;
   if(Data & 0x01)
       TempData|=0x0f;
   WriteDataUC1698U(TempData);

}

//=============================================================================
//函 数 名:  GUI_UpdateDisplay()
//功 能:        更新数据到UC1698U,每次更新16*8点,在定时器中断中每1ms调用一次
//入口参数: 无
//出口参数: 无
//返 回 值: 无
//=============================================================================
void GUI_UpdateDisplay(void)
{
        static INT16U  i=0;
        INT16U j;
        static INT8U  *p;

         if(Display_On == 0)   //检测显示开关标志
            return;

        if(i == 0)
        {
                p =(INT8U*)gui_disp_buf;  

//                WriteCommandUC1698U(0xf4);WriteCommandUC1698U(0x25);                //设置操作窗口左边界
//                WriteCommandUC1698U(0xf5);WriteCommandUC1698U(0x00);                //设置操作窗口上边界
//                WriteCommandUC1698U(0xf6);WriteCommandUC1698U(0x5a);                //设置操作窗口右边界
//                WriteCommandUC1698U(0xf7);WriteCommandUC1698U(0x9f);                //设置操作窗口下边界

                //WriteCommandUC1698U(0xf8);//设置操作窗口操作使能

                WriteCommandUC1698U(0x05);WriteCommandUC1698U(0x12);                //起始列地址
                WriteCommandUC1698U(0x60);WriteCommandUC1698U(0x70);                //起始行地址
        }
                for(j=0;j<16;j++)                           //每次刷新16*8点,可以任意设置,但要保证定时器时间大于刷屏时间
        {         
                Write8DotsUC1698U(*p++);
                i++;               
                if(i%20==0)       
                {
                        WriteDataUC1698U(0x00);
                }
                if(i == 3200) i = 0;
        }
}




/****************************************************************************
*                    与LCM相关的GUI接口函数
****************************************************************************/


/****************************************************************************
* 名称:GUI_FillSCR()
* 功能:全屏填充。直接使用数据填充显示缓冲区。
* 入口参数:dat                填充的数据(对于黑白色LCM,为0的点灭,为1的点显示)
* 出口参数:无
****************************************************************************/
void  GUI_FillSCR(uint8 dat)
{  uint32  i, j;
       
   for(i=0; i<GUI_LCM_YMAX; i++)                // 历遍所有行
   {  for(j=0; j<GUI_LCM_XMAX/8; j++)        // 历遍所有行
      {  gui_disp_buf[j] = dat;                // 填充数据
          }
   }
}


/****************************************************************************
* 名称:GUI_Initialize()
* 功能:初始化GUI,包括初始化显示缓冲区,初始化LCM并清屏。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void  GUI_Initialize(void)
{  
        Display_On = 0;           //关显示刷新
        LCD_Initialize();         // 初始化LCM模块工作模式,纯图形模式
  GUI_FillSCR(0x00); // 初始化缓冲区为0x00,并输出屏幕(清屏)
  Display_On = 1;           //开显示刷新
}

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

uint8 const  DCB_HEX_TAB[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};

/****************************************************************************
* 名称:GUI_Point()
* 功能:在指定位置上画点。
* 入口参数: x                指定点所在列的位置
*           y                指定点所在行的位置
*           color        显示颜色(对于黑白色LCM,为0时灭,为1时显示)
* 出口参数:返回值为1时表示操作成功,为0时表示操作失败。(操作失败原因是指定地址超出有
*          效范围)
* 说明:用户根据LCM的实际情况编写此函数。对于单色,只有一个位有效,则要使用左移的方法
*      实现point_dat = (point_dat&MASK_TAB ) | (color<<n),其它位数的一样
*      处理。
****************************************************************************/
uint8  GUI_Point(uint32 x, uint32 y, TCOLOR color)
{  /* 参数过滤 */
   if(x>=GUI_LCM_XMAX) return(0);
   if(y>=GUI_LCM_YMAX) return(0);
   
   /* 设置缓冲区相应的点 */
   if( (color&0x01) != 0 ) gui_disp_buf[y][x>>3] |= DCB_HEX_TAB[x&0x07];
      else  gui_disp_buf[y][x>>3] &= (~DCB_HEX_TAB[x&0x07]);
   //若不采取定时刷新,则此处增加绘点功能
   return(1);
}

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

   /* 参数过滤 */
   if(x>=GUI_LCM_XMAX) return(0);
   if(y>=GUI_LCM_YMAX) return(0);
  
   /* 取得该点颜色(用户自行更改) */
   bak = gui_disp_buf[y][x>>3];
   if( (bak&DCB_HEX_TAB[x&0x07])!=0 ) *ret = 1;
      else  *ret = 0;
   
   return(1);
}


/****************************************************************************
* 名称:GUI_HLine()
* 功能:画水平线。
* 入口参数: x0                水平线起点所在列的位置
*           y0                水平线起点所在行的位置
*           x1      水平线终点所在列的位置
*           color        显示颜色(对于黑白色LCM,为0时灭,为1时显示)
* 出口参数:无
* 说明:操作失败原因是指定地址超出缓冲区范围。
****************************************************************************/
void  GUI_HLine(uint32 x0, uint32 y0, uint32 x1, uint8 color)
{  uint32  bak;

   if(x0>x1)                                                 // 对x0、x1大小进行排列,以便画图
   {  bak = x1;
      x1 = x0;
      x0 = bak;
   }
   if(x0==x1)
   {  GUI_Point(x0, y0, color);
      return;
   }
   
   do
   {  /* 设置相应的点为1 */
      if(0!=color) gui_disp_buf[y0][x0>>3] |= DCB_HEX_TAB[x0&0x07];
         else  gui_disp_buf[y0][x0>>3] &= (~DCB_HEX_TAB[x0&0x07]);
      /* 刷新显示(一次刷新一字节) */
      //if( (x0&0x07)==0x07 ) LCD_UpdatePoint(x0, y0);
      
      x0++;
   }while(x1>x0);
   
   /* 对最后一点显示操作 */
   if(0!=color) gui_disp_buf[y0][x0>>3] |= DCB_HEX_TAB[x0&0x07];
      else  gui_disp_buf[y0][x0>>3] &= (~DCB_HEX_TAB[x0&0x07]);

   GUI_UpdateDisplay();
}


/****************************************************************************
* 名称:GUI_RLine()
* 功能:画垂直线。
* 入口参数: x0                垂直线起点所在列的位置
*           y0                垂直线起点所在行的位置
*           y1      垂直线终点所在行的位置
*           color        显示颜色(对于黑白色LCM,为0时灭,为1时显示)
* 出口参数:无
* 说明:操作失败原因是指定地址超出缓冲区范围。
****************************************************************************/
void  GUI_RLine(uint32 x0, uint32 y0, uint32 y1, uint8 color)
{  uint32  bak;

   if(y0>y1)                                                 // 对y0、y1大小进行排列,以便画图
   {  bak = y1;
      y1 = y0;
      y0 = bak;
   }
   if(y0==y1)
   {  GUI_Point(x0, y0, color);
      return;
   }
   
   do
   {  GUI_Point(x0, y0, color);                // 逐点显示,描出垂直线
      y0++;
   }while(y1>y0);
   GUI_Point(x0, y0, color);       
}



















[/mw_shl_code]
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2016-9-22
在线时间
4 小时
发表于 2017-3-21 21:03:33 | 显示全部楼层
怎么没有找到主函数呢?
回复 支持 反对

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1476
金钱
1476
注册时间
2014-5-21
在线时间
342 小时
 楼主| 发表于 2017-3-22 20:00:35 | 显示全部楼层
九都多平 发表于 2017-3-21 21:03
怎么没有找到主函数呢?

再工程文件里面找的
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

2

主题

13

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
411
金钱
411
注册时间
2013-8-25
在线时间
57 小时
发表于 2017-3-22 22:09:42 | 显示全部楼层
F429上面的有否?
回复 支持 反对

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1476
金钱
1476
注册时间
2014-5-21
在线时间
342 小时
 楼主| 发表于 2017-3-23 16:52:45 | 显示全部楼层
阿D 发表于 2017-3-22 22:09
F429上面的有否?

照葫芦画瓢还不会吗!!
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

32

主题

286

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1362
金钱
1362
注册时间
2014-3-27
在线时间
357 小时
发表于 2017-5-31 11:36:35 | 显示全部楼层
大爷 给力的一逼啊。谢谢分享。
回复 支持 反对

使用道具 举报

8

主题

58

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
273
金钱
273
注册时间
2016-12-30
在线时间
37 小时
发表于 2017-5-31 14:52:42 | 显示全部楼层
大爷 给力的一逼啊。谢谢分享。
回复 支持 反对

使用道具 举报

0

主题

125

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2728
金钱
2728
注册时间
2015-10-29
在线时间
428 小时
发表于 2017-5-31 17:33:21 | 显示全部楼层
谢谢楼主
回复 支持 反对

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1476
金钱
1476
注册时间
2014-5-21
在线时间
342 小时
 楼主| 发表于 2017-5-31 19:46:42 | 显示全部楼层

不客气。。。
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2017-7-24
在线时间
66 小时
发表于 2018-5-18 15:34:03 | 显示全部楼层
楼主问下下面这个函数
//=============================================================================
//函 数 名: Write8DotsUC1698U()
//功 能:  UC1698U横向写8个点的子函数
//入口参数:  Data:要显示的数据
//出口参数:  无
//返 回 值:  无
//=============================================================================
void Write8DotsUC1698U(INT8U Data)
{
    INT8U  TempData = 0;


   if(Data & 0x80)
       TempData=0xf0;
   if(Data & 0x40)
       TempData|=0x0f;
   WriteDataUC1698U(TempData);

   TempData=0;
   if(Data & 0x20)
       TempData=0xf0;
   if(Data & 0x10)
       TempData|=0x0f;
   WriteDataUC1698U(TempData);

   TempData=0;
   if(Data & 0x08)
       TempData=0xf0;
   if(Data & 0x04)
       TempData|=0x0f;
   WriteDataUC1698U(TempData);

   TempData=0;
   if(Data & 0x02)
       TempData=0xf0;
   if(Data & 0x01)
       TempData|=0x0f;
   WriteDataUC1698U(TempData);

}
这个函数为什么8个点对应4个字节?0x80,0x40,0x20,0x10,0x08,0x040,0x02,0x01分别对应8个点,但是为什么一个字节对应两个点?RGB不是12位写入到16位寄存器中吗?那应该是一个点最少要12位吧?应该写入两个字节,不是吗?
回复 支持 反对

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1476
金钱
1476
注册时间
2014-5-21
在线时间
342 小时
 楼主| 发表于 2018-5-19 09:45:39 | 显示全部楼层
未来 发表于 2018-5-18 15:34
楼主问下下面这个函数
//============================================================================ ...

自己好好想想的
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2018-8-4
在线时间
3 小时
发表于 2018-8-4 15:55:37 | 显示全部楼层
未来 发表于 2018-5-18 15:34
楼主问下下面这个函数
//============================================================================ ...

uc1698这是一个彩色LCD驱动,有160个COM和384个SEG。一个pixel由一个COM和3个SEG组成,分别对应R、G、B三种色彩,即写入的RGB值会分别反映到3个SEG接口上。现在有好多用uc1698驱动单色大LCD屏的做法,其原理是:在硬件连接上,一个pixel只连接一个SEG和COM。软件写入的数据,uc1698依旧会认为是“RGB三色”。软件上,为了方便,把RGB位数设为4bit,这样比较整齐,然后选择Gray ON/OFF模式。这样的话,一个pixel就对应4bit内存,大于等于8次pixel即On,小于8即OFF。

因为,一个pixel就对应4bit内存
回复 支持 反对

使用道具 举报

1

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2019-4-25
在线时间
23 小时
发表于 2019-8-4 23:10:12 | 显示全部楼层
谢啦,mark
回复 支持 反对

使用道具 举报

1

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2019-4-25
在线时间
23 小时
发表于 2019-8-4 23:10:49 | 显示全部楼层
谢谢啦,mark it!
回复 支持 反对

使用道具 举报

0

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2014-5-17
在线时间
12 小时
发表于 2019-8-14 11:20:17 | 显示全部楼层
感谢楼主了,原来这是驱动3色的IC,我在废品站搞了几快这屏,回头试试
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2017-6-26
在线时间
12 小时
发表于 2019-9-19 20:37:46 | 显示全部楼层
在学习中,非常感谢分享~
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2017-6-26
在线时间
12 小时
发表于 2019-9-19 20:38:37 | 显示全部楼层
学习中,非常感谢分享~
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2019-11-6
在线时间
5 小时
发表于 2019-12-24 11:32:20 | 显示全部楼层
CN_1212和BMP1,怎么初始化
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2016-3-8
在线时间
3 小时
发表于 2020-1-14 08:54:50 | 显示全部楼层
感谢大爷分享 我来挖坟了。
回复 支持 反对

使用道具 举报

2

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2015-4-12
在线时间
10 小时
发表于 2020-3-14 14:09:49 | 显示全部楼层
楼主能否上传一个完整的工程文件压缩包。
回复 支持 反对

使用道具 举报

3

主题

12

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2020-4-15
在线时间
9 小时
发表于 2020-4-17 17:33:48 | 显示全部楼层
好东西,学习学习
回复 支持 反对

使用道具 举报

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2019-11-28
在线时间
21 小时
发表于 2020-4-27 10:26:20 | 显示全部楼层
楼主你好,有linux版的驱动吗
回复 支持 反对

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1476
金钱
1476
注册时间
2014-5-21
在线时间
342 小时
 楼主| 发表于 2020-5-9 16:32:17 | 显示全部楼层
柚子00 发表于 2020-4-27 10:26
楼主你好,有linux版的驱动吗

之littlevGL
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2020-6-19
在线时间
3 小时
发表于 2020-9-27 17:17:52 | 显示全部楼层
大佬,怎么翻转90度,有没有相关驱动。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2020-6-19
在线时间
3 小时
发表于 2020-9-28 14:49:27 | 显示全部楼层
dftan 发表于 2020-9-27 17:17
大佬,怎么翻转90度,有没有相关驱动。

解决了
回复 支持 反对

使用道具 举报

0

主题

18

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
290
金钱
290
注册时间
2021-3-4
在线时间
30 小时
发表于 2021-3-4 10:03:38 | 显示全部楼层
在学习,谢谢分享
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2021-3-22
在线时间
0 小时
发表于 2021-3-22 16:33:34 | 显示全部楼层
大佬,有没有相关驱动。
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2021-5-21
在线时间
3 小时
发表于 2022-2-21 16:49:41 | 显示全部楼层
收藏了,写的很详细,有用
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 02:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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