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

📄 lcd.c

📁 采用Atmega16的变频式超声波发生器的源代码
💻 C
字号:
#include"main.h"



#define rs_data PORTA|=(1<<2)
#define rs_command PORTA&=~(1<<2)

#define en_h PORTA|=(1<<3)
#define en_l PORTA&=~(1<<3)

#define delay_e delay(20)
#define delay_da delay(10)
#define delay_fun delay(1000)




void delay(uint16_t time)
{
	while(time>0)
	{time--;}

}

void en_toggle(void)
{   
    delay_da;
    en_h;
	delay_e;
	en_l;
	delay_e;
}

void nibble_mode(void)
{   
    
	DDRA=0xfc;
	PORTA=0x38;
	en_toggle();
	delay_fun;
	en_toggle();
	delay_fun;
	en_toggle();
	delay_fun;

	PORTA=0x20;
	en_toggle();
	delay_fun;
	
	}


void write_command(uint8_t command)
{   unsigned char commandh,commandl;
    commandh=command&0xf0;
	commandl=command&0x0f;
	DDRA=0xfc;
	rs_command;
	DDRA=0xfc;
	PORTA=commandh;
	en_toggle();
	PORTA=(commandl<<4);
	en_toggle();
	delay_fun;
}

void write_position(uint8_t row,uint8_t column) //defining the aDDRBss in the display belongs to command
{
	uint8_t p;
	if(row==1)
		{p=0x80+column-1; //to set display data RAM,MSB must be 1,so why we plus 0x80
			write_command(p);
		}
		else
			{p=0xc0+column-1;//the first column of the first and second row aDDRBss is 00H and 40H(0x80+0x40=0xc0)
				write_command(p);
			}
		}

void write_data(uint8_t data)
{
	DDRA=0xfc;
    PORTA=((data&0xf0)|0x04);
	en_toggle();
	PORTA=(((data&0x0f)<<4)|0x04);
    en_toggle();
    delay_fun;
	}

void write_string(char *s)
{
	for(;*s!='\0';s++) //at the end of string,it must be '\0',system adds it automatically
	write_data(*s); //character belongs to data,no matter it is number or charcter etc
}

void write_string_flash(char *flash_string)
{   uint i;
	for(i=0;pgm_read_byte(flash_string+i)!='\0';i++) //at the end of string,it must be '\0',system adds it automatically
	write_data(pgm_read_byte(flash_string+i)); //character belongs to data,no matter it is number or charcter etc
}

void write_number(uint8_t data)
{
if(data<=9)
write_data(data+0x30);
}

void write_hex(uint data)
{
write_data('0');
write_data('X');
unsigned char a,b,c,d;
unsigned int j=data;

	a=j/4096;
    j=j%4096;
	b=j/256;
	j=j%256;
	c=j/16;
	d=j%16;
	if(a<=9)
	write_number(a);
	else
	write_data(a+87);
    if(b<=9)
	write_number(b);
	else
	write_data(b+87);
	if(c<=9)
	write_number(c);
	else
	write_data(c+87);
	if(d<=9)
	write_number(d);
	else
	write_data(d+87);

}

void write_hex_32(ulong data)
{
write_data('0');
write_data('X');
unsigned char a,b,c,d,e,f,g,h;
unsigned long j=data;

	a=j/268435456;
    j=j%268435456;
	b=j/16777216;
	j=j%16777216;
	c=j/1048576;
	j=j%1048576;
    d=j/65536;
	j=j%65536;
	e=j/4096;
	j=j%4096;
	f=j/256;
	j=j%256;
	g=j/16;
	h=j%16;

	if(a<=9)
	write_number(a);
	else
	write_data(a+87);
    if(b<=9)
	write_number(b);
	else
	write_data(b+87);
	if(c<=9)
	write_number(c);
	else
	write_data(c+87);
	if(d<=9)
	write_number(d);
	else
	write_data(d+87);
	if(e<=9)
	write_number(e);
	else
	write_data(e+87);
	if(f<=9)
	write_number(f);
	else
	write_data(f+87);
	if(g<=9)
	write_number(g);
	else
	write_data(g+87);
	if(h<=9)
	write_number(h);
	else
	write_data(h+87);

}

void write_dec(ulong data)
{
    ulong b,k=data;
	unsigned char a[10],i,j;

    for(i=9;i>0;i--)
	{
	for(b=1,j=i;j>0;j--)
	b*=10;
	a[9-i]=k/b;
	k%=b;
	
	}
	a[9]=k;
	for(i=0;a[i]==0;i++);
	for(;i<10;i++)
	write_number(a[i]);
	
    if(data==0)
	write_number(0);	

}
void write_hex_8(uchar data)
{
write_data('0');
write_data('x');
unsigned char a,b;
unsigned char j=data;

	a=j/16;
	b=j%16;
	if(a<=9)
	write_number(a);
	else
	write_data(a+87);
    if(b<=9)
	write_number(b);
	else
	write_data(b+87);
	

}



void clear_screen(void)
{
write_command(0x01);
delay(10000);
}

void lcd_init(void)
{
	nibble_mode();
	write_command(0x28); //4bit,2row,5*10 character
	clear_screen();
	write_command(0x06);  //cursor moves right after data is written
	write_command(0x0c);  //show function is opened,there is a cursor
	
}

⌨️ 快捷键说明

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