📄 lcd_display.c.txt
字号:
#define SCLK_SET PORTA |= BIT(PA5) //PA5作为时钟管脚
#define SCLK_CLR PORTA &= ~BIT(PA5)
#define SID_SET PORTA |= BIT(PA6) //PA6作为数据传输管脚
#define SID_CLR PORTA &= ~BIT(PA6)
#define CS_SET PORTA |= BIT(PA7) //PA7作为片选管脚
#define CS_CLR PORTA &= ~BIT(PA7)
#define SRCLK_SET PORTG = PORTG | BIT(PG4) //将PG4作为时钟输出线
#define SRCLK_CLR PORTG = PORTG & ~BIT(PG4)
#define Uint unsigned int
#define Uchar unsigned char
/*
***********************************************************
*函 数 名: Byte_Transfer
*功 能: 向液晶模块传输一个字节
*输入参数: dat_com:表示数据或指令
flag表示R/W,D/I且flag<4
*输出参数: 无
*返 回 值: 无
*==========================================================
*日 期: 2005.9.20
*作 者: haifengliang
*修改记录:
***********************************************************
*/
void Byte_Transfer(Uchar dat_com,Uint flag)
{
Uchar pb;
Uint i;
//DDRA = 0x1c;
SCLK_CLR;
SID_CLR;
CS_CLR;
CS_SET;
SID_SET;
SCLK_CLR;
SCLK_SET;
SCLK_CLR;
SCLK_SET;
SCLK_CLR;
SCLK_SET;
SCLK_CLR;
SCLK_SET;
SCLK_CLR;
SCLK_SET; //Synchronizing Bit String
switch(flag)
{
case 0: //RW=0,RS=0
SCLK_CLR;
SID_CLR;
SCLK_SET;
SCLK_CLR;
SID_CLR;
SCLK_SET;
break;
case 1: //RW=0,RS=1
SCLK_CLR;
SID_CLR;
SCLK_SET;
SCLK_CLR;
SID_SET;
SCLK_SET;
break;
case 2: //RW=1,RS=0;
SCLK_CLR;
SID_SET;
SCLK_SET;
SCLK_CLR;
SID_CLR;
SCLK_SET;
break;
case 3: //RW=1,RS=1
SCLK_CLR;
SID_SET;
SCLK_SET;
SCLK_CLR;
SID_SET;
SCLK_SET;
break;
default:
break;
}
SCLK_CLR;
SID_CLR;
SCLK_SET; //The first byte is over
pb = dat_com;
pb = pb&0xf0; //obtain the higher 4 data
for(i = 0;i < 4;i++) //OUTPUT HIGHER 4 DATA
{
if((pb & 0x80) != 0)
{
SCLK_CLR;
SID_SET;
SCLK_SET;
}
else
{
SCLK_CLR;
SID_CLR;
SCLK_SET;
}
pb = pb<<1;
}
SID_CLR; //OUTPUT 0000
SCLK_CLR;
SCLK_SET;
SCLK_CLR;
SCLK_SET;
SCLK_CLR;
SCLK_SET;
SCLK_CLR;
SCLK_SET; //the second byte is over
pb = dat_com;
pb = pb&0x0f;
pb = pb << 4;
for(i = 0;i < 4;i++) //OUTPUT LOWER 4 DATA
{
if((pb & 0x80) != 0)
{
SCLK_CLR;
SID_SET;
SCLK_SET;
}
else
{
SCLK_CLR;
SID_CLR;
SCLK_SET;
}
pb = pb << 1;
}
SID_CLR; //OUTPUT 0000
SCLK_CLR;
SCLK_SET;
SCLK_CLR;
SCLK_SET;
SCLK_CLR;
SCLK_SET;
SCLK_CLR;
SCLK_SET; //the third byte is over
}
/*
***********************************************************
*函 数 名: Write_Com
*功 能: 写命令
*输入参数: com:待写指令
*输出参数: 无
*返 回 值: 无
*==========================================================
*日 期: 2005.9.20
*作 者: haifengliang
*修改记录:
***********************************************************
*/
void Write_Com(Uchar com)
{
Uint flag;
flag = 0;
Byte_Transfer(com,flag);
}
/*
***********************************************************
*函 数 名: Write_Dat
*功 能: 写数据
*输入参数: dat:待写数据
*输出参数: 无
*返 回 值: 无
*==========================================================
*日 期: 2005.9.20
*作 者: haifengliang
*修改记录:
***********************************************************
*/
/**********写数据**********/
void Write_Dat(Uchar dat)
{
Uint flag;
flag = 1;
Byte_Transfer(dat,flag);
}
/*
***********************************************************
*函 数 名: Lcd_Init
*功 能: 液晶模块初始化
*输入参数: dat:待写数据
*输出参数: 无
*返 回 值: 无
*==========================================================
*日 期: 2005.9.20
*作 者: haifengliang
*修改记录:
***********************************************************
*/
void Lcd_Init()
{
Write_Com(0x30);//功能设定
delay_ms(5);
Write_Com(0x01);//清屏
delay_ms(5);
Write_Com(0x28); //功能设定,DL=0 asm("nop");
delay_us(100);
Write_Com(0x0c); //显示打开,光标关,反白显示关
delay_us(100);
}
/*
***********************************************************
*函 数 名: Display
*功 能: 字符串或汉字显示
*输入参数: ptr:待显示的字符或汉字
ddram:显示位置0x80<ddram<0x9F
*输出参数: 无
*返 回 值: 无
*==========================================================
*日 期: 2005.9.20
*作 者: haifengliang
*修改记录:
***********************************************************
*/
void Display(const Uchar *ptr,Uchar ddram)
{
Uchar Length_String,Cur_Column;
Uchar i;
Length_String = 0;
while((ptr[Length_String] != '\0') && (Length_String < 0x10))
Length_String++;
if(ddram < 0x88)
hang = 0; //定位行地址:第一行0x80~0x88
else if(ddram < 0x90)
hang = 2; //定位行地址:第三行0x88~0x8F
else if(ddram < 0x98)
hang = 1; //定位行地址:第二行0x90~0x98
else
hang = 3; //定位行地址:第四行0x98~0x9F
lie = 0x0f & ddram;
if(lie > 0x07)
lie = lie-0x08;
Cur_Column = lie*2; //针对字符串
Write_Com(ddram); //定位显示起始地址
for(i = 0;i < Length_String;i++)
{
Write_Dat(ptr[i]); //输出单个字符
Cur_Column++;
if( Cur_Column == 0x10)
{
Cur_Column =0;
hang ++;
switch(hang)
{
case 0:
Write_Com(0x80);
break;
case 2:
Write_Com(0x90);
break;
case 1:
Write_Com(0x88);
break;
case 3:
Write_Com(0x98);
break;
default:
break;
}
if(hang > 3)
{
Write_Com(0x80);
hang = 0;
}
}
}
}
int main(void)
{
flash Uchar STR1[] = " 上海交通大学 ";
Display(STR1,0x88);
while(1)
{
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -