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

📄 89s52.c

📁 LCD1602.rar
💻 C
字号:
#include<AT89x52.h>
#include<stdio.h>
#include <intrins.h>
//端口定义
sbit	LCDRS = P3^5;	
sbit 	LCDRW = P3^6;	
sbit 	LCDEN = P3^7;		
sbit	LCDBF = P2^7;	

#define	DBPORT  P2		
#define DIS_CURS_OFF 0x0c
#define LCD_CLRS 0x01
#define DIS_HIDE 0x08		
#define LCD_INIT 0x38	
#define LCD_HOME 0x02
#define LCD_DATA 1
#define	LCD_COMMAND 0
#define LCD_READ 1
#define LCD_WRITE 0

#define K1 6
#define K2 5
#define K3 4
#define K4 3
#define K5 2
#define K6 1
#define K7 0
#define Fctrl	P0_3
#define Tctrl	P0_4
#define Distc	P0_5
#define Width	P0_6
#define	Cut		P0_7
#define Stop	P1_6
#define Clrs	P1_7
#define Enex	P3_0
#define Disall	P0=0xff;P1=0xff

#define StopCount P1_6=0
#define StarCount P1_6=1
#define ClrsCount P1_7=0;_nop_();P1_7=1
#define ClrsDff	  P1_2=0;_nop_();P1_2=1

#define Backb	P1_3
#define Backc	P1_4

#define BackLight P1_0

unsigned char sbuffer[15],w[5];
unsigned char contrast=5;
unsigned long value=0,copyer=0,wvalue=0;

bit IsFreq=1;
bit IsLow=1;

void lcd_wait();
void lcd_command(unsigned char command);
void lcd_putchar(unsigned char character);
void lcd_moveto(unsigned char x, unsigned char y);
void lcd_print(unsigned char *str);
void delay1s();
void high_init();
void key_delay();
void key_jud();
void low_init();
void width_init();
void depart_w();
void intrT2();
void width_get();
void count();
void count_init();
void low_get();
void show_high_t();
void show_high_f();
void show_low_t();
void show_low_f();
void intr0();
void intr1();
void high_get();
void contrast_handle();
void install();
void lcd_init();

void lcd_wait()
{	
	LCDEN=0;			   
	DBPORT=0xff;		
	LCDRS=LCD_COMMAND;	   
	LCDRW=LCD_READ;
	LCDEN=1;	_nop_();
	while(LCDBF)
	{	LCDEN=0;	_nop_();
		LCDEN=1;	_nop_();
	}
	LCDEN=0;
}  

void lcd_command(unsigned char command)
{	
	lcd_wait();
	LCDRS=LCD_COMMAND;
	LCDRW=LCD_WRITE;		
	DBPORT=command;		
	LCDEN=1;	_nop_();				
	LCDEN=0;
}

void lcd_putchar(unsigned char character)
{	
	lcd_wait();				 
	LCDRS=LCD_DATA;
	LCDRW=LCD_WRITE;		
	DBPORT=character;		
	LCDEN=1;	_nop_();				
	LCDEN=0;
}
void lcd_moveto(unsigned char x, unsigned char y)
{	
	if(x==0)
		lcd_command(0x80|y);
	if(x==1)
		lcd_command(0xc0|y);
}
		 
void lcd_print(unsigned char *str)
{	
	while(*str!='\0')
	{	lcd_putchar(*str);
		str++;
	}
}

void delay1s()
{
	unsigned char i,j,k;
	for(i=0;i<255;i++)
		for(j=0;j<103;j++)
			for(k=0;k<11;k++);
	for(k=0;k<216;k++);
	_nop_();
}

void high_init()
{
	EA=0;
	Disall;
	Fctrl=0;	
	TMOD=0x05;
	TR0=1;
	StopCount;
	ClrsCount;
	TL0=0;
	TH0=0;
}

void key_delay()
{
	unsigned char i,j;
	for(i=0;i<255;i++)
		for(j=0;j<250;j++);
}

void key_jud()
{
	switch(P0&0x7)
	{
		case K6:TH0=0;
			    TL0=0;
			    ClrsCount;
			    key_delay();							    
				break;
		case K7:P1_6=!P1_6;
				lcd_moveto(1,15);
				if(!P1_6) 
					lcd_putchar('P');
				else
					lcd_putchar(' '); 	  
				key_delay();
				break;
		case K1:w[0]++;
				if(w[0]==10) w[0]=0;
				key_delay();
				break;
		case K2:w[1]++;
				key_delay();
				if(w[1]==10) w[1]=0;
				break;
		case K3:w[2]++;
				if(w[2]==10) w[2]=0;
				key_delay();
				break;
		case K4:w[3]++;
				if(w[3]==10) w[3]=0;
				key_delay();
				break;
		case K5:w[4]++;
				if(w[4]==10) w[4]=0;
				key_delay();
				break;				
	}
}

