📄 lcd.c
字号:
#include "Lcd.h"
#include "Board.h"
void _nop_()
{
int i;
for (i=0;i<100;i++);
}
void DelayUs(int us_time)
{
int i;
for (i = 0;i <100*us_time; i++);
}
void DelayMs(int ms_time)
{
int i;
for( i = 0 ; i < 1000*ms_time ; i++ );
}
/*=======================================================
显示光标定位
=======================================================*/
void LocateXY( char posx,char posy) {
Uchar cmd;
cmd = 0x80 | posx << 6 | posy;
LcdWriteCommand(cmd,1);
}
/*=======================================================
按指定位置显示数出一个字符
=======================================================*/
void DispOneChar(Uchar x,Uchar y,Uchar Wdata)
{
LocateXY( x, y ); // 定位显示地址
LcdWriteData( Wdata ); // 写字符
}
/*=======================================================
显示字符串
=======================================================*/
void ePutstr(Uchar x,Uchar y, Uchar *ptr)
{
Uchar i,l=0;
while (ptr[l] >31)
{l++;};
for (i=0;i<l;i++)
{
DispOneChar(x,y++,ptr[i]);
if ( x == 16 )
{
x = 0; y ^= 1;
}
}
}
void LcdReset( void )
{
LcdWriteCommand( 0x38, 0); // 显示模式设置(不检测忙信号)
DelayMs(5);
LcdWriteCommand( 0x38, 0); // 共三次
DelayMs(5);
LcdWriteCommand( 0x38, 0);
DelayMs(5);
LcdWriteCommand( 0x38, 1); // 显示模式设置(以后均检测忙信号)
LcdWriteCommand( 0x08, 1); // 显示关闭
LcdWriteCommand( 0x0c, 1); // 显示清屏
// LcdWriteCommand( 0x0f, 1); // 显示光标移动设置
LcdWriteCommand( 0x01, 1); // 显示开及光标设置
LcdWriteCommand( 0x06, 1); //地址指针设置
}
/*=======================================================
写控制字符子程序: E=1 RS=0 RW=0
=======================================================*/
void LcdWriteCommand( Uchar CMD,Uchar AttribC )
{
_nop_();
if (AttribC) WaitForEnable(); // 检测忙信号?
AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, RS); //RS = 0;
AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, RW); // RW = 0;
AT91F_PIO_CfgOutput( AT91C_BASE_PIOA, LCM_PORT );
_nop_();
AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, LCM_PORT);
AT91F_PIO_SetOutput( AT91C_BASE_PIOA, CMD<<24);// DataPort = CMD;
_nop_(); // 送控制字子程序
AT91F_PIO_SetOutput( AT91C_BASE_PIOA, ELCM); //Elcm = 1;
_nop_();
_nop_();
AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, ELCM); //Elcm =0;
// 操作允许脉冲信号
}
/*=======================================================
当前位置写字符子程序: E =1 RS=1 RW=0
=======================================================*/
void LcdWriteData( char dataW )
{
WaitForEnable(); // 检测忙信号
AT91F_PIO_SetOutput( AT91C_BASE_PIOA, RS); //RS = 1;
AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, RW); // RW = 0;
_nop_();
AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, LCM_PORT);
AT91F_PIO_SetOutput( AT91C_BASE_PIOA, dataW<<24);// DataPort = LCM_DATA ;
_nop_();
AT91F_PIO_SetOutput( AT91C_BASE_PIOA, ELCM); //Elcm = 1;
_nop_();
_nop_();
AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, ELCM); //Elcm =0;
}
/*=======================================================
正常读写操作之前必须检测LCD控制器状态: CS=1 RS=0 RW=1
DB7: 0 LCD控制器空闲; 1 LCD控制器忙
========================================================*/
void WaitForEnable( void )
{
AT91F_PIO_SetOutput( AT91C_BASE_PIOA, 0xff000000); //DataPort = C;
AT91F_PIO_CfgInput(AT91C_BASE_PIOA, LCM_PORT) ;
AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, RS); //RS = 0;
AT91F_PIO_SetOutput( AT91C_BASE_PIOA, RW); // RW = 1;
_nop_();
AT91F_PIO_SetOutput( AT91C_BASE_PIOA, ELCM); //Elcm = 1;
_nop_();
_nop_();
int z;
z= AT91F_PIO_GetInput(AT91C_BASE_PIOA);
while((AT91F_PIO_GetInput(AT91C_BASE_PIOA) >>24) & Busy );
AT91F_PIO_CfgOutput( AT91C_BASE_PIOA, LCM_PORT );
AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, ELCM); //Elcm =0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -