//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);
#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]
* 文件名: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]
一周热门 更多>