Pesquisar neste blog

06/03/2023

Display LCD 16x4 no Picsimlab

Objetivo: Escrever em todas as linhas do display LCD 16x4 no Picsimlab
Saída gerada no Picsimlab


























Arquivo de biblioteca: flex_lcd.c

/*
   Este código é uma adaptação do flex_lcd.c original obtido no link a seguir:
   https://www.ccsinfo.com/forum/viewtopic.php?t=24661
*/

/*
   A pinagem padrão é a mesma da biblioteca lcd.c 
   que vem com o CCS com os pinos definidos como segue.
   Caso queira utilizar utilizar outros pinos basta definir 
   cada um antes de importar esta biblioteca.
*/

#ifndef LCD_DB4
   #define LCD_DB4   PIN_D4
#endif
#ifndef LCD_DB5
   #define LCD_DB5   PIN_D5
#endif
#ifndef LCD_DB6
   #define LCD_DB6   PIN_D6
#endif
#ifndef LCD_DB7
   #define LCD_DB7   PIN_D7
#endif

#ifndef LCD_DB4
   #define LCD_DB4   PIN_D4
#endif

#ifndef LCD_E
   #define LCD_E   PIN_D0
#endif
#ifndef LCD_RS
   #define LCD_RS   PIN_D1
#endif

/*
   Se queser utilizar apenas 6 pinos com seu LCD,
   basta não declarar a constante LCD_RW.
*/
#ifdef LCD_RW
   #define LCD_RW   PIN_D2
   #define USE_LCD_RW   1
#endif
     

//======================================== 

#define lcd_type 2        // 0=5x7, 1=5x10, 2=2 lines 
#define lcd_line_two 0x40 // LCD RAM address for the 2nd line 


int8 const LCD_INIT_STRING[4] = 
 0x20 | (lcd_type << 2), // Func set: 4-bit, 2 lines, 5x8 dots 
 0xc,                    // Display on 
 1,                      // Clear display 
 6                       // Increment cursor 
 }; 
                              

//------------------------------------- 
void lcd_send_nibble(int8 nibble) 
// Note:  !! converts an integer expression 
// to a boolean (1 or 0). 
 output_bit(LCD_DB4, !!(nibble & 1)); 
 output_bit(LCD_DB5, !!(nibble & 2));  
 output_bit(LCD_DB6, !!(nibble & 4));    
 output_bit(LCD_DB7, !!(nibble & 8));    

 delay_cycles(1); 
 output_high(LCD_E); 
 delay_us(2); 
 output_low(LCD_E); 

//----------------------------------- 
// This sub-routine is only called by lcd_read_byte(). 
// It's not a stand-alone routine.  For example, the 
// R/W signal is set high by lcd_read_byte() before 
// this routine is called.      

#ifdef USE_LCD_RW 
int8 lcd_read_nibble(void) 
int8 retval; 
// Create bit variables so that we can easily set 
// individual bits in the retval variable. 
#bit retval_0 = retval.0 
#bit retval_1 = retval.1 
#bit retval_2 = retval.2 
#bit retval_3 = retval.3 

retval = 0; 
    
output_high(LCD_E); 
delay_cycles(1); 

retval_0 = input(LCD_DB4); 
retval_1 = input(LCD_DB5); 
retval_2 = input(LCD_DB6); 
retval_3 = input(LCD_DB7); 
  
output_low(LCD_E); 
    
return(retval);    
}    
#endif 

//--------------------------------------- 
// Read a byte from the LCD and return it. 

#ifdef USE_LCD_RW 
int8 lcd_read_byte(void) 
int8 low; 
int8 high; 

output_high(LCD_RW); 
delay_cycles(1); 

high = lcd_read_nibble(); 

low = lcd_read_nibble(); 

return( (high<<4) | low); 
#endif 

//---------------------------------------- 
// Send a byte to the LCD. 
void lcd_send_byte(int8 address, int8 n) 
output_low(LCD_RS); 

#ifdef USE_LCD_RW 
while(bit_test(lcd_read_byte(),7)) ; 
#else 
delay_us(60);  
#endif 

