文档库 最新最全的文档下载
当前位置:文档库 › ST7586S驱动程序

ST7586S驱动程序

// ST7586S驱动程序
// 4线串行连接模式
//160X128(宽度X高度)



//写命令函数
void LCDWriteCmd(char cmd)
{
unsigned char i ;
A0 = 0 ; //写命令模式
CS = 0; //使能芯片
for(i = 0; i < 8; i++)
{
SCL = 0;
SDA = 0;
if(cmd&0x80) //先传高位字节,后传低位字节
{
SDA = 1;
}
else
{
SDA = 0;
}
SCL = 1;
cmd << 1;
}
CS = 1;
}




//写数据函数
void LCDWriteData(char data)
{
unsigned char i ;
A0 = 1 ; //写命令模式
CS = 0; //使能芯片
for(i = 0; i < 8; i++)
{
SCL = 0;
SDA = 0;
if(data&0x80) //先传高位字节,后传低位字节
{
SDA = 1;
}
else
{
SDA = 0;
}
SCL = 1;
data << 1;
}
CS = 1;
}


//设置起始行列
//ys为起始行,xs为起始列, ye为结束行, xe为结束列
//xe与xs的差值即字的宽度, ye与ys的差值即字的高度
//因为ST7586S每行实际包括了3个点,所以xe不能大于(液晶宽度/3)
void LCDSetXY(char xs, char ys, char xe, char ye )
{
LCDWriteCmd(0x2A); //设置列地址(横坐标)
LCDWriteData(0x00);
LCDWriteData(37+xs); //因为液晶映射到DDRAM的段是从SEG111- SEG278,所以行地址需要加一个偏移量(111/3)
LCDWriteData(0x00); //此偏移量根据液晶具体映射段来确定
LCDWriteData(37+xe);

LCDWriteCmd(0x2B); //设置行地址(纵坐标)
LCDWriteData(0x00);
LCDWriteData(ys);
LCDWriteData(0x00);
LCDWriteData(ye);
}



//清屏函数
void LCD_ClrScreen(void)
{
LCDSetXY(0, 0, 127, 159);
LCDWriteCmd(0x2C); //向DDRAM写入显示数据
for(i=0;i<160;i++)
{
for(j=0;j<128;j++)
{
LCDDataWrite(value);
}
}
}





//初始化函数
void LCDInit(void)
{
RST = 0;
Delay_ms(20) //延时20ms
RST = 1;
Delay_ms(200); //延时200ms

LCDWriteCmd(0xD7); //禁止自动读取
LCDWriteData(0x9F);
Delay_ms(100);

LCDWriteCmd(0x11); //退出休眠模式

LCDWriteCmd(0xC0); //调节液晶操作电压VOP至16.5V
LCDWriteData(0x50);
LCDWriteData(0x01);

LCDWriteCmd(0xC3); //调节液晶电压偏离率 bias = 1/12
LCDWriteData(0x02); //请根据使用的液晶具体参数来设定bias

LCDWriteCmd(0xC4); //调节升压器倍数 Booster = X7;
LCDWriteData(0x06); //请根据使用的液晶具体参数来设定Booster

LCDWriteCmd(0xD0); //使能模拟电路
LCDWriteData(0x1D);

LCDWirteCmd(0x39); //选择黑白模式

LCDWriteCmd(0x3A); //使能DDRAM接口
LCDWriteData(0x02);

LCDWriteCmd(0x36); //设置DDRAM扫描方向
LCDWriteData(0x00); // CMO->COM159 , SEG0->SEG383

LCDWriteCmd(0xB0); //设置液晶显示Duty为 128;
LCDWriteData(0x7F); //0x9f-160

, 0x7f - 128

LCDWriteCmd(0x20); //正常显示模式(反相显示模式关闭)

LCDWriteCmd(0xB1); //设置扫描起始行从COM0开始
LCDWriteData(0x00);

LCDWriteCmd(0x29); //开启LCD显示

LCD_BPWR_ON; //开启液晶背光

LCD_ClrScreen(); //清屏

}

//显示单个ASCLL字符或者汉字(最大字宽30)
//col:起始列(横坐标); row: 起始行(纵坐标)
//width:字模宽度; height:字模高度
//*lattice:字模数据
//convert:显示模式 0为正常显示, 1为反相显示
//取模软件 PCtoLCD2002完美版(阴码,逐行式,顺向(高位在前,低位在后)

void LCDPaint(u16 col,u16 row,u16 width,u16 height,uc8 *lattice,u8 convert)
{
u16 i,j,w, col_end, len,k;
u32 data;
unsigned char temp ,str;
col_end = col + width/3 - 1; // st77586s使用一个八位数据来显示3个格点,所以横向取模时width必须为3的整数倍
w = width/3; // 纵向取模时 height必须为3的整数倍
if(width%8 == 0) //计算一行格点的字节数
{
len = width/8;
}
else
{
len = width/8 + 1;
}
LCDSetXY(col, row, col_end, row+height-1); //设置显示区域
LCDWriteCmd(0x2C); //向DDRAM写入显示数据
for(i=0;i{
data = *lattice;
for(j = 0; j < len - 1; j++) //将字模每一行的数据首尾衔接合并
{
lattice++;
data = (data << 8)|(*lattice);
}
data = data >> (len*8-width); //移去取模软件自动扩充的数据
for(k = 1; k < w + 1; k++)
{
temp = (data >> (width - 3*k))&0x07; //每一行从左至右每次取3个格点(对应一个8位的DDRAM数据)
switch(temp)
{
case 0x00:
str = 0x00; break;
case 0x01:
str = 0x03; break;
case 0x02:
str = 0x1C; break;
case 0x04:
str = 0xE0; break;
case 0x03:
str = 0x1F; break;
case 0x06:
str = 0xFC; break;
case 0x05:
str = 0xE3; break;
case 0x07:
str = 0xFF; break;
}
LCDWriteData(str^convert);
}
lattice++;
}
}

//2的字模
//字体:Gulim
//24X40
unsigned char str[120] = {

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x7F,0x80,0x01,0xFF,0xE0,0x07,0xC0,0xF8,0x0F,0x00,0x38,0x0E,0x00,0x1C,0x1C,0x00,
0x1E,0x1C,0x00,0x0E,0x1C,0x00,0x0E,0x1C,0x00,0x0E,0x1C,0x00,0x0E,0x00,0x00,0x0E,
0x00,0x00,0x1C,0x00,0x00,0x3C,0x00,0x00,0x78,0x00,0x00,0xF0,0x00,0x03,0xC0,0x00, //2
0x07,0x00,0x00,0x1E,0x00,0x00,0x78,0x00,0x01,0xE0,0x00,0x03,0x80,0x00,0x07,0x00,
0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x18,0x00,0x00,0x38,0x00,0x00,
0x3F,0xFF,0xFF,0x3F,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};


void main()
{
LCDInit(); //初始化液晶
LCDPaint(0, 0, 24, 40, &s

tr[0], 0); //显示数字2
}


相关文档