📄 lcd.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 + -