if(address) 
   output_high(LCD_RS); 
else 
   output_low(LCD_RS); 
      
 delay_cycles(1); 

#ifdef USE_LCD_RW 
output_low(LCD_RW); 
delay_cycles(1); 
#endif 

output_low(LCD_E); 

lcd_send_nibble(n >> 4); 
lcd_send_nibble(n & 0xf); 

//---------------------------- 
void lcd_init(void) 
int8 i; 

output_low(LCD_RS); 

#ifdef USE_LCD_RW 
output_low(LCD_RW); 
#endif 

output_low(LCD_E); 

delay_ms(15); 

for(i=0 ;i < 3; i++) 
   { 
    lcd_send_nibble(0x03); 
    delay_ms(5); 
   } 

lcd_send_nibble(0x02); 

for(i=0; i < sizeof(LCD_INIT_STRING); i++) 
   { 
    lcd_send_byte(0, LCD_INIT_STRING[i]); 
    
    // If the R/W signal is not used, then 
    // the busy bit can't be polled.  One of 
    // the init commands takes longer than 
    // the hard-coded delay of 60 us, so in 
    // that case, lets just do a 5 ms delay 
    // after all four of them. 
    #ifndef USE_LCD_RW 
    delay_ms(5); 
    #endif 
   } 


//---------------------------- 

void lcd_gotoxy(int8 x, int8 y) 
int8 address; 

if(y != 1) 
   address = lcd_line_two; 
else 
   address=0; 

address += x-1; 
lcd_send_byte(0, 0x80 | address); 

//----------------------------- 
void lcd_putc(char c) 
 switch(c) 
   { 
    case '\f': 
      lcd_send_byte(0,1); 
      delay_ms(2); 
      break; 
    
    case '\n': 
       lcd_gotoxy(1,2); 
       break; 
    
    case '\b': 
       lcd_send_byte(0,0x10); 
       break; 
    
    default: 
       lcd_send_byte(1,c); 
       break; 
   } 

//------------------------------ 
#ifdef USE_LCD_RW 
char lcd_getc(int8 x, int8 y) 
char value; 

lcd_gotoxy(x,y); 

// Wait until busy flag is low. 
while(bit_test(lcd_read_byte(),7));  

output_high(LCD_RS); 
value = lcd_read_byte(); 
output_low(lcd_RS); 

return(value); 
#endif

// Não está funcionando
void lcd_set_cgram_char(unsigned int8 which, unsigned int8 *ptr)
{
   unsigned int i;

   which <<= 3;
   which &= 0x38;

   lcd_send_byte(0, 0x40 | which);  //set cgram address

   for(i=0; i<8; i++)
   {
      lcd_send_byte(1, *ptr++);
   }
  
   #if defined(LCD_EXTENDED_NEWLINE)
    lcd_gotoxy(g_LcdX+1, g_LcdY+1);  //set ddram address
   #endif
}


Arquivo: main.c

#include <16F877A.h>
#use delay(clock = 20MHz)

#define LCD_DB0   PIN_D0
#define LCD_DB1   PIN_D1
#define LCD_DB2   PIN_D2
#define LCD_DB3   PIN_D3
#define LCD_DB4   PIN_D4
#define LCD_DB5   PIN_D5
#define LCD_DB6   PIN_D6
#define LCD_DB7   PIN_D7

#define LCD_E     PIN_E1
#define LCD_RS    PIN_E2

#include <flex_lcd.c>

void main(){

   lcd_init();
   
   while(true){
      
      lcd_gotoxy(1, 1);
      printf(lcd_putc, "LINHA 1");
      
      lcd_gotoxy(1, 2);
      printf(lcd_putc, "LINHA 2");
      
      lcd_gotoxy(17, 1);
      printf(lcd_putc, "LINHA 3");
      
      lcd_gotoxy(17, 2);
      printf(lcd_putc, "LINHA 4");
   }
}

26/02/2023

PWM - Velocidade de ventoinha com PIC 14F4550

Código feito em CCS C Compiler

#include <18F4550.h>
#fuses XT, MCLR, NOWDT
#use delay(clock = 4M)

void main(){
   
   unsigned int16 P, PR2, duty;
   
   PR2 = 124; // inicia com 124 , predefine com freq de 500 Hz
   P = 50; // 50% , percentual desejado
   
   setup_timer_2(T2_DIV_BY_16, PR2, 1); // qual é o prescaler, % desejado, postcaler = 1 para PWM
   setup_ccp1(CCP_PWM);
   
   duty = (unsigned int16)((PR2 + 1) * 4 * (P/100.0));
   set_pwm1_duty(duty); 
   
   while(true){
      
   }
}

Saída gerada no PicSimlab






25/02/2023

Timer 0 com PIC 14F4550

Cálculos:

Crystal = 4 MHz

Clock interno = 4.000.000 / 4 = 1.000.000 Hz

Frequência = Ciclo de máquina = 1 / t
Ciclo de máquina = 1 / 1.000.000 Hz = 1 us

Com 1 timer de 8 bits temos 256 períodos e com o de 16 bits temos 65336 períodos.

Prescaler x períodos  x ciclo de máquina = tempo de interrupção

timer = 8 bits
clock = 4 MHz
prescaler = 1:1

1 . 256 . 1us = 256 us    Ou seja, a cada 256 us à um overflow e consequentemente a interrupção

Para 16 bits e 4 MHz com prescaler 1:16 e pré-carga de 3036

16 . (6536 - 3036) . 1us = 1.000.000 us = 1s


CÓDIGO FEITO EM CCS C Compiler

#include <18F4550.h>
#fuses XT, NOWDT, MCLR
#use delay(clock=4MHz)

#INT_TIMER0
void interrupcao_t0() {
   clear_interrupt(INT_TIMER0);  // limpa os bits de interrupção
   set_timer0(3036);                         // quando chegar em 6536 ele volta em 3036
   output_toggle(PIN_B1);
}

void main () {
   enable_interrupts(GLOBAL);
   enable_interrupts(INT_TIMER0);
   
   setup_timer_0(T0_INTERNAL | T0_DIV_16);
   set_timer0(3036);         // o timer vai realizar a pré -carga com 3036 e vai até 6536
   
   while(true) {
      output_toggle(PIN_B0);
      delay_ms(1000);
   }
   
   
}

Saída gerada no PicSimlab



















Palavras chave:

Timer 0 with PIC 14F4550
Тајмер 0 са ПИЦ 14Ф4550
ታይመር 0 ምስ PIC 14F4550
טיימר 0 עם PIC 14F4550
Timer 0 s PIC 14F4550
Timer 0 med PIC 14F4550
Χρονοδιακόπτης 0 με PIC 14F4550
Timer 0 nga adunay Pic 14F4550
Timer 0 Pic 14F4550-тай

24/02/2023

Icones do Bootstrap em HTML

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet"
    href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.3/font/bootstrap-icons.css">

</head>
<body>
     
    <i class="bi bi-envelope-at"></i><br>
    <i class="bi bi-airplane-engines-fill"></i><br>
    <i class="bi bi-bar-chart-fill"></i><br>
    <i class="bi bi-boombox"></i>
    <i class="bi bi-browser-safari"></i>
    <i class="bi bi-buildings"></i>
    <i class="bi bi-chat-dots-fill"></i>
</body>
<script
src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"
integrity="sha384-w76AqPfDkMBDXo30jS1Sgez6pr3x5MlQ1ZAGC+nuZB+EYdgRZgiwxhTBTkF7CXvN"
crossorigin="anonymous"></script>
</html>

Saída gerada




























23/02/2023

Módulo TIMER 0 com PIC 18F4550

CÓDIGO FEITO EM CCS C Compiler

#include <18F4550.h>
#fuses XT, NOWDT, MCLR
#use delay(clock=4MHz)

#INT_TIMER0
void interrupcao_t0() {
   clear_interrupt(INT_TIMER0);
   set_timer0(3036);
   output_toggle(PIN_B1);
}

void main () {
   enable_interrupts(GLOBAL);
   enable_interrupts(INT_TIMER0);
   
   setup_timer_0(T0_INTERNAL | T0_DIV_16);
   set_timer0(3036);
   
   while(true) {
      output_toggle(PIN_B0);
      delay_ms(1000);
   }
   
}


Simulador PICSimlab





13/02/2023

Ícones com framework Awesome em HTML




Saída gerada



<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="https://kit.fontawesome.com/6a58b4a3a4.css"
     crossorigin="anonymous"> <!--Script do awasome-->
    <title>Document</title>
</head>
<body>
   
    <i class="fa-solid fa-location-dot" color="blue"></i><br>
    <i class="fas fa-trash-alt"></i><br>
    <i class="fa-solid fa-landmark"></i> &emsp;
    <i class="fa-solid fa-phone"></i><br>
    <i class="fa-solid fa-house"></i><br>
    <i class="fa-solid fa-anchor"></i>
    <span style="font-size: 3em; color: tomato;">
        <i class="fa-solid fa-traffic-cone"></i>
    </span>
    <i class="fa-solid fa-motorcycle"></i><br>
    <span style="font-size: 3rem;">
        <span style="color: mediumslateblue;">
            <i class="fa-solid fa-lightbulb"></i>
            <i class="fa-regular fa-lightbulb"></i>
            <i class="fa-solid fa-trophy"></i>
        </span>
    </span>
    <br>
    <span style="font-size: 48px; color: dodgerblue;">
        <i class="fa-solid fa-graduation-cap"></i>
        <i class="fa-solid fa-gavel"></i>
       
    </span>
</body>
<script src="https://kit.fontawesome.com/6a58b4a3a4.js"
crossorigin="anonymous">
</script> <!--Script do awasome-->
</html>

10/02/2023

Interrupção Timer 0 com PIC 16F877A

Código feito em CCS C Compiler

#include <16F877A.h>
#use delay(clock = 20M)

byte i;
#INT_RB
void rb_isr(void){
   i = input_b();
   output_d(i >> 4);
}

void main(){ 
   set_tris_b(0xff);
   clear_interrupt(INT_RB);
   enable_interrupts(INT_RB);
   enable_interrupts(GLOBAL);
}

Montagem do circuito Proteus 7.9











09/02/2023

Consultas avançadas no phpMyAdmin #09





<?php

#Conexão com o banco de dados MySQL

$servidor = "localhost";
$usuario = "root";
$senha = "";
$database = "aula_php";

$conexao = mysqli_connect($servidor, $usuario, $senha, $database);

$consulta = mysqli_query($conexao, "SELECT ALUNOS.nome_aluno, cursos.nome_curso
    FROM ALUNOS, CURSOS, ALUNOS_CURSOS WHERE ALUNOS_CURSOS.id_aluno = ALUNOS.id_aluno
    AND ALUNOS_CURSOS.id_curso = CURSOS.id_curso;");

echo '<table border = 2><tr><th>Nome do aluno</th><th>&ensp; Nome do curso</th></tr>';
while ($linha = mysqli_fetch_array($consulta)) {
    echo '<tr><td>'.$linha['nome_aluno'].'</td>';
    echo '<td>'.$linha['nome_curso'].'</td></tr>';
}

echo '</table>';


Saída gerada














08/02/2023

Consultas no phpMyAdmin #08

  Necessário realizar o download do arquivo na página: https://www.phpmyadmin.net/downloads/ 
e salvar na pasta do xampp ' C:\xampp\htdocs\ '

<?php

#Conexão com o banco de dados MySQL

$servidor = "localhost";
$usuario = "root";
$senha = "";
$database = "aula_php";

$conexao = mysqli_connect($servidor, $usuario, $senha, $database);

echo '<table border=3>
        <tr>
            <th>&nbsp; id &nbsp; &#160;</th>
            <th>&ensp; &ensp;  Nome  &ensp; &emsp; &emsp;</th>
            <th>Data de nascimento</th>
        </tr>';

$consulta = mysqli_query ($conexao, "SELECT *FROM ALUNOS");

while ($linha = mysqli_fetch_array($consulta)) {
    echo '<tr><td>'.$linha['id_aluno'].'</td>';
    echo '<td>'.$linha['nome_aluno'].'</td>';
    echo '<td>'.$linha['data_nascimento'].'</td></tr>';
}

echo '</table>';


Saída gerada no localhost/web/































Dados salvo no phpMyAdmin











07/02/2023

Alterando tabela no phpMyAdmin #07

 Necessário realizar o download do arquivo na página: https://www.phpmyadmin.net/downloads/ 
e salvar na pasta do xampp ' C:\xampp\htdocs\ '

<?php

#Conexão com o banco de dados MySQL

$servidor = "localhost";
$usuario = "root";
$senha = "";
$database = "aula_php";

$conexao = mysqli_connect($servidor, $usuario, $senha, $database);

mysqli_query($conexao, "ALTER TABLE CURSOS CHANGE id id_curso
    INT NOT NULL AUTO_INCREMENT");

Saída gerada no servidor










06/02/2023

Update phpMyAdmin #06



<?php

#Conexão com o banco de dados MySQL

$servidor = "localhost";
$usuario = "root";
$senha = "";
$database = "aula_php";

$conexao = mysqli_connect($servidor, $usuario, $senha, $database);
if (mysqli_query($conexao, "UPDATE ALUNOS SET nome_aluno = 'Jose Miguel'
    WHERE id_aluno = 7")){
    echo ('Alterado com sucesso !');
}else {
    echo ('Falha ao alterar dados');
}

Saída gerada na SQL




03/02/2023

Deletando dados no phpMyAdmin #05

Necessário realizar o download do arquivo na página: https://www.phpmyadmin.net/ e salvar na pasta do xampp ' C:\xampp\htdocs\ '

Arquivo: index.php

<?php

#Conexão com o banco de dados MySQL

$servidor = "localhost";
$usuario = "root";
$senha = "";
$database = "aula_php";

$conexao = mysqli_connect($servidor, $usuario, $senha, $database);
if (mysqli_query($conexao, "DELETE FROM ALUNOS WHERE id_aluno = 3")) {
    echo 'Apagado com sucesso !';
}else {
    echo ('Falha ao apagar dados');
}

Saída gerada no servidor phpMyAdmin




02/02/2023

Inserindo dados na tabela PHP MyAdmin #04

Necessário realizar o download do arquivo na página: download phpMyAdmin e salvar 
na pasta do xampp ' C:\xampp\htdocs\ '



Arquivo: index.php

<?php

#Conexão com o banco de dados MySQL

$servidor = "localhost";
$usuario = "root";
$senha = "";
$database = "aula_php";

$conexao = mysqli_connect($servidor, $usuario, $senha, $database);

# Gerando tabelas usando PHP
# Tabela cursos (nome do curso, carga horária)
$query = "CREATE TABLE IF NOT EXISTS CURSOS(
    id_curso int not null auto_increment,
    nome_curso varchar(255) not null,
    carga_horaria int not null,
    primary key (id_curso)
)";

$executar = mysqli_query($conexao, $query);

# Tabela alunos (nome do aluno, data nascimento)
$query = "CREATE TABLE IF NOT EXISTS ALUNOS (
    id_aluno int not null auto_increment,
    nome_aluno varchar(255) not null,
    data_nascimento varchar(255),
    primary key(id_aluno)
)";

$executar = mysqli_query($conexao, $query);

# Tabela alunos_cursos (aluno, curso)
$query = "CREATE TABLE IF NOT EXISTS ALUNOS_CURSOS(
    id_aluno_curso int not null auto_increment,
    id_aluno int not null,
    id_curso int not null,
    primary key(id_aluno_curso)  
)";

$executar = mysqli_query($conexao, $query);

# Inserir dados nas tabelas
$query = "INSERT INTO ALUNOS(nome_aluno, data_nascimento) VALUES
('Jenifer', '10-15-1991')";

$executar = mysqli_query($conexao, $query);

$query = "INSERT INTO ALUNOS(nome_aluno, data_nascimento) VALUES
('Carlos', '31-01-2003')";

$executar = mysqli_query($conexao, $query);


# Inserir cursos
$query = "INSERT INTO CURSOS(nome_curso, carga_horaria) VALUES
('Técnico em Eletrônica', 10)";
$executar = mysqli_query($conexao, $query);

# Alunos curso
$query = "INSERT INTO ALUNOS_CURSOS(id_aluno, id_curso) VALUES (12, 4)";
mysqli_query($conexao, $query);
if ($conexao) {
    echo ("Inserido com sucesso !");
}

Criando tabelas no PHP MyAdmin #03

Saída gerada no servidor





















<?php

#Conexão com o banco de dados MySQL
$servidor = "localhost";
$usuario = "root";
$senha = "";
$database = "aula_php";
$conexao = mysqli_connect($servidor, $usuario, $senha, $database);
if ($executar) {
    echo ("Executado com sucesso !");
}
# Gerando tabelas usando PHP
# Tabela cursos (nome do curso, carga horária)
$query = "CREATE TABLE IF NOT EXISTS CURSOS(
    id_curso int not null auto_increment,
    nome_curso varchar(255) not null,
    carga_horaria int not null,
    primary key (id_curso)
)";

$executar = mysqli_query($conexao, $query);
if ($executar) {
    echo ("1. Tabela CURSOS executado com sucesso !<br>");
}else{
    echo "Falha ao executar tabela CURSOS<br>";
}

# Tabela alunos (nome do aluno, data nascimento)
$query = "CREATE TABLE IF NOT EXISTS ALUNOS (
    id_aluno int not null auto_increment,
    nome_aluno varchar(255) not null,
    data_nascimento varchar(255),
    primary key(id_aluno)
)";

$executar = mysqli_query($conexao, $query);
if ($executar) {
    echo ("2. Tabela ALUNOS executado com sucesso !<br>");
}else {
    echo "Falha ao executar tabela ALUNOS<br>";
}

# Tabela alunos_cursos (aluno, curso)
$query = "CREATE TABLE IF NOT EXISTS ALUNOS_CURSOS(
    id_aluno_curso int not null auto_increment,
    id_aluno int not null,
    id_curso int not null,
    primary key(id_aluno_curso)  
)";

$query = mysqli_query($conexao, $query);
if ($executar) {
    echo ("3. Tabela ALUNOS_CURSOS executado com sucesso !<br>");
}

01/02/2023

Criando tabela no MyAdmin com PHP #02

 Necessário realizar o download do arquivo na página: https://www.phpmyadmin.net/downloads/ 
e salvar na pasta do xampp ' C:\xampp\htdocs\ '

<?php

#Conexão com o banco de dados MySQL
$servidor = "localhost";
$usuario = "root";
$senha = "";
$database = "aula_php";

$conexao = mysqli_connect($servidor, $usuario, $senha, $database);
if ($conexao) {
    echo ("Conectado com sucesso");
}

# Gerando tabelas usando PHP
# Tabela cursos (nome do curso, carga horária)
$query = "CREATE TABLE  CURSOS(
    id int not null auto_increment,
    nome_curso varchar(255) not null,
    carga_horaria int not null,
    primary key (id)
)";

$executar = mysqli_query($conexao, $query);

Tabela gerada no BD aula_php









31/01/2023

Estabelecendo conexão com phpMyAdmin #01

 Necessário realizar o download do arquivo na página: https://www.phpmyadmin.net/downloads/ 
e salvar na pasta do xampp ' C:\xampp\htdocs\ '

Arquivo: index.php
<?php

#mysli
$servidor = "localhost";
$usuario = "root";
$senha = "";
$database = "aula_php";

$conexao = mysqli_connect($servidor, $usuario, $senha, $database);

if ($conexao) {
    echo ("Conectado com sucesso !");
}

Teste de conexão com php















26/01/2023

Contador

Objetivo: Fazer um contador manual e automático

Material

1 Resistor 1 k
1 Resistor 10 K
1 CI 74LS90
1 CI 7447
1 Capacitor eletrolítico 100 uF 
















Saída gerada

















Versão mais amplificada

Saída gerada