void low_init()
{
	Disall;
	Distc=0;
	Tctrl=0;
	Cut=0;
	StopCount;
	ClrsCount;
	StarCount;
	IsLow=1;
	TL0=0;
	TH0=0;
	IT0=1;
	IT1=1;
	EX1=1;
	EX0=1;
	ClrsDff;
	EA=1;
}

void width_init()
{
	Disall;
	Width=0;
	Tctrl=0;
	ClrsCount;
	TL0=0;
	TH0=0;
	TMOD=0x05;
	TR0=1;
	TF2=0;	
	T2CON=8;
	ET2=1;
	ClrsCount;
	TH0=0;
	TL0=0;
    EA=1;
}


void depart_w()
{
	unsigned char i;
	while(wvalue>=1e4) wvalue/=10;
	for(i=0;i<4;i++)
	{
		w[3-i]=wvalue%10+'0';
		wvalue/=10;
	}
}

void intrT2() interrupt 5
{
	unsigned char i;
	Tctrl=1;
	P2=0xff;
	Enex=0;
	value=TH0;
	value=(value<<8);
	value=value+TL0;
	value=(value<<8);
	value=value+DBPORT;
	Enex=1;
	for(i=0;value;i++)
	{
		sbuffer[i]=value%10+'0';
		value=value/10;
	}
	lcd_moveto(1,3);
	i++;
	while(i)
	{
		 lcd_putchar(sbuffer[i]);
		 i--;
	}
	lcd_putchar(sbuffer[i]);
	lcd_print(" uS          ");
	while(1)
	{
		i=P0&0x07;
		if(i==K1) break;
	}
	TH0=0;
	TL0=0;
	ClrsCount;
	lcd_moveto(1,3);
	lcd_print("  Capture.....");
	key_delay();
	T2CON=8;
	Tctrl=0;
		
}

void width_get()
{
	while(1);
}

void count() 
{
	while(1)
	{		
		key_jud();
		P2=0xff;
		Enex=0;
		value=TH0;
		value=(value<<8);
		value=value+TL0;
		value=(value<<8);
		value=value+DBPORT;
		Enex=1;
		lcd_moveto(1,9);
		sprintf(sbuffer,"%-5lu",value);		
		lcd_moveto(1,9);
		lcd_print(sbuffer);	
		copyer=w[4]+w[3]*10+w[2]*1e2+w[1]*1e3+w[0]*1e4;
		if(value==copyer)  
		{
			StopCount;
			P3_1=0;
			while(P0_1==1||P0_2==1);
			P3_1=1;
			StarCount;
		}		
		sprintf(sbuffer,"%c%c%c%c%c",w[0]+'0',w[1]+'0',w[2]+'0',w[3]+'0',w[4]+'0');		
		lcd_moveto(0,9);
		lcd_print(sbuffer);		
	}
}

void count_init()
{
	unsigned char i;
	Disall;
	Fctrl=0;	
	TMOD=0x05;
	TR0=1;
	StopCount;
	ClrsCount;
	TL0=0;
	TH0=0;	
	for(i=0;i<5;i++) w[i]=9;
	w[2]=8;
	StarCount;
}

void low_get()
{
	low_init();
	while(IsLow);
	high_init();
}

void show_high_t()
{
	copyer=value;
	while(value>=100000) value/=10;
	wvalue=1e9/value;
	depart_w();
	if(copyer<=1e4)
		sprintf(sbuffer,"%c%c%c.%c uS   ",w[0],w[1],w[2],w[3]);
	else if(copyer<=1e5)
		sprintf(sbuffer,"%c%c.%c%c uS   ",w[0],w[1],w[2],w[3]);
	else if(copyer<=1e6)
		sprintf(sbuffer,"%c.%c%c%c uS   ",w[0],w[1],w[2],w[3]);
	else if(copyer<=1e7)
		sprintf(sbuffer,"%c%c%c.%c nS   ",w[0],w[1],w[2],w[3]);
	else 
		sprintf(sbuffer,"%c%c.%c%c nS   ",w[0],w[1],w[2],w[3]);
	lcd_moveto(1,5);
	lcd_print(sbuffer);	

}

void show_high_f()
{
	wvalue=value;
	depart_w();
	if(value<1e4)
		sprintf(sbuffer,"%c.%c%c%c KHz  ",w[0],w[1],w[2],w[3]);
	else if(value<1e5)
		sprintf(sbuffer,"%c%c.%c%c KHz  ",w[0],w[1],w[2],w[3]);
	else if(value<1e6)
		sprintf(sbuffer,"%c%c%c.%c KHz  ",w[0],w[1],w[2],w[3]);
	else if(value<1e7)
		sprintf(sbuffer,"%c.%c%c%c MHz  ",w[0],w[1],w[2],w[3]);
	else
		sprintf(sbuffer,"%c%c.%c%c MHz  ",w[0],w[1],w[2],w[3]);
	lcd_moveto(1,5);
	lcd_print(sbuffer);
}

