⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd1602.c

📁 1602字符液晶在89C52单片机上的应用实例和在proteus环境下的仿真实例!
💻 C
字号:
#include <reg51.h>
#include "LCD1602.h"
#include "uart.h"
#include "i2c.h"
#define uchar  unsigned char 
#define uint  unsigned int 
#define NOACK 0xaa
uchar LMH=0;	  //高低速
uchar FILESTATE=0;//文件状态
uchar filechoice=0;
uchar filenum=0;
uchar filenum1=0;	//文件序号
uchar filename=0;	//文件名
uchar filetotal=0;	//文件总数
uint num ;
uint time;

void Delay1ms(unsigned int count)
{
	unsigned int i,j;
	for(i=0;i<count;i++)
	for(j=0;j<120;j++);
}
unsigned char key_val(unsigned char key)
{
	switch(key)
	{
		case 0xff: return 0;break;
		case 0xee: return 1;break;
		case 0xed: return 2;break;
		case 0xeb: return 3;break;
		case 0xe7: return 4;break;
		case 0xde: return 5;break;
		case 0xdd: return 6;break;
		case 0xdb: return 7;break;
		case 0xd7: return 8;break;
		case 0xbe: return 9;break;
		case 0xbd: return 10;break;
		case 0xbb: return 11;break;
		case 0xb7: return 12;break;
		case 0x7e: return 13;break;
		case 0x7d: return 14;break;
		case 0x7b: return 15;break;
		case 0x77: return 16;break;
		default: return 0;break;
	}
} 
unsigned char key_scan(void)
{
    unsigned char row, col;
    P1  = 0xF0;
    row = P1&0xF0;
    row = row&0xF0;
    P1  = 0x0F;
    col = P1&0x0F;
    col = col&0x0F;
    return(row|col);
}

uchar key()
{
 uchar keyvalue,keyvalue1;
 keyvalue=key_scan();
 if(keyvalue)
 {
 	Delay1ms(50);
	keyvalue1=key_scan();	//去抖动
	if(keyvalue==keyvalue1){
	return key_val(keyvalue);
	
	}
 }
 return 0;
}

void Uart_init(void)  
{
 TMOD=0x20; 


  TH1=0xFD;//9600 11.0592MHz 
  TL1=0xFD; 
             
  TH1=0xF3;	 //2400 12MHz
 //TL1=0xF9;    //9600 , 12MHz 
  PCON=0x00;
  TR1=1;                
  SCON=0x50;                     
}
 /*
void Uart_init(void)  
{
 TMOD=0x20;              
 TH1=0xE6;
 TL1=0xE6;    //1200 , 12MHz 
 PCON=0x00;
 TR1=1;                
 SCON=0x50;                     
}
   */

// 查询方式从串口接收数据
uchar Uart_getchar(void)
{  
   uint i=0;
   while(!RI){i++;if(i>0x2fff)return 0;}// 
   RI=0;
   return SBUF;
}

// 查询方式向串口发送数据
void Uart_putchar(uchar ch)
{
   SBUF=ch;
   while(!TI);
   TI=0;
}
// 向串口发送一个字符串
void Uart_putString(char *pt)
{
    while(*pt)
	Uart_putchar(*pt++);
}
//向串口发送一个整型数
void Uart_put_uint(uint num)
{
	uchar a;
	a=(num>>8)&0xff;
    Uart_putchar(a);
	a=num&0xff;
	Uart_putchar(a);
}
//从串口接收一个整型数
uint Uart_get_uint(void)
{
	uint num;	
    num=Uart_getchar();
	num=num<<8;
	num+=Uart_getchar();
	return num;
}
//浮点数显示
void floatDisplay(uint t,uchar i)
{
	uchar a[6];
	a[0]=(t/10000)%10+'0';         //取得整数值到数组  
	a[1]=(t/1000)%10+'0';         //取得整数值到数组         	
	a[2]=(t/100)%10+'0';                                     	
	a[3]=(t/10)%10+'0';                                      	                                      	
	a[4]=(t/1)%10+'0';  
	a[5]='\0';
	switch(i)
	{
		case 0:LCD_Print(2,0,a);break;
		case 1:LCD_Print(11,0,a);break;
		case 2:LCD_Print(2,1,a);break;
		default:break;
	}
}
//显示单个数字函数************************************************************************
void LCD_Printnum(unsigned char x, unsigned char y,unsigned char num)
{
   uchar a[2];
   a[1]='\0'; 
   a[0]=num+'0';
		LCD_Print(x,y,a);
}
//XYZ坐标界面显示
void xyzDisplay(uchar i)
{
	uint len,lastlen;
	uchar count;	
	uchar j=0;
	LCD_Print(0,0,"X:00000  Y:00000");
	if(LMH==0)LCD_Print(0,1,"Z:00000      LOW");
	else if(LMH==1)LCD_Print(0,1,"Z:00000      HI ");
	count=key(); 
	RI=0;
	lastlen=len=0;
	while(count!=10&&count!=14)
	{
		switch(count)
			{
			case 2:		    			//开胶
			        if(i==0)
					{
			 		Uart_putchar('k');
					while(count==key());
					Uart_putchar('k'); //关胶
			 		}
					break;
			case 3:		//X+ 
					RI=0;
			 		Uart_putchar('5');
					while(count==key())
					{
					RI=0;
					Uart_putchar('y');
					len=Uart_get_uint();
					floatDisplay(len,0);
					}
					for(j=0;j<5;j++)Uart_putchar('x');
			 		break;
			 case 12:		//X-
			 		RI=0;
			 		Uart_putchar('6');
					while(count==key())
					{
					RI=0;
					Uart_putchar('y');
					len=Uart_get_uint();
					floatDisplay(len,0);
					}
					for(j=0;j<5;j++)Uart_putchar('x');
			 		break;
			 case 8: 		//Y+ 
			 		RI=0;
			 		Uart_putchar('7');
					while(count==key())
					{
					RI=0;
					Uart_putchar('y');
					len=Uart_get_uint();
					floatDisplay(len,1);
					}
					for(j=0;j<5;j++)Uart_putchar('x');
			 		break;
			 case 4:		//Y- 
			 		RI=0;
			 		Uart_putchar('8');
					while(count==key())
					{
					RI=0;
					Uart_putchar('y');
					len=Uart_get_uint();
					floatDisplay(len,1);
					}
					for(j=0;j<5;j++)Uart_putchar('x');
			 		break;
			 case 15: 		//Z+
			 		RI=0;
					Uart_putchar('9');
					while(count==key())
					{
					RI=0;
					Uart_putchar('y');
					len=Uart_get_uint();
					floatDisplay(len,2);
					}
					for(j=0;j<5;j++)Uart_putchar('x');
			 		break;
			 case 11:		//Z- 
			 	 	RI=0;
			 		Uart_putchar('a');
					while(count==key())
					{
					RI=0;
					Uart_putchar('y');
					len=Uart_get_uint();
					floatDisplay(len,2);
					}
					for(j=0;j<5;j++)Uart_putchar('x');
			 		break;
			case 7:	   //复位
					Uart_putchar('2');
					while(Uart_getchar()=='0');
					floatDisplay(0,0);
					floatDisplay(0,1);
					floatDisplay(0,2);
				break;
			case 16:	   //SHF
					while(count==key());
					if(LMH==1)
					{
						LCD_Print(13,1,"LOW");
						Uart_putchar('b');
						LMH=0;
					}
					else if(LMH==0)
					{
						LCD_Print(13,1,"HI ");
						Uart_putchar('b');
						LMH=1;
					}	
				break;
			}
		count=key();
	}
	if(i)
	{
		if(count==10)Uart_putchar('f');	//取消零点
		else if(count==14)Uart_putchar('e');;  //确定零点
	}

}
//循环界面显示
void cycDisplay(uchar *p,uchar i)
{
	switch(i)
	{
		case 0:LCD_Printnum(2,1,p[i]);break;
		case 1:LCD_Printnum(3,1,p[i]);break;
		case 2:LCD_Printnum(4,1,p[i]);break;
		case 3:LCD_Printnum(5,1,p[i]);break;
		case 4:LCD_Printnum(10,1,p[i]);break;
		case 5:LCD_Printnum(11,1,p[i]);break;
		case 6:LCD_Printnum(12,1,p[i]);break;
		case 7:LCD_Printnum(14,1,p[i]);break;
		default:break;
	}
	if(i<4) LCD_Write(LCD_COMMAND,0x80|(i+2)|0x40);			//重新定位光标位置
	else if(i==7) LCD_Write(LCD_COMMAND,0x80|(i+7)|0x40);
	else 	LCD_Write(LCD_COMMAND,0x80|(i+6)|0x40);
}
//循环设置
void cycset()
{		 
	uchar numflag=0;	//循环加工次数选择标志
	uchar timeflag=0;	//间隔时间选择标志
	uchar count = 0;
	uchar t=0;
	uchar a[8]={0,0,0,0,0,0,0,0};
	uchar i;
	num=AT24C02_read(filenum*5+1)<<8;
	num+=AT24C02_read(filenum*5+2);
	time=AT24C02_read(filenum*5+3)<<8;
	time+=AT24C02_read(filenum*5+4);
	t=a[0]=(num/1000)%10;         //取得整数值到数组         	
	t=a[1]=(num/100)%10;                                     	
	t=a[2]=(num/10)%10;                                      	
	t=a[3]=num%10;                                       	

	t=a[4]=(time/1000)%10;         //取得整数值到数组         	
	t=a[5]=(time/100)%10;                                     	
	t=a[6]=(time/10)%10;
	t=a[7]=(time)%10;                                      	
	LCD_Print(0,1,"N=****  T=***.*S");
	LCD_SetDisplay(LCD_SHOW|LCD_CURSOR);    //开启显示, 开光标显示	
	for(i=0;i<8;i++)cycDisplay(a,i);
	i=0;
	LCD_Write(LCD_COMMAND,0x80|(i-0x40));
	count=key();
	while(count!=10&&count!=14)
	{
		cycDisplay(a,i);
		if(count)
		{
			while(count==key());
			switch(count)
			{
			 case 12:		//X+
			 		if(i<8)i++;
					if(i==8) i=0;
			 		break;
			 case 3:		//X-
			 		if(i>0)i--;
					else if(i==0) i=7;
			 		break;
			 case 8: 		//Y+
			 		if(a[i]<10)a[i]++;
					if(a[i]==10) a[i]=0;
			 		break;
			 case 4:		//Y-
			 		if(a[i]>0)a[i]--;
					else if(a[i]==0)a[i]=9;
			 		break;
			 default:break;
			}
		}
		count=key();	
	}
	if(count==14)
	{
		num=a[0]*1000+a[1]*100+a[2]*10+a[3];
		time=a[4]*1000+a[5]*100+a[6]*10+a[7];
		Uart_putchar('h');
		Uart_putchar('y');
		while(Uart_getchar()==NOACK)
		{
			Uart_putchar('y');
		}
		Uart_put_uint(time);
		Delay1ms(5);
		Uart_put_uint(num);
		AT24C02_write(filenum*5+1,num>>8);
		Delay1ms(5);
		AT24C02_write(filenum*5+2,num&0xff);
		Delay1ms(5);
		AT24C02_write(filenum*5+3,time>>8);
		Delay1ms(5);
		AT24C02_write(filenum*5+4,time&0xff);
		Delay1ms(5);
	}
	LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);    //开启显示, 关光标显示	
}
//主界面,参数为文件号
void mianface(uchar i)
{
	uchar buf[17]; 
	Delay1ms(5);
	filename=AT24C02_read(i*5);
	buf[0]='F';
	buf[1]='N';
	buf[2]=(filename/100)%10+'0';
	buf[3]=(filename/10)%10+'0';
	buf[4]=filename%10+'0';
	buf[5]=' ';
	buf[6]=' ';
	buf[7]=' ';
	buf[8]=' ';
	buf[9]=(i/100)%10+'0';
	buf[10]=(i/10)%10+'0';
	buf[11]=i%10+'0';
	buf[12]='/';
	buf[13]=(filetotal/100)%10+'0';
	buf[14]=(filetotal/10)%10+'0';
	buf[15]=filetotal%10+'0';
	buf[16]='\0';
	LCD_Print(0,0,buf);

	
	if(filechoice)
	{
		LCD_Print(0,1,"CHOICE FILE STOP");
	}
	else 
	{
		if(FILESTATE==0)LCD_Print(0,1,"            STOP");
		else if(FILESTATE==1)LCD_Print(0,1,"            RUN ");	
		else if(FILESTATE==2)LCD_Print(0,1,"           PAUSE");
	}
}
//文件选择界面
void Filechoise()
{
	  
 	uchar count = 0;
	uchar filename;
	uint  intertime;
	uint  cycletime;
	uchar i;
	uchar buf[5];
	count=key();
	filenum1=filenum;
	while(count!=10&&count!=14)
	{		
		mianface(filenum);
		if(count)
		{
			while(count==key());
			switch(count)
			{
			 case 12:		//X+
			 		if(filenum<=filetotal)filenum++;
					if(filenum>filetotal)filenum=1;
			 		break;
			 case 3:		//X-
			 		if(filenum>0)filenum--;
					if(filenum==0) filenum=filetotal;
			 		break;
			case 6:						//循环
					Uart_putchar('c');
					Uart_putchar(filenum);
					cycset();
					break;
			case 2:						//获取文件	增加验收功能
					i=0;
					RI=0;					
					Uart_putchar('1');
					LCD_Print(0,1,"GET FILE    STOP");
					Uart_putchar('y');
					filename=Uart_getchar();
					while(filename!='z')
					{	
						i++;
						while(filename==0)
						{
						 	Uart_putchar('y');
					        filename=Uart_getchar(); 
						}
						intertime=Uart_get_uint();
						cycletime=Uart_get_uint();
						buf[0]=(filename/100)%10+'0';
						buf[1]=(filename/10)%10+'0';
						buf[2]=filename%10+'0';
						buf[3]=' ';
						buf[4]='\n';
						LCD_Print(13,1,buf);
						AT24C02_write(i*5,filename);
						Delay1ms(5);
						AT24C02_write(i*5+1,((intertime)>>8)&0xff);
						Delay1ms(5);
						AT24C02_write(i*5+2,(intertime)&0xff);
						Delay1ms(5);
						AT24C02_write(i*5+3,((cycletime)>>8)&0xff);
						Delay1ms(5);
						AT24C02_write(i*5+4,(cycletime)&0xff);
						Delay1ms(5);						
						Uart_putchar('y');
						filename=Uart_getchar();	
					}
					filetotal=i;
					AT24C02_write(0x01,i);
					break;		
			 default:break;
			}
		}
		count=key();	
	}
	if(count==14)
	{
		Uart_putchar('c');
		Uart_putchar(AT24C02_read(filenum*5));
	}
	if(count==10)
	{
		filenum=filenum1;
	}
}

void main()
{
	uchar count = 0;
	uchar a[8]={0,};
	uchar i=0;
	LCD_Initial();
	LCD_Print(0,0,"  www.nsxk.com  ");
	LCD_Print(0,1,"  LOADING.....  ");
	Uart_init();
	AT24C02_Rest();
	Delay1ms(1000);
	filenum=AT24C02_read(0x00);
	if(filenum>120)filenum=1;
	Delay1ms(1);
	filetotal=AT24C02_read(0x01);
	Delay1ms(1);	
	mianface(filenum);
	Uart_putstring("FILENAME work  \n");
	Uart_putstring("N=     T=      \n");

	while(1)
	{
		count=key();
		if(count)
		{
		while(count==key());
		switch(count)
		{
			case 1:						//文件
				if(FILESTATE!=1)
				{
					filechoice=1;
					Filechoise(); 
					filechoice=0;
				  	mianface(filenum);
				}
				break;
			case 2:						//测试
				if(FILESTATE!=1)
				{
					xyzDisplay(0);
					mianface(filenum);
					
				}
				 break;
			case 6:						//循环
				if(FILESTATE!=1)
				{
					cycset();
					mianface(filenum);
				}
				break;
			case 5:						//零点
				if(FILESTATE!=1)
				{	
					Uart_putchar('2');
					LCD_Print(6,1," GO ORIGIN");
					while(Uart_getchar()!='z');
					Uart_putchar('d');
					xyzDisplay(1);

					mianface(filenum);
				}
					break;		
			case 13:	   //开始
					if(FILESTATE==1)
						FILESTATE=2;
					else 
					FILESTATE=1; 
					AT24C02_write(0x00,filenum);
					Uart_putchar('3');
					mianface(filenum);
				break;
			case 7:	   //复位
				 if(FILESTATE!=1)
				{
					Uart_putchar('2');
					LCD_Print(6,1," GO ORIGIN");
					while(Uart_getchar()!='z');
					mianface(filenum);
				}	
				break;
			case 9:	   //停止
					Uart_putchar('4');
					FILESTATE=0;
					LCD_Print(6,1,"      STOP");
					mianface(filenum);	
				break;
			default: break;
			count=0;
		}
		}
	 if(FILESTATE==1)  //文件在运行中
	 {
     if(!RI);// 检查是否文件运行结束
     RI=0;
     count=SBUF;
	 if(count=='o')FILESTATE=0;
	 count=0;
	 }
	}
}

⌨️ 快捷键说明

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