Код: Выделить всё
#ifndef _BUS_LCD_DISPLAY_INCLUDED
#define _BUS_LCD_DISPLAY_INCLUDED
/***** LCD дисплей, в отличие от LED будет работать на первой оперделенной шине *****/
/***** Определение функциональных пинов дисплея *****/
#define E_PIN 1
#define RS_PIN 0
//new universal
/***** Макросы по управлению пинами дисплея - Light имеет 4 поз от 0-3 *****/
#define LCD_BUF(A) REG_BUF[LCD_POS[A]]
#define LCD_E_ENABLE(LCD_NR) ((LCD_BUF(LCD_NR))|=(1<<E_PIN))
#define LCD_E_DISABLE(LCD_NR) ((LCD_BUF(LCD_NR))&=(~(1<<E_PIN)))
#define LCD_RS_ENABLE(LCD_NR) ((LCD_BUF(LCD_NR))|=(1<<RS_PIN))
#define LCD_RS_DISABLE(LCD_NR) ((LCD_BUF(LCD_NR))&=(~(1<<RS_PIN)))
#define LCD_LightSET(LCD_NR,L) (LCD_BUF(LCD_NR))=((LCD_BUF(LCD_NR))&0b00111111)|(L<<6)
#define LCD_LightON(A) LCD_LightSET(A,3)
#define LCD_LightOFF(A ) LCD_LightSET(A,0)
#define CV_NR(NR) (NR+48)
#pragma used+
#define REG_BUF_write_nibble(data, REG_B) (REG_B)&=0b11000011;\
(REG_B)|=((data>>2)|(1<<E_PIN)) //запись данных в буффере
void lcd_write_nibble(unsigned char data, unsigned char lcd_nr) {
//REG_BUF_write_nibble((data), REG_BUF);
(LCD_BUF(lcd_nr))&=0b11000011;
(LCD_BUF(lcd_nr))|=((data>>2)|(1<<E_PIN));//запись данных в буффере
REG_BUF_SEND;
LCD_E_DISABLE(lcd_nr);
REG_BUF_SEND;
}
void lcd_write_data(unsigned char data, unsigned char lcd_nr) {
lcd_write_nibble(data & 0b11110000, lcd_nr); // старшый полубайт
lcd_write_nibble(data << 4, lcd_nr); //младший полубайт
}
/* константы дисплея */
#define ON 1
#define OFF 0
#define C_LCD_CLEAN 0b00000001
#define C_LCD_CURS_RIGHT 0b00000110
#define C_LCD_CURS_LEFT 0b00000100
#define C_LCD_RIGHT 0b00000111
#define C_LCD_LEFT 0b00000101
#define C_LCD 3
#define C_LCD_ON 2
#define C_LCD_CURS_ON 1
#define C_LCD_BLINK_ON 0
#define C_LCD_SET(ON_OFF,CURSOR,BLINK) (1<<C_LCD)|(ON_OFF<<C_LCD_ON)|(CURSOR<<C_LCD_CURS_ON)|(BLINK<<C_LCD_BLINK_ON)
/* FUNCTION_SET - выбор режима работы дисплея */
#define C_FS 5
#define C_DL_8b4b 4
#define BIT_8 1
#define BIT_4 0
#define C_LINE 3
#define LINE_2 1
#define LINE_1 0
#define C_FONT_11_8 2
#define FONT_11 1
#define FONT_8 0
#define C_FUNCTION_SET(DL,LINE,FONT) (1<<C_FS)|(DL<<C_DL_8b4b)|(LINE<<C_LINE)|(FONT<<C_FONT_11_8)
/* операции с дисплеем */
#define SPI_WRITE_DATA(data, lcd_nr) spi_write_nibble(data & 0b11110000, lcd_nr);spi_write_nibble(data << 4, lcd_nr)
#define LCD_SET_LINE0(lcd_nr) lcd_write_cmd(0b10000000, lcd_nr)
#define LCD_SET_LINE1(lcd_nr) lcd_write_cmd(0b10000000+0x40, lcd_nr)
#define LCD_SET_LINE0_Y(Y,lcd_nr) lcd_write_cmd((0b10000000+Y), lcd_nr)
#define LCD_SET_LINE1_Y(Y,lcd_nr) lcd_write_cmd((0b10000000+0x40+Y), lcd_nr)
#define LCD_FAST_CLEAR(lcd_nr) lcd_write_cmd(0x01, lcd_nr)
#define LCD_CLEAR(lcd_nr) lcd_write_cmd(0x01, lcd_nr);delay_ms(3)
#define LCD_OFF(lcd_nr) lcd_write_cmd(C_LCD_SET(OFF,0,0),lcd_nr);delay_us(50)
#define LCD_ON(lcd_nr, CURSOR, BLINK) lcd_write_cmd(C_LCD_SET(ON,CURSOR,BLINK),lcd_nr);delay_us(50)
#define LCD_CURS_DIRECTION_SET(D) lcd_write_cmd(D,lcd_nr);delay_us(50)
#define LCD_DIRECTION_SET(D) lcd_write_cmd(D,lcd_nr);delay_us(50)
void lcd_init(unsigned char lcd_nr) {
LCD_RS_DISABLE(lcd_nr);
//REG_BUF_SEND;
/* FUNCTION_SET - выбираем режим работы дисплея - выбираем в начале 4бит */
lcd_write_nibble(C_FUNCTION_SET(BIT_4,0,0), lcd_nr); delay_us(50);
/* теперь выбираем все функции режима работы дисплея - 4бит + */
lcd_write_data(C_FUNCTION_SET(BIT_4, LINE_2, FONT_8), lcd_nr); delay_us(50);
/* *** полное выключение дисплея *** */
lcd_write_data(C_LCD_SET(OFF,OFF,OFF), lcd_nr); delay_us(50);
/* *** очистка дисплея - надо ждать долго после команды = 3мс *** */
lcd_write_data(C_LCD_CLEAN, lcd_nr);
delay_ms(3);
/* *** направление курсора или экрана - выбираем сдвиг курсора вправо *** */
lcd_write_data(C_LCD_CURS_RIGHT, lcd_nr); delay_us(50);
/* *** включение дисплея и настройка курсора *** */
/* *** C_LCD_SET(ON_OFF,CURSOR,BLINK) *** */
lcd_write_data(C_LCD_SET(ON,OFF,OFF), lcd_nr); delay_us(50);
LCD_RS_ENABLE(lcd_nr); //rs = 1
REG_BUF_SEND;
}
void lcd_write_str(unsigned char*str, unsigned char lcd_nr) {
do {lcd_write_data(*str, lcd_nr);}while(*++str);
}
void lcd_write_str_delay(unsigned char*str, unsigned int delay, unsigned char lcd_nr) {
do {
lcd_write_data(*str, lcd_nr);
delay_ms(delay);
}while(*++str);
}
void lcd_write_str_delay_plus(unsigned char*str, unsigned int delay, signed char plus, unsigned char lcd_nr) {
do {
lcd_write_data(*str, lcd_nr);
delay_ms(delay);
delay=delay+plus;
}while(*++str);
}
void lcd_write_str_accel(unsigned char*str, unsigned int delay, unsigned char accel, unsigned char lcd_nr) {
do {
lcd_write_data(*str, lcd_nr);
delay_ms(delay);
delay=(unsigned int)((delay*20)/accel);
}while(*++str);
}
/* *** Функция отправки команды: *** */
void lcd_write_cmd(unsigned char cmd, unsigned char lcd_nr) {
LCD_RS_DISABLE(lcd_nr);
//REG_BUF_SEND; //posibil nu e necesar regim de testare
lcd_write_data(cmd, lcd_nr);
LCD_RS_ENABLE(lcd_nr);
REG_BUF_SEND;
}
/* *** Функция перемещения курсора: *** */
void lcd_set_cursor(unsigned char line, unsigned char pos, unsigned char lcd_nr) {
pos |= 0b10000000;
if (line == 1) {
pos += 0x40;
}
lcd_write_cmd(pos, lcd_nr);
}
/* 1 tick = 0.1ms */
void lcd_delay(char ticks) {
}
/* *** Функция быстрой очистки дисплея *** */
void lcd_sf_clear(char lcd_nr) {
unsigned char i,y=0;
while (1){
if (y!=1) {LCD_SET_LINE0(lcd_nr);if (y>1){return;}} else {LCD_SET_LINE1(lcd_nr);}
i=0;
while (i<17){
i++;
lcd_write_data(32, lcd_nr);
}
y++;
}
}
void lcd_put_num3d(char lcd_nr, unsigned char Num){
unsigned char Temp;
unsigned char Rest;
Temp=100;
do
{
Rest=Num/Temp;
lcd_write_data(CV_NR(Rest),lcd_nr);
Num=Num-(Rest*Temp);
Temp=Temp/10;
}while(Temp>0);
}
#pragma used-
#endif //_BUS_LCD_DISPLAY_INCLUDED