KAIQUE DOGNANI
/
LCD_JOYSTICK
Utilizando a Nucleo F103RB com um módulo LCD e um Joystick para interface
LCD_ka.cpp
- Committer:
- kaiquedog
- Date:
- 2021-08-25
- Revision:
- 10:d77ef093800b
- Parent:
- 9:891ffa97d8fb
File content as of revision 10:d77ef093800b:
#include "LCD_ka.h" /* *********************** **** INICIALIZAÇÃO **** *********************** */ LCD::LCD(PinName rs, PinName e, PinName d4, PinName d5, PinName d6, PinName d7) : RS(rs), E(e), dados(d4,d5,d6,d7){ Inicia_LCD(); setup_chars(); this ->_coluna = 1; this ->_linha = 1; } /* ******************** **** INICIA_LCD **** ******************** */ void LCD::Inicia_LCD(void){ RS = 0; E = 0; dados = 0x0; wait(0.05); for (int i=0; i<3; i++){ CMD(0x20); // Define como 4 bits CMD(0x28); // Define 0 0 1 DL - N F _ _ //(DL = Data Lengh: 0 --> 4 Bits // 1 --> 8 Bits) //(N = n° de linhas:0 --> 1 linha // 1 --> 2 linhas) //(F = n° de pontos:0 --> 5 x 8 pontos // 1 --> 5 x 10 pontos) CMD(0x0E); // Define 0 0 0 0 - 1 D C B //(D = Display on/off: 0 --> off // 1 --> on) //(C = Cursor on/off : 0 --> off // 1 --> on) //(B = Blink on/off : 0 --> off // 1 --> on) CMD(0x06); // Define 0 0 0 0 - 0 1 I/D S //(I/D = Direção de escrita: 0 --> Direita // 1 --> Esquerda) //(S = Display shift : 0 --> Não // 1 --> Sim) } clc(); // Limpa o diplay } /* ********************** **** FIM DE CURSO **** ********************** */ void LCD::fim_de_curso (void){ switch (_coluna){ case 17 : // Se a coluna for igual a 17 switch (_linha){ // o cursor vai para: case 1 : pos(2,1); break; // Linha debaixo case 2 : home(); break; // Posição (1,1) } break; case 0 : // Se a coluna for igual a 0 switch (_linha){ // o cursor vai para: case 1 : pos(2,16); break; // Linha debaixo case 2 : pos(1,16); break; // Linha de cima } break; } } /* ********************* **** BATE ENABLE **** ********************* */ void LCD::bate_enable(void){ E = 1; wait(0.000040f); E=0; wait(0.000040f); } /* ************* **** WRI **** ************* */ void LCD::WRI(int value){ RS = 1; dados = value>>4; bate_enable(); dados = value; bate_enable(); } /* ************* **** CMD **** ************* */ void LCD::CMD(int value){ RS = 0; dados = value>>4; bate_enable(); dados = value; bate_enable(); } /* ********************* **** SETUP_CHARS **** ********************* */ void LCD::setup_chars(){ int new_chars[] = {0x00, 0x01, 0x03, 0x16, 0x1c, 0x08, 0x00, 0x00, // Correto (0) 0x00, 0x0A, 0x0A, 0x0A, 0x00, 0x11, 0x0E, 0x00, // Sorriso (1) 0x0e, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x0e, 0x00, // Relógio (2) 0x00, 0x04, 0x0E, 0x15, 0x04, 0x04, 0x00, 0x00, // Seta para cima (3) 0x00, 0x00, 0x04, 0x04, 0x15, 0x0E, 0x04, 0x00, // Seta para baixo (4) 0x0e, 0x11, 0x05, 0x09, 0x1e, 0x08, 0x04, 0x00, // Seta Horário (5) 0x0e, 0x11, 0x14, 0x12, 0x0f, 0x02, 0x04, 0x00, // Seta Anti_horário (6) 0x00, 0x04, 0x08, 0x17, 0x08, 0x04, 0x00, 0x00, // Seta para Esquerda (7) 0x00, 0x04, 0x02, 0x1d, 0x02, 0x04, 0x00, 0x00 // Seta para Direita (8) }; CMD(0x40); for (int i = 0; i < 7*8; i++){ WRI(new_chars[i]); } CMD(0x80); } /* ********************** ***** FUNÇÃO CLC ***** ********************** */ void LCD::clc(void){ CMD(0x01); wait(0.002); _coluna = 1; _linha = 1; } /* *********************** ***** FUNÇÃO HOME ***** *********************** */ void LCD::home(void){ wait(0.002); dados = 0x0; bate_enable(); dados = 0x2; bate_enable(); wait(0.002); _coluna = 1; _linha = 1; } /* ************************** ***** FUNÇÃO DIREITA ***** ************************** */ void LCD::direita(void){ wait(0.0002); dados = 0x1; bate_enable(); dados = 0x4; bate_enable(); wait(0.0002); _coluna = _coluna+1; fim_de_curso(); wait(0.2); } /* *************************** ***** FUNÇÃO ESQUERDA ***** *************************** */ void LCD::esquerda(void){ wait(0.0002); dados = 0x1; bate_enable(); dados = 0x0; bate_enable(); wait(0.0002); _coluna = _coluna - 1; fim_de_curso(); wait(0.2); } /* ************************ ***** FUNÇÃO APAGA ***** ************************ */ void LCD::apaga(void){ RS = 1; wait(0.002); dados = 0x2; bate_enable(); dados = 0x0; bate_enable(); RS = 0; pos(_linha,_coluna); } /* *********************** ***** FUNÇÃO CIMA ***** *********************** */ void LCD::cima(void){ pos(1,_coluna); wait(0.2); _linha = 1; } /* ************************ ***** FUNÇÃO BAIXO ***** ************************ */ void LCD::baixo(void){ pos(2,_coluna); wait(0.2); _linha = 2; } // /* ********************** ***** FUNÇÃO POS ***** ********************** */ void LCD::pos(int li, int co){ int POSI = 0x80 + ((li-1) * 0x40) + (co-1); CMD(POSI); _coluna = co; _linha = li; } /* *********************** ***** FUNÇÃO PUTC ***** *********************** */ int LCD::_putc(int value) { if (value == '\n') { baixo(); } if(value == '~'){ WRI(0x00); WRI(0x01); WRI(0x02); WRI(0x03); WRI(0x04); } else{ RS = 1; dados = value>>4; bate_enable(); dados = value; bate_enable(); RS = 0; } _chars[_linha-1][_coluna-1] = value; _coluna++; fim_de_curso(); return value; } int LCD::_getc() { return -1; } void LCD::putc(int value){ RS = 1; dados = value>>4; bate_enable(); dados = value; bate_enable(); _coluna++; fim_de_curso(); } void LCD::Clock(int li, int co){ int relogio[8][8] = {0x00,0x0e,0x15,0x17,0x11,0x0e,0x00,0x00, 0x00,0x0e,0x15,0x15,0x13,0x0e,0x00,0x00, 0x00,0x0e,0x15,0x15,0x15,0x0e,0x00,0x00, 0x00,0x0e,0x15,0x15,0x19,0x0e,0x00,0x00, 0x00,0x0e,0x15,0x1d,0x11,0x0e,0x00,0x00, 0x00,0x0e,0x1d,0x15,0x11,0x0e,0x00,0x00, 0x00,0x0e,0x15,0x15,0x11,0x0e,0x00,0x00, 0x00,0x0e,0x17,0x15,0x11,0x0e,0x00,0x00 }; for (int i = 0; i < 8; i++){ CMD(0x40); for (int j = 0; j < 8; j++){ WRI(relogio[i][j]); } pos(li,co); wait(1); WRI(0x00); } } /* ************************ ***** FUNÇÃO LEPOS ***** ************************ */ string LCD::Lepos(void){ string buffer; char li[6]; sprintf(li,"(%d,%d)", _linha, _coluna); buffer.append(li); return buffer; }