📄 lcd.c
字号:
#include "atmega.h"
#include <avr/io.h>
#include <util/delay.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
//#include "wordlib.h"
#define pgm_read_byte(address_short) pgm_read_byte_near(address_short)
#define pgm_read_word_near(address_short) __LPM_word((uint16_t)(address_short))
#define data_port PORTD
#define data_direction DDRD
#define data_pin PIND
/*******************************************/
void set_data_port_output()
{
data_direction = 0xff;
}
/*******************************************/
void set_data_port_input()
{
data_direction = 0x00;
}
/*******************************************/
//左半屏写命令
unsigned char write_left_command(unsigned char cmd)
{
unsigned char Buffer = 0;
set_data_port_input();
left_display_enable();//使能左半屏
right_display_disable();//禁用右半屏
set_reg_data_operation();//设置为寄存器操作
set_read();//设置为读
while((Buffer&0x80)!=0)
{
set_enable_high();
Buffer = data_pin;
set_enable_low();
}
set_data_port_output();
set_write();
data_port = cmd;
set_enable_high();
set_enable_low();
return 1;
}
/*******************************************/
//左半屏写命令
unsigned char write_right_command(unsigned char cmd)
{
unsigned char Buffer = 0;
set_data_port_input();
right_display_enable();//使能右半屏
left_display_disable();//禁用左半屏
set_reg_data_operation();//设置为寄存器操作
set_read();//设置为读
while((Buffer&0x80)!=0)
{
set_enable_high();
Buffer = data_pin;
set_enable_low();
}
set_data_port_output();
set_write();
data_port = cmd;
set_enable_high();
set_enable_low();
return 1;
}
/*******************************************/
unsigned char write_left_data(unsigned int Data)
{
unsigned char Buffer = 0;
set_data_port_input();
left_display_enable();//使能左半屏
right_display_disable();//禁用右半屏
set_reg_data_operation();//设置为寄存器操作
set_read();//设置为读
while((Buffer&0x80)!=0)
{
set_enable_high();
Buffer = data_pin;
set_enable_low();
}
set_data_port_output();
set_display_data_operation();//设置为显示数据操作
set_write();
data_port = Data;
set_enable_high();
set_enable_low();
return 1;
}
/*******************************************/
unsigned char write_right_data(unsigned int Data)
{
unsigned char Buffer = 0;
set_data_port_input();
right_display_enable();//使能右半屏
left_display_disable();//使能左半屏
set_reg_data_operation();//设置为寄存器操作
set_read();//设置为读
while((Buffer&0x80)!=0)
{
set_enable_high();
Buffer = data_pin;
set_enable_low();
}
set_data_port_output();
set_display_data_operation();//设置为显示数据操作
set_write();
data_port = Data;
set_enable_high();
set_enable_low();
return 1;
}
/*******************************************/
void display_image(unsigned int *ptr)
{
unsigned char loop;
unsigned char page_buffer;
write_left_command(0xc0);
write_right_command(0xc0);//设置为第一行
for(page_buffer=0xb8;page_buffer<0xc0;page_buffer++)
{
write_left_command(page_buffer);
write_right_command(page_buffer);//设置为第一页
for(loop=0;loop<32;loop++)
{
write_left_data((unsigned char)pgm_read_word_near(ptr));
write_left_data((unsigned char)(pgm_read_word_near(ptr)>>8));
ptr ++;
}
for(loop=0;loop<32;loop++)
{
write_right_data((unsigned char)pgm_read_word_near(ptr));
write_right_data((unsigned char)(pgm_read_word_near(ptr)>>8));
ptr ++;
}
}
}
/*******************************************/
void clear_lcd(void)
{
unsigned char loop = 0;
unsigned char page_buffer = 0;
write_left_command(0xc0);
write_right_command(0xc0);//设置为第一行
for(page_buffer=0xb8;page_buffer<=0xc0;page_buffer++)
{
write_left_command(page_buffer);
write_right_command(page_buffer);//设置为第一页
for(loop=0;loop<64;loop++)
{
write_left_data(0x00);
}
for(loop=0;loop<64;loop++)
{
write_right_data(0x00);
}
}
}
/*******************************************/
u8_t display_character_int(u8_t line,u8_t tier,u16_t *ptr,u8_t choice)
{
u8_t loop1,loop2;
ptr = ptr+choice*16;
if((line>4)||(line==0))return 1;
if((tier>8)||(tier==0))return 1;
if(line==1)
{
line = 0;
}
else
{
line = line * 2 - 2;
}
tier = tier - 1;
if(tier<4)
{
for(loop1=0;loop1<2;loop1++)
{
write_left_command(0x40|(tier*16));//设置列
write_left_command(0xb8|line);
write_right_command(0x40|(tier*16));//设置列
write_right_command(0xb8|line);
for(loop2=0;loop2<8;loop2++)
{
write_left_data((unsigned char)pgm_read_word_near(ptr));
write_left_data((unsigned char)(pgm_read_word_near(ptr)>>8));
ptr++;
}
line++;
}
}
else
{
tier = tier - 4;
for(loop1=0;loop1<2;loop1++)
{
write_left_command(0x40|(tier*16));//设置列
write_left_command(0xb8|line);
write_right_command(0x40|(tier*16));//设置列
write_right_command(0xb8|line);
for(loop2=0;loop2<8;loop2++)
{
write_right_data((unsigned char)pgm_read_word_near(ptr));
write_right_data((unsigned char)(pgm_read_word_near(ptr)>>8));
ptr++;
}
line++;
}
}
return 0;
}
/*******************************************/
u8_t display_character_char(u8_t line,u8_t tier,u16_t *ptr,u8_t choice)
{
u8_t loop1,loop2;
ptr = ptr + choice*8;
if((line>4)||(line==0))return 1;
if((tier>16)||(tier==0))return 1;
if(line==1)
{
line = 0;
}
else
{
line = line * 2 - 2;
}
tier = tier - 1;
if(tier<8)
{
for(loop1=0;loop1<2;loop1++)
{
write_left_command(0x40|(tier*8));//设置列
write_left_command(0xb8|line);
write_right_command(0x40|(tier*8));//设置列
write_right_command(0xb8|line);
for(loop2=0;loop2<4;loop2++)
{
write_left_data((unsigned char)pgm_read_word_near(ptr));
write_left_data((unsigned char)(pgm_read_word_near(ptr)>>8));
ptr++;
}
line++;
}
}
else
{
tier = tier - 8;
for(loop1=0;loop1<2;loop1++)
{
write_left_command(0x40|(tier*8));//设置列
write_left_command(0xb8|line);
write_right_command(0x40|(tier*8));//设置列
write_right_command(0xb8|line);
for(loop2=0;loop2<4;loop2++)
{
write_right_data((unsigned char)pgm_read_word_near(ptr));
write_right_data((unsigned char)(pgm_read_word_near(ptr)>>8));
ptr++;
}
line++;
}
}
return 0;
}
/*******************************************/
void init_lcd(void)
{
colse_back_light();//关闭液晶背光
reset_lcd();//复位液晶
write_left_command(0x3f);//打开显示
write_right_command(0x3f);
write_left_command(0xc0);//显示起始行设置为1行
write_right_command(0xc0);
write_left_command(0xb8);//页面地址设置为0
write_right_command(0xb8);
write_left_command(0x40);//列地址设置为0
write_right_command(0x40);
clear_lcd();
_delay_ms(1000);
open_back_light();
/* display_image(image);
display_character_int(1,1,character,0);
display_character_int(1,2,character,1);
display_character_char(1,5,symbol,0);
display_character_char(1,6,symbol,1);
display_character_char(1,7,symbol,0);
display_character_char(1,8,symbol,1);
display_character_char(1,9,symbol,0);*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -