📄 lcd4.11.txt
字号:
{
CLI(); //disable all interrupts
port_init();
SEI(); //re-enable interrupts
}
*******************************************************/
//////////////LCD复位程序//////////////////////
void LCD_Reset(void )
{
//*********
AT91F_PIO_CfgOutput( AT91D_BASE_PIO_RST, AT91B_RST ) ;
AT91F_PIO_SetOutput( AT91D_BASE_PIO_RST, AT91B_RST );
delay(50); //1us 根据RESET的时序图
AT91F_PIO_ClearOutput( AT91D_BASE_PIO_RST, AT91B_RST );
delay(50); //1us
AT91F_PIO_SetOutput( AT91D_BASE_PIO_RST, AT91B_RST );
//************
}
/////////////////////LCD初始化//////////////////////////
void WriteDDRAM(void)
{
LCD_CmdWrite(0x0030);
LCD_CmdWrite(0x00AE);
LCD_CmdWrite(0x0007);
LCD_DataWrite(0x0019);
LCD_CmdWrite(0x0031);
LCD_CmdWrite(0x00CD);
LCD_DataWrite(0x0020);
delay(50000000); //100ms 据说明书 不知道看的对不对????????
LCD_CmdWrite(0x00FC);//写入RAM
delay(50000000); //100ms
LCD_CmdWrite(0x00CC);//取消RAM
LCD_CmdWrite(0x0030);
LCD_CmdWrite(0x00AF);//显示
delay(50000000); //100ms
}
void ReadDDRAM(void)
{//read sram
LCD_CmdWrite(0x0030);
LCD_CmdWrite(0x0007);
LCD_DataWrite(0x0019);
LCD_CmdWrite(0x0031);
LCD_CmdWrite(0X00CD);
LCD_DataWrite(0X0000);
delay(500000); //100ms
LCD_CmdWrite(0X00FD); //start read
delay(500000); //100ms
LCD_CmdWrite(0X00CC);
LCD_CmdWrite(0x0030); //ext=0
}
void LCD_INITIAL(void)
{
LCD_CmdWrite(0X0030); // EXT=0
LCD_CmdWrite(0X0094); // SLEEP OUT
LCD_CmdWrite(0X00D1); // INTERNAL OSCILLATION ON
LCD_CmdWrite(0X0094); // SLEEP OUT
LCD_CmdWrite(0X0020); // POWER CONTROL SET
LCD_DataWrite(0X000B); //booster must be on fist
delay(500000); //1ms
LCD_CmdWrite(0X0020); // POWER CONTROL SET
LCD_DataWrite(0X000B); // TURN ON BOOSTER AND REFERENCE VOLTAGE GENERATION CIRCUIT ;0bh
LCD_CmdWrite(0X0081); //ELECTRONIC CONTROL EC control
LCD_DataWrite(0X0012); //Vop=18.0V???????????????///////
LCD_DataWrite(0X0012); //Vop=18.0V
//LCD_DataWrite(0X00D6); //EC increase 1
LCD_CmdWrite(0X00CA); // DISPLAY CONTROL
LCD_DataWrite(0X0000); // CL DIVIDING RATIO ,F1 AND F2 DRIVE PATTERN
LCD_DataWrite(0X0027); // DIVER DUTY duty=160
LCD_DataWrite(0X0000); // FR INVERSE-SET VALUE
LCD_CmdWrite(0X00A6); //normal display
LCD_CmdWrite(0X00BB); // com scan direction
LCD_DataWrite(0X0001); //C0M0-->COM79,C0M159-->COM80
LCD_CmdWrite(0X00BC); //data scan direction
LCD_DataWrite(0X0001);
LCD_DataWrite(0X0000);
LCD_DataWrite(0X01);
LCD_CmdWrite(0X0075); //LINE ADDRESS SET
LCD_DataWrite(0X0000);
LCD_DataWrite(0X009F);
LCD_CmdWrite(0X0015); //COLUMN ADDRESS SET
LCD_DataWrite(0X0000);
LCD_DataWrite(0X0054);
LCD_CmdWrite(0X0031); //ExtOut
LCD_CmdWrite(0X0032); //ANALOG CIRCUIT SET
LCD_DataWrite(0X0000); //OSC frequence
LCD_DataWrite(0X0001);
LCD_DataWrite(0X0000);
LCD_CmdWrite(0X0034); //SOFTWARE INITIAL
ReadDDRAM();
LCD_CmdWrite(0X0030); //ExtIn
delay(500000); //100ms
LCD_CmdWrite(0X00AF); //DISPLAY ON
// for(i=0;i<LCD_YSIZE;i++) //初始化显示缓冲区,0xffff为全白色
// {
// for(j=0;j<LCD_XSIZE/3+1;j++)
// ScanBuff[i][j] = 0xffff;
// }
}
///////////////////设置XY坐标/////////////////////////
void SetAddress(unsigned char ucXpos,unsigned char ucYpos)
{
LCD_CmdWrite(0X0030); //EXT=0
LCD_CmdWrite(0X0075); //THIRD COMMAND SET LINE ADDRESS
LCD_DataWrite(ucXpos); //START LINE
LCD_DataWrite(0x009F); //END LINE
LCD_CmdWrite(0X0015); //THIRD COMMAND SET COLUMN ADDRESS
LCD_DataWrite(ucYpos); //START COLUMN
LCD_DataWrite(0x0053); //END COLUMN
}
///////////////////////读写函数///////////////////////////////////////////
void LCD_DataWrite(unsigned char Data_Data)
{
*(AT91C_SMC_BASE_Data ) = Data_Data;
}
void LCD_CmdWrite(unsigned char Cmd_Data)
{
*(AT91C_SMC_BASE_Cmd ) = Cmd_Data;
}
unsigned char Data;
unsigned char LCD_DataRead(void)
{
Data = *(AT91C_SMC_BASE_Data );
return Data; //返回判断
}
///////////////////LCD的点测试程序/////////////////////
void WretPointTest(unsigned char ucData)
{
unsigned char i=0,l=0;
LCD_CmdWrite(0X0030); //EXT=0
LCD_CmdWrite(0X0075); //THIRD COMMAND SET LINE ADDRESS
LCD_DataWrite(0x0000); //START LINE
LCD_DataWrite(0X009f); //END LINE
LCD_CmdWrite(0X0015); //THIRD COMMAND SET COLUMN ADDRESS
LCD_DataWrite(0X0000); //START COLUMN
LCD_DataWrite(0X0054); //END COLUMN 设定行从0行开始到159行结束
LCD_CmdWrite(0X005C); //DATA WRITE writing to memery
LCD_CmdWrite(0X0031); //EXT=1
for(i=0;i<160;i++)
{
for (l=0;l<162;l++)
{
LCD_DataWrite(ucData);
}
}
}
//////////////////////在坐标XY处开始写入1个点的数据,并且保持处于这列中的其它两个值不变////////////////////////
void WriteXY(unsigned char ucXpos,unsigned char ucYpos,unsigned char ucData)
{
unsigned char ucData1,ucData2,ucData3,ucCol=0,ucSet=0;
ucCol=ucYpos/3;//[得到Y轴上的列,一些写一个列,一个列里包含3个数据]
ucSet=ucYpos%3;//[得到块上3个点中的一个]
SetAddress(ucXpos,ucCol); //[因为选择了行不变,而列由3个竖条小列组成,所以一次要写3个点]
LCD_CmdWrite(0x005D); //从RAM内读坐标的值
LCD_DataRead(); //[空读一个头数据]
ucData1=LCD_DataRead(); //[读取原来的3个点的值]
ucData2=LCD_DataRead();
ucData3=LCD_DataRead();
SetAddress(ucXpos,ucCol); //在指定坐标的RAM内写入显示值
LCD_CmdWrite(0x005C);
switch(ucSet)
{
case 0:
ucData1=ucData;
ucData2=0x0000;
ucData3=0x0000;
break;
case 1:
ucData1=0x0000;
ucData2=ucData;
ucData3=0x0000;
break;
case 2:
ucData1=0x0000;
ucData2=0x0000;
ucData3=ucData;
break;
}
LCD_DataWrite(ucData1); //[写入新点的值,并且保持原来两个点的值不变]
LCD_DataWrite(ucData2);
LCD_DataWrite(ucData3);
}
/////////////////////////主程序////////////////////////////////////
void main(void)
{
AT91F_InitSMC();
LCD_Reset();
LCD_INITIAL();
//WriteDDRAM();
delay(5000); //10ms
//while(1)
for(;;)
{
LCD_CmdWrite(0x005C);
LCD_DataWrite(0x0055);
delay(5000); //10ms
LCD_DataWrite(0x00AA);
delay(5000); //10ms
// asm("nop");
// asm("nop");
//asm("nop");
//asm("nop");
//asm("nop");
//asm("nop");
LCD_DataRead();
//WretPointTest(0x0055);
LCD_DataRead();
// WriteXY(2,30,0x55);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -