汉修先生测试及答案:128*64(ST7565P控制器)程序

来源:百度文库 编辑:偶看新闻 时间:2024/04/28 14:30:40
128*64(ST7565P控制器)程序参考 //ST7565P控制器(128*64)
//这些参考程序是在项目中提取出来的,希望能够给大家提供一个参考
//有并行和串行两种接法,我用的是串行输出

//定义LCD显示的全局变量
#define CS (1<<2) // Out
#define A0 (1<<3) // Out
#define SI (1<<4) // Out
#define SCL (1<<5) // Out
#define RST (1<<6) // Out
#define LCD_LED (1<<7)// Out

#define LCD_DATA 1
#define LCD_COMMAND 0

BYTE gContrast=40; // LCD 对比度0-63
//--------------------------------------------------------------------------
//液晶屏初始化
//--------------------------------------------------------------------------
void LCDInit(void)
{
CLR(rPDATC,RST); // RST=0;
DelayMS(50);
SET(rPDATC,RST); // RST=1;
DelayMS(50);
LCDWriteByte(0xa2,LCD_COMMAND); //lcd bias select 1/9 BIAS
LCDWriteByte(0xa1,LCD_COMMAND); //ADC select,REVERSE 127-->0(a0,a1)
LCDWriteByte(0xc0,LCD_COMMAND); //com select,NORMAL 0-->63(c8,c0)
LCDWriteByte(0x26,LCD_COMMAND); //RESISTOR RATIO
LCDWriteByte(0x81,LCD_COMMAND); //ELECTRONIC VOLUME mode setting 100B 对比度命令
LCDWriteByte(0x10,LCD_COMMAND); //Set reference voltagel register 对比度数值
LCDWriteByte(0x2f,LCD_COMMAND); //power control(VB,VR,VF=1,1,1)
DelayMS(50);
LCDWriteByte(0xaf,LCD_COMMAND); //set display on
LCDWriteByte(0xf8,LCD_COMMAND); //set booster ratio
LCDWriteByte(0x00,LCD_COMMAND);
}
//--------------------------------------------------------------------------
//写数据或命令(串行方式)
//--------------------------------------------------------------------------
void LCDWriteByte(char data,BYTE command)
{
CLR(rPDATC,CS); //CS=0
if(command == 0)
{
CLR(rPDATC,A0); //A0=0,命令
LCDShiftWrite(data);
}
else
{
SET(rPDATC,A0); //A0=1,数据
LCDShiftWrite(data);
}
SET(rPDATC,CS); //CS=1;
}
//--------------------------------------------------------------------------
//串口移位输出
//--------------------------------------------------------------------------
void LCDShiftWrite(char data)
{
unsigned char i;
unsigned char Series,Temp;

CLR(rPDATC,SCL); //SCL=0
Series = data;
for(i=8;i>0;i--)
{
CLR(rPDATC,SCL); //SCL=0
Temp=Series & 0x80;
if(Temp)
{
SET(rPDATC,SI);//SI=1
}
else
{
CLR(rPDATC,SI);//SI=0
}
SET(rPDATC,SCL); //SCL=1
Series = Series << 1;
}
}
//--------------------------------------------------------------------------
//LCDSetXY: 设置LCD坐标函数
//输入参数:X:0-127 Y:0-8
//
//编写日期:2006-1-17
//
//最后修改日期:
//--------------------------------------------------------------------------
void LCDSetXY(BYTE x, BYTE y)
{
LCDWriteByte(0xB0|y,LCD_COMMAND);// Page(Row)
LCDWriteByte(0x10|((x+4)>>4),LCD_COMMAND);// Column high
LCDWriteByte((0x00|(x+4))&0x0f,LCD_COMMAND);// Column low
}
//--------------------------------------------------------------------------
//LCD_clear: LCD清屏函数
//
//编写日期:2006-1-17
//
//最后修改日期:
//--------------------------------------------------------------------------
void LCDcls(void)
{
UINT32 i,n;

for(i=0;i<9;i++)
{
LCDSetXY(0,i);

for(n=0;n<128;n++)
{
LCDWriteByte(0x00,LCD_DATA);
}
}

}
//--------------------------------------------------------------------------
// 清屏,窗口范围内清零
//--------------------------------------------------------------------------
void LCDclsWin(BYTE Row1,BYTE Col1,BYTE Row2,BYTE Col2)
{
UINT32 i,j;

if (Row2>8)
Row2=8;
if (Col2>127)
Col2=127;
for(i=Row1;i<=Row2;i++)
{
LCDSetXY(Col1,i);
for(j=Col1;j{
LCDWriteByte(0x00,LCD_DATA);
}
}
}

//--------------------------------------------------------------------------
//液晶屏RESET
//--------------------------------------------------------------------------
void LCDReset(void)
{
LCDWriteByte(0xe2, LCD_COMMAND);
}
//--------------------------------------------------------------------------
//关液晶屏
//--------------------------------------------------------------------------
void LCDOff(void)
{
LCDWriteByte(0xae, LCD_COMMAND);
}
//--------------------------------------------------------------------------
//调节对比度
//--------------------------------------------------------------------------
void LCDContrast(BYTE Level)
{
BYTE Num,Temp1,Temp2;
Temp1 = (Level/16)<<4;
switch(Level%16)
{
case 10:
Temp2 = 0x0a;
break;
case 11:
Temp2 = 0x0b;
break;
case 12:
Temp2 = 0x0c;
break;
case 13:
Temp2 = 0x0d;
break;
case 14:
Temp2 = 0x0e;
break;
case 15:
Temp2 = 0x0f;
break;
default:
Temp2 = Level%16;
break;
}
Num = Temp1|Temp2;
LCDWriteByte(0x81,LCD_COMMAND);
LCDWriteByte(Num,LCD_COMMAND);
}