test.c

来自「SMC1602字符液晶的显示程序」· C语言 代码 · 共 240 行

C
240
字号
#include"reg51.h"
#define SELECT_LCD()	CS0=0; CS1=1; CS2=0
#define SELECT_NONE()	CS0=1; CS1=1; CS2=1

sbit CS0 = P2^5 ;
sbit CS1 = P2^6 ;
sbit CS2 = P2^7 ;
sbit Lcd_RW = P2^4 ;
sbit Lcd_RS = P2^3 ;
sbit P11=P1^1;
sbit P10=P1^0;

/*******************  函数声明 ********************/
void LcdWrite(unsigned char value , bit RS);
unsigned char LcdRead(bit RS);
void LcdWriteCmd(unsigned char value , unsigned char attrib);
void LcdWriteData(unsigned char value);
unsigned char LcdReadData();
void delay(unsigned int time); 
void LcdInit(void);
void LocateXY(char x , char y);
void PutChar(char x , char y , char value);
void PutStr(char x , char y , char* str);
void display(unsigned char next);

void LcdWrite(unsigned char value , bit RS)
{
	/* 1. 设置RS信号线 */
	Lcd_RS = RS ;
	/* 2. 设置RW信号线为读 */
	Lcd_RW = 0 ;
	/* 3. 设置LCD片选 */
	SELECT_LCD();
	/* 4. 通过P0端口写值 */
	P0 = value ;
	/* 5. 锁存 */
	SELECT_NONE();
}

/***************************************
说明: 	LCD读函数,完成LCD读操作的物理时序
RS:		0 - 写指令
		1 - 写数据
return:	读出的具体值
*****************************************/
unsigned char LcdRead(bit RS)
{
	unsigned char rt ;

	/* 1. 设置RS信号线 */
	Lcd_RS = RS ;
	/* 2. 设置RW信号线为读 */
	Lcd_RW = 1 ;
	/* 3. 释放P0口 */
	P0 = 0xff ;
	/* 4. 设置LCD片选 */
	SELECT_LCD();
	SELECT_LCD();
	SELECT_LCD();
	SELECT_LCD();
	/* 5. 通过P0端口读值 */
	rt = P0 ;
	/* 6. 锁存 */
	SELECT_NONE();

	return rt ;
}	

/***************************************
说明: 	LCD写指令
value:	写的具体值
attrib:	0 - 不检测忙信号
	   	1 - 监测忙信号
*****************************************/
void LcdWriteCmd(unsigned char value , unsigned char attrib)
{
	/* 监测忙状态 */
	if(attrib)
		while( LcdRead(0)&0x80 ) ;
	
	LcdWrite(value , 0);
 }

/***************************************
说明: 	LCD写数据
*****************************************/
void LcdWriteData(unsigned char value)
{
 	/* 监测忙状态 */
	while( LcdRead(0)&0x80 ) ;

	LcdWrite(value , 1);
}

/***************************************
说明: 	LCD读数据
*****************************************/
unsigned char LcdReadData()
{
	/* 监测忙状态 */
	while( LcdRead(0)&0x80 ) ;

	return LcdRead(1);
}


/***************************************
说明: 	LCD初始化函数,需要按照产品
        说明书完成
*****************************************/
void LcdInit(void)
{
	delay(800);

	/* 写指令0x38连续3次, 不检测忙信号*/
	LcdWriteCmd(0x38 , 0 );
	delay(10);

	LcdWriteCmd(0x38 , 0 );
	delay(10);

	LcdWriteCmd(0x38 , 0 );
	delay(10);

	/* 以后的读写操作均要判断忙信号 */
	LcdWriteCmd(0x38 , 1 );
	/* 先设置关屏 */
	LcdWriteCmd(0x08 , 1 );
	/* 清屏 */
	LcdWriteCmd(0x01 , 1 );
	/* 设置光标显示模式 */
	LcdWriteCmd(0x06 , 1 );
	/* 开屏并显示光标 */
	LcdWriteCmd(0x0c , 1 );
}

/***************************************
说明: 	设置光标定位
*****************************************/
void LocateXY(char x , char y)
{
	unsigned char temp;

	temp = x & 0xf;
	y &= 0x1;
	if ( y )temp |= 0x40;
	temp |= 0x80;
	LcdWriteCmd(temp,1);
}

/***************************************
说明: 	显示字符
x: 横坐标 y: 纵坐标
value: 显示的字符
*****************************************/
void PutChar(char x , char y , char value)
{
	LocateXY(x,y);
	LcdWriteData(value);
}

/***************************************
说明: 	显示字符串
*****************************************/
void PutStr(char x , char y , char* str)
{
	unsigned char i,len=0;
	/* 计算字符串长度 */
	while (str[len] >31)
		len++;
	
	/* 显示字符串 */
	for (i=0;i<len;i++) 
	{   
        PutChar(x++,y,str[i]);
		if ( x == 16 )
		{
			x = 0; y ^= 1;
		}
	}
}
void display(unsigned char next)
{
    unsigned char i;
     for(i=0;i<16;i++)
      {
	    PutChar(i,1,next);
	    next&=0x7f;
	    if(next<32)next=32;
       }
      
}


void delay(unsigned int time)     // time*0.5ms延时
{
   unsigned int i,j;
   P10=0;

   for(j=0;j<time;j++)
     {
       for(i=0;i<60;i++)
       {;}
      }
}

void main()
{
	char i = 0 ;
    unsigned char second=32;
    delay(800);
	
	LcdInit();

	
	PutStr(0,0," YE JIAN DONG ");
    
	display(second);
	delay(2000);
	while(1)
	{
	 	 
	 second&=0x7f;
	 if(second<32)second=32;
	 display(second++);
	 delay(800);
	 }
}
     
 









⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?