void show_low_t()
{
	wvalue=value;
	depart_w();
	if(value<1e4)
		sprintf(sbuffer,"%c%c%c.%c uS   ",w[0],w[1],w[2],w[3]);
	else if(value<1e5)
		sprintf(sbuffer,"%c.%c%c%c mS   ",w[0],w[1],w[2],w[3]);
	else if(value<1e6)
		sprintf(sbuffer,"%c%c.%c%c mS   ",w[0],w[1],w[2],w[3]);
	else if(value<1e7)
		sprintf(sbuffer,"%c%c%c.%c mS   ",w[0],w[1],w[2],w[3]);
	else if(value<1e8)
		sprintf(sbuffer,"%c.%c%c%c S    ",w[0],w[1],w[2],w[3]);
	lcd_moveto(1,5);
	lcd_print(sbuffer);
}

void show_low_f()
{
	copyer=value;
	while(value>=100000) value/=10;
	wvalue=1e9/value;
	depart_w();
	if(copyer<=1e4)
		sprintf(sbuffer,"%c.%c%c%c KHz  ",w[0],w[1],w[2],w[3]);
	else if(copyer<=1e5)
		sprintf(sbuffer,"%c%c%c.%c Hz   ",w[0],w[1],w[2],w[3]);
	else if(copyer<=1e6)
		sprintf(sbuffer,"%c%c.%c%c Hz   ",w[0],w[1],w[2],w[3]);
	else 
		sprintf(sbuffer,"%c.%c%c%c Hz   ",w[0],w[1],w[2],w[3]);
	lcd_moveto(1,5);
	lcd_print(sbuffer);
}

void intr0() interrupt 0
{    			
	
	Cut=1;
	P2=0xff;
	Enex=0;
	value=TH0*0x10000+TL0*0x100+DBPORT;
	value*=10;//注意在写片时屏掉此语句
	Enex=1;	
	if(!IsFreq) show_low_t();
	else show_low_f();
	if(value<4000) IsLow=0;
	Cut=0;
			
}

void intr1() interrupt 2
{
	TL0=0;
	TH0=0;	
}

void high_get()
{
	while(1)
	{
		StarCount;
		delay1s();
		StopCount;
		P2=0xff;
		Enex=0;
		value=TH0*0x10000+TL0*0x100+DBPORT;
		Enex=1;
		if(value<2000) low_get();
		if(IsFreq) 	show_high_f();
		else		show_high_t();
		ClrsCount;
		TL0=0;
		TH0=0;
	}
}

void contrast_handle()
{	
	lcd_moveto(1,0);
	lcd_print("Contrast : ");
	lcd_putchar(contrast+'0');
}
	

void install()
{
	key_delay();
	while(1)
	{
		switch(P0&0x7)
		{
			case K2:P1_5=~P1_5;
					_nop_();
					P1_5=~P1_5;															
					key_delay();
					lcd_moveto(0,12);
					if(BackLight) lcd_print("N  ");
					else lcd_print("FF");											
					break;
			case K7:contrast--;
					if(contrast==0xff) contrast++;
					contrast_handle();
					key_delay();
					break;
			case K6:contrast++;
					if(contrast==8) contrast--;
					contrast_handle();
					key_delay();
					break;

		}
	}
}

void lcd_init()
{  	
	lcd_command(DIS_CURS_OFF);
	lcd_command(LCD_INIT);
	lcd_command(LCD_HOME);
	contrast_handle();
}

void main()
{	
	lcd_init();
	lcd_command(LCD_CLRS);
	lcd_print("Welcome");
	lcd_moveto(1,0);
	lcd_print("Press Button...");
	while(1)
	{
		switch(P0&0x7)
		{
			case K1:lcd_command(LCD_CLRS);
					lcd_moveto(0,0);
					lcd_print("Frequency:");
					lcd_moveto(1,5);
					lcd_print("No Input");
					high_init();
					high_get();
			case K2:IsFreq=0;
					lcd_command(LCD_CLRS);
					lcd_moveto(0,0);
					lcd_print("Priod:");
					lcd_moveto(1,5);
					lcd_print("No Input");
					high_get();
			case K3:lcd_command(LCD_CLRS);
					lcd_print("Count To:");
					lcd_moveto(1,0);
					lcd_print("Present: ");
					count_init();
					count();
			case K4:lcd_command(LCD_CLRS);
					lcd_print("Pulse Width:");
					lcd_moveto(1,5);
					lcd_print("Capture.....");					
					width_init();
					width_get();
			case K5:lcd_command(LCD_CLRS);
					lcd_print("Backlight: O");
					lcd_moveto(0,12);
					if(BackLight) lcd_print("N  ");
					else lcd_print("FF");
					lcd_moveto(1,0);
					lcd_print("Contrast : ");
					lcd_putchar(contrast+'0');
					install();
		}
	}
	lcd_command(LCD_CLRS);
	while(1);		
}

	

⌨️ 快捷键说明

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