Pesquisar neste blog

02/04/2022

#Desafio 4 - Biblioteca LCD



Desafio: Acrescentar funções a biblioteca mod_lcd.c e criar uma nova com o nome mod_lcd_plus.c

    1. A biblioteca mod_lcd_plus.c deve ter no mínimo cinco funções a mais que a original sendo que uma delas servira para desenha caracteres definidos pelo usuário. Essa nova função deve chamar lcd_escreve_graphic. As outras quatros funções podem ser definida por você, isto é, você define o nome e o que a função vai fazer. 

    2. Faça um programa para apresentar a nova biblioteca que rode no PICSimLab com a board PICGenios e o PIC 16F877A 

Resolução em CÓDIGO FEITO EM CCS C Compiler

Arquivo: mod_lcd.c

/************************************************************************/
/*  MOD_LCD.C - Biblioteca de manipulação de módulo LCD                 */
/*                                                                      */
/*  Autor: Fábio Pereira                                                */
/*                                                                      */
/************************************************************************/

// As definições a seguir são utilizadas para acesso aos pinos do display
// caso o pino RW não seja utilizado, comente a definição lcd_rw
#ifndef lcd_enable
#define lcd_enable pin_e1 // pino enable do LCD
#define lcd_rs pin_e0 // pino rs do LCD
//#define lcd_rw pin_e2 // pino rw do LCD
#define lcd_d4 pin_d4 // pino de dados d4 do LCD
#define lcd_d5 pin_d5 // pino de dados d5 do LCD
#define lcd_d6 pin_d6 // pino de dados d6 do LCD
#define lcd_d7 pin_d7 // pino de dados d7 do LCD
#endif

#define lcd_type 2           // 0=5x7, 1=5x10, 2=2 linhas
#define lcd_seg_lin 0x40    // Endereço da segunda linha na RAM do LCD

// a constante abaixo define a seqüência de inicialização do módulo LCD
byte CONST INI_LCD[4] = {0x20 | (lcd_type << 2), 0xf, 1, 6};

byte lcd_le_byte()
// lê um byte do LCD (somente com pino RW)
{
byte dado;
// configura os pinos de dados como entradas
input(lcd_d4);
input(lcd_d5);
input(lcd_d6);
input(lcd_d7);
// se o pino rw for utilizado, coloca em 1
#ifdef lcd_rw
output_high(lcd_rw);
#endif
   output_high(lcd_enable); // habilita display
dado = 0; // zera a variável de leitura
// lê os quatro bits mais significativos
if (input(lcd_d7)) bit_set(dado,7);
if (input(lcd_d6)) bit_set(dado,6);
if (input(lcd_d5)) bit_set(dado,5);
if (input(lcd_d4)) bit_set(dado,4);
// dá um pulso na linha enable
output_low(lcd_enable);
output_high(lcd_enable);
// lê os quatro bits menos significativos
if (input(lcd_d7)) bit_set(dado,3);
if (input(lcd_d6)) bit_set(dado,2);
if (input(lcd_d5)) bit_set(dado,1);
if (input(lcd_d4)) bit_set(dado,0);
output_low(lcd_enable); // desabilita o display
return dado; // retorna o byte lido
}

void lcd_envia_nibble( byte dado )
// envia um dado de quatro bits para o display
{
// coloca os quatro bits nas saidas
output_bit(lcd_d4,bit_test(dado,0));
output_bit(lcd_d5,bit_test(dado,1));
output_bit(lcd_d6,bit_test(dado,2));
output_bit(lcd_d7,bit_test(dado,3));
// dá um pulso na linha enable
output_high(lcd_enable);
output_low(lcd_enable);
}


void lcd_envia_byte( boolean endereco, byte dado )
{
// coloca a linha rs em 0
output_low(lcd_rs);
// aguarda o display ficar desocupado
//while ( bit_test(lcd_le_byte(),7) ) ;
// configura a linha rs dependendo do modo selecionado
output_bit(lcd_rs,endereco);
delay_us(100); // aguarda 100 us
// caso a linha rw esteja definida, coloca em 0
#ifdef lcd_rw
output_low(lcd_rw);
#endif
// desativa linha enable
output_low(lcd_enable);
// envia a primeira parte do byte
lcd_envia_nibble(dado >> 4);
// envia a segunda parte do byte
lcd_envia_nibble(dado & 0x0f);
}


void lcd_ini()
// rotina de inicialização do display
{
byte conta;
output_low(lcd_d4);
output_low(lcd_d5);
output_low(lcd_d6);
output_low(lcd_d7);
output_low(lcd_rs);
#ifdef lcd_rw
output_high(lcd_rw);
#endif
output_low(lcd_enable);
delay_ms(15);
// envia uma seqüência de 3 vezes 0x03
// e depois 0x02 para configurar o módulo
// para modo de 4 bits
for(conta=1;conta<=3;++conta)
{
lcd_envia_nibble(3);
delay_ms(5);
}
lcd_envia_nibble(2);
// envia string de inicialização do display
for(conta=0;conta<=3;++conta) lcd_envia_byte(0,INI_LCD[conta]);
}

void lcd_pos_xy( byte x, byte y)
{
   byte endereco;
   if(y!=1)
    endereco = lcd_seg_lin;
   else
    endereco = 0;
   endereco += x-1;
   lcd_envia_byte(0,0x80|endereco);
}

void lcd_escreve( char c)
// envia caractere para o display
{
   switch (c)
{
     case '\f' : lcd_envia_byte(0,1);
  delay_ms(2);
break;
     case '\n' :
case '\r' : lcd_pos_xy(1,2);
  break;
     case '\b' : lcd_envia_byte(0,0x10);
  break;
     default : lcd_envia_byte(1,c);
  break;
   }
}

char lcd_le( byte x, byte y)
// le caractere do display
{
char valor;
// seleciona a posição do caractere
lcd_pos_xy(x,y);
// ativa rs
output_high(lcd_rs);
// lê o caractere
valor = lcd_le_byte();
// desativa rs
output_low(lcd_rs);
// retorna o valor do caractere
return valor;
}

Arquivo: mod_lcd_graphic

/************************************************************************/
/* MOD_LCD_GRAPHIC.C - Biblioteca de manipulação de módulo LCD ++ */
/* */
/* Autor: Fábio Pereira e Alberto Willian Mascarenhas */
/* */
/************************************************************************/
// Command set for Hitachi 44780U LCD display controller
#define LCD_CLEAR 0x01 // It clears everythings
#define LCD_HOME 0x02 // set the cursor to first line and first row
#define LCD_CURSOR_BACK 0x10 // moves curson one position back
#define LCD_CURSOR_FWD 0x14 //moves curson one position forward
#define LCD_PAN_LEFT 0x18 // used to scroll text left side to scroll text
#define LCD_PAN_RIGHT 0x1C // used to scroll text right side to scroll text
#define LCD_CURSOR_OFF 0x0C // stops display curson on screen
#define LCD_CURSOR_ON 0x0E // turns on cursor display
#define LCD_CURSOR_BLINK 0x0F // curson keeps blinking
#define LCD_CURSOR_LINE2 0xC0 // move curson to scond line or second row
// As definições a seguir são utilizadas para acesso aos pinos do display
// caso o pino RW não seja utilizado, comente a definição lcd_rw
#ifndef lcd_enable
#define lcd_enable pin_e1 // pino enable do LCD
#define lcd_rs pin_e0 // pino rs do LCD
//#define lcd_rw pin_e2 // pino rw do LCD
#define lcd_d4 pin_d4 // pino de dados d4 do LCD
#define lcd_d5 pin_d5 // pino de dados d5 do LCD
#define lcd_d6 pin_d6 // pino de dados d6 do LCD
#define lcd_d7 pin_d7 // pino de dados d7 do LCD
#endif
#define lcd_type 2 // 0=5x7, 1=5x10, 2=2 linhas
#define lcd_seg_lin 0x40 // Endereço da segunda linha na RAM do LCD
// a constante abaixo define a seqüência de inicialização do módulo LCD
byte CONST INI_LCD[4] = {0x20 | (lcd_type << 2), 0xf, 1, 6};
byte lcd_le_byte()
// lê um byte do LCD (somente com pino RW)
{
byte dado;
// configura os pinos de dados como entradas
input(lcd_d4);
input(lcd_d5);
input(lcd_d6);
input(lcd_d7);
// se o pino rw for utilizado, coloca em 1
#ifdef lcd_rw
output_high(lcd_rw);
#endif
 output_high(lcd_enable); // habilita display
dado = 0; // zera a variável de leitura
// lê os quatro bits mais significativos
if (input(lcd_d7)) bit_set(dado,7);
if (input(lcd_d6)) bit_set(dado,6);
if (input(lcd_d5)) bit_set(dado,5);
if (input(lcd_d4)) bit_set(dado,4);
// dá um pulso na linha enable
output_low(lcd_enable);
output_high(lcd_enable);
// lê os quatro bits menos significativos
if (input(lcd_d7)) bit_set(dado,3);
if (input(lcd_d6)) bit_set(dado,2);
if (input(lcd_d5)) bit_set(dado,1);
if (input(lcd_d4)) bit_set(dado,0);
output_low(lcd_enable); // desabilita o display
return dado; // retorna o byte lido
}
void lcd_envia_nibble( byte dado )
// envia um dado de quatro bits para o display
{
// coloca os quatro bits nas saidas
output_bit(lcd_d4,bit_test(dado,0));
output_bit(lcd_d5,bit_test(dado,1));
output_bit(lcd_d6,bit_test(dado,2));
output_bit(lcd_d7,bit_test(dado,3));
// dá um pulso na linha enable
output_high(lcd_enable);
output_low(lcd_enable);
}
void lcd_envia_byte( boolean endereco, byte dado )
{
// coloca a linha rs em 0
output_low(lcd_rs);
// aguarda o display ficar desocupado
//while ( bit_test(lcd_le_byte(),7) ) ;
// configura a linha rs dependendo do modo selecionado
output_bit(lcd_rs,endereco);
delay_us(100); // aguarda 100 us
// caso a linha rw esteja definida, coloca em 0
#ifdef lcd_rw
output_low(lcd_rw);
#endif
// desativa linha enable
output_low(lcd_enable);
// envia a primeira parte do byte
lcd_envia_nibble(dado >> 4);
// envia a segunda parte do byte
lcd_envia_nibble(dado & 0x0f);
}
void lcd_ini()
// rotina de inicialização do display
{
byte conta;
output_low(lcd_d4);
output_low(lcd_d5);
output_low(lcd_d6);
output_low(lcd_d7);
output_low(lcd_rs);
#ifdef lcd_rw
output_high(lcd_rw);
#endif
output_low(lcd_enable);
delay_ms(15);
// envia uma seqüência de 3 vezes 0x03
// e depois 0x02 para configurar o módulo
// para modo de 4 bits
for(conta=1;conta<=3;++conta)
{
lcd_envia_nibble(3);
delay_ms(5);
}
lcd_envia_nibble(2);
// envia string de inicialização do display
for(conta=0;conta<=3;++conta) lcd_envia_byte(0,INI_LCD[conta]);
}
void lcd_pos_xy( byte x, byte y)
{
 byte endereco;
 if(y!=1)
 endereco = lcd_seg_lin;
 else
 endereco = 0;
 endereco += x-1;
 lcd_envia_byte(0,0x80|endereco);
}
void lcd_escreve( char c)
// envia caractere para o display
{
 switch (c)
{
 case '\f' : lcd_envia_byte(0,1);
 delay_ms(2);
break;
 case '\n' :
case '\r' : lcd_pos_xy(1,2);
 break;
 case '\b' : lcd_envia_byte(0,0x10);
 break;
 default : lcd_envia_byte(1,c);
 break;
 }
}
char lcd_le( byte x, byte y)
// le caractere do display
{
char valor;
// seleciona a posição do caractere
lcd_pos_xy(x,y);
// ativa rs
output_high(lcd_rs);
// lê o caractere
valor = lcd_le_byte();
// desativa rs
output_low(lcd_rs);
// retorna o valor do caractere
return valor;
}
//-----------------------------------------------------------------
//
// Funções adicionadas por Alberto Willian Mascarenhas
//
//-----------------------------------------------------------------
void CriaCaracterEspecial (unsigned char *Pattern, char Location)
{
 int i=0;
 lcd_envia_byte(0,0x40+(Location*8)); //Send the Address of CGRAM
 for (i=0; i<8; i++)
 lcd_envia_byte(1,Pattern [ i ] ); //Pass the bytes of pattern on LCD
}
void Lcd_Imprime_String(char *a)
{
 int i;
 for(i=0;a[i]!='\0';i++)
 lcd_envia_byte(1,a[i]); //Lcd_Print_Char(a[i]);
 //Split the string using pointers and call the Char function
}

Arquivo principal: LCD expandida

//EXEMPLO RETIRADO DO LIVRO
#include <16F877A.h>
#device adc = 8
// Uma animação simples no display
//#include <16f877.h>
#use delay(clock = 20MHz)
#fuses HS,NOWDT,PUT,NOBROWNOUT,NOLVP
#include <mod_lcd.c>

void main(){
   char k;
   
   setup_adc_ports(no_analogs); // desliga as entradas analógicas
   lcd_ini();
   // configura registrador AC para o endereço inicial da CGRAM
   lcd_envia_byte(0,0x40);
   lcd_envia_byte(1,0x04); // primeira linha do primeiro caractere
   lcd_envia_byte(1,0x0e); // segunda linha do primeiro caractere
   lcd_envia_byte(1,0x15); // terceira linha do primeiro caractere
   lcd_envia_byte(1,0x04); // quarta linha do primeiro caractere
   lcd_envia_byte(1,0x04); // quinta linha do primeiro caractere
   lcd_envia_byte(1,0x04); // sexta linha do primeiro caractere
   lcd_envia_byte(1,0x04); // sétima linha do primeiro caractere
   lcd_envia_byte(1,0x00); // oitava linha do primeiro caractere
   lcd_envia_byte(1,0x00); // primeira linha do segundo caractere
   lcd_envia_byte(1,0x04); // segunda linha do segundo caractere
   lcd_envia_byte(1,0x0e); // terceira linha do segundo caractere
   lcd_envia_byte(1,0x15); // quarta linha do segundo caractere
   lcd_envia_byte(1,0x04); // quinta linha do segundo caractere
   lcd_envia_byte(1,0x04); // sexta linha do segundo caractere
   lcd_envia_byte(1,0x04); // sétima linha do segundo caractere
   lcd_envia_byte(1,0x00); // oitava linha do segundo caractere
   
   // registrador AC aponta para a primeira coluna da segunda linha
   lcd_envia_byte(0,0xC0);

   while(TRUE){
      
      // registrador AC aponta para a primeira coluna da segunda linha
      lcd_envia_byte(0,0xC0);
      // imprime o primeiro caractere do usuário
      lcd_envia_byte(1,0x00);
      delay_ms(300);
      // registrador AC aponta para a primeira coluna da segunda linha
      lcd_envia_byte(0,0xC0);
      // imprime o segundo caractere do usuário
      lcd_envia_byte(1,0x01);
      delay_ms(300);
      
   }
}


















20/03/2022

Mini teste 1 - 2022/1

Projete um sistema com microcontrolador PIC (circuitos necessários para o microcontrolador funcionar) para funcionar da seguinte forma: 
quando o usuário do micro-ondas (figura 1) apertar o botão INÍCIO (primeira vez) o micro-ondas começa uma contagem decrescente de 30 para zero; se o usuário apertar novamente antes da contagem chegar a zero ele soma mais trinta a contagem atual e continua a contagem decrescente. Quando chegar em zero para a contagem e liga um LED OBS.: o circuito deve ter a os conectores para gravação; circuito do oscilador; alimentação; circuito do LED; circuito do botão e circuito para display de sete seguimentos.













Resolução:

CÓDIGO FEITO EM CCS C Compiler

#include <16F877A.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES BROWNOUT //Reset when brownout detected
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#use delay(clock = 20MHz)

unsigned int cont_int = 0;
unsigned int tempo = 0, i =0;
int1 mostra_UD = 0;

byte const numeros[11] ={
 0b00111111, //0
 0b00000110, //1
 0b01011011, //2
 0b01001111, //3
 0b01100110, //4
 0b01101101, //5
 0b01111101, //6
 0b00000111, //7
 0b01111111, //8
 0b01101111 //9
 };

#int_RTCC
void RTCC_isr(void){
   
   if(++cont_int>154){
      //output_toggle(PIN_B5);
      tempo--;
      cont_int = 0;
   }
 
   if(mostra_UD==0){
      mostra_UD=1;
      i = tempo/10;
      output_d(numeros[i]);
      output_high(PIN_A4);
      output_low(PIN_A5);
   }else{
      mostra_UD=0;
      i = tempo%10;
      output_d(numeros[i]);
      output_low(PIN_A4);
      output_high(PIN_A5);
   }

 
   if(tempo==0){
      disable_interrupts(INT_RTCC);
      output_high(PIN_B6); //liga o buzzer
      
      delay_ms(2000);
      output_low(PIN_B6); //desliga o buzzer
   }
}
#int_EXT
void EXT_isr(void){
   enable_interrupts(INT_RTCC);
   tempo = tempo + 30;
   output_toggle(PIN_B4);
}



void main(){
   
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   // Programa o Timer0
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_128); // overflow vai ser com 6,5ms

   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

   // Habilita/desabilita as interrupções do Timer0 e externa (b0)
   disable_interrupts(INT_RTCC);
   enable_interrupts(INT_EXT);

   ext_int_edge( L_TO_H );
   enable_interrupts(GLOBAL);

   // Apaga os display 7 segmentos
   output_low(PIN_A2);
   output_low(PIN_A3);
   output_low(PIN_A4);
   output_low(PIN_A5);
   output_low(PIN_B6); //desliga o buzzer

   while(true){
   };
}
 
Software: PicsimLab





17/03/2022

Leitura do conversor AD no PicsimLab com PIC 16F877A

CÓDIGO FEITO EM CCS C Compiler

ARQUIVO mod_lcd.c

/*******************************************************/
/*  MOD_LCD.C - Biblioteca de manipula  o de módulo LCD  */
/******************************************************/

// As definições a seguir são utilizadas para acesso aos pinos do display
// caso o pino RW n o seja utilizado, comente a defini  o lcd_rw
#ifndef lcd_enable
   #define lcd_enable       pin_e1      // pino enable do LCD
   #define lcd_rs         pin_e0      // pino rs do LCD
   //#define lcd_rw      pin_e2      // pino rw do LCD
   #define lcd_d4         pin_d4      // pino de dados d4 do LCD
   #define lcd_d5         pin_d5      // pino de dados d5 do LCD
   #define lcd_d6         pin_d6      // pino de dados d6 do LCD
   #define lcd_d7         pin_d7      // pino de dados d7 do LCD
#endif

#define lcd_type 2           // 0=5x7, 1=5x10, 2=2 linhas
#define lcd_seg_lin 0x40    // Endere o da segunda linha na RAM do LCD

// a constante abaixo define a seq  ncia de inicializa  o do m dulo LCD
byte CONST INI_LCD[4] = {0x20 | (lcd_type << 2), 0xf, 1, 6};

byte lcd_le_byte()
// l  um byte do LCD (somente com pino RW)
{
   byte dado;
   // configura os pinos de dados como entradas
   input(lcd_d4);
   input(lcd_d5);
   input(lcd_d6);
   input(lcd_d7);
   // se o pino rw for utilizado, coloca em 1
   #ifdef lcd_rw
      output_high(lcd_rw);
   #endif
   output_high(lcd_enable); // habilita display
   dado = 0;   // zera a vari vel de leitura
   // l  os quatro bits mais significativos
   if (input(lcd_d7)) bit_set(dado,7);
   if (input(lcd_d6)) bit_set(dado,6);
   if (input(lcd_d5)) bit_set(dado,5);
   if (input(lcd_d4)) bit_set(dado,4);
   // d  um pulso na linha enable
   output_low(lcd_enable);
   output_high(lcd_enable);
   // l  os quatro bits menos significativos
   if (input(lcd_d7)) bit_set(dado,3);
   if (input(lcd_d6)) bit_set(dado,2);
   if (input(lcd_d5)) bit_set(dado,1);
   if (input(lcd_d4)) bit_set(dado,0);
   output_low(lcd_enable);   // desabilita o display
   return dado;   // retorna o byte lido
}

void lcd_envia_nibble( byte dado )
// envia um dado de quatro bits para o display
{
   // coloca os quatro bits nas saidas
   output_bit(lcd_d4,bit_test(dado,0));
   output_bit(lcd_d5,bit_test(dado,1));
   output_bit(lcd_d6,bit_test(dado,2));
   output_bit(lcd_d7,bit_test(dado,3));
   // d  um pulso na linha enable
   output_high(lcd_enable);
   output_low(lcd_enable);
}


void lcd_envia_byte( boolean endereco, byte dado ){
   // coloca a linha rs em 0
   output_low(lcd_rs);
   // aguarda o display ficar desocupado
   //while ( bit_test(lcd_le_byte(),7) ) ;
   // configura a linha rs dependendo do modo selecionado
   output_bit(lcd_rs,endereco);
   delay_us(100);   // aguarda 100 us
   // caso a linha rw esteja definida, coloca em 0
   #ifdef lcd_rw
      output_low(lcd_rw);
   #endif
   // desativa linha enable
   output_low(lcd_enable);
   // envia a primeira parte do byte
   lcd_envia_nibble(dado >> 4);
   // envia a segunda parte do byte
   lcd_envia_nibble(dado & 0x0f);
}


void lcd_ini()
// rotina de inicializa  o do display
{
   byte conta;
   output_low(lcd_d4);
   output_low(lcd_d5);
   output_low(lcd_d6);
   output_low(lcd_d7);
   output_low(lcd_rs);
   #ifdef lcd_rw
      output_high(lcd_rw);
   #endif
   output_low(lcd_enable);
   delay_ms(15);
   // envia uma seq  ncia de 3 vezes 0x03
   // e depois 0x02 para configurar o m dulo
   // para modo de 4 bits
   for(conta=1;conta<=3;++conta){
      lcd_envia_nibble(3);
      delay_ms(5);
   }
   lcd_envia_nibble(2);
   // envia string de inicializa  o do display
   for(conta=0;conta<=3;++conta) lcd_envia_byte(0,INI_LCD[conta]);
}

void lcd_pos_xy( byte x, byte y){
   byte endereco;
   if(y!=1)
      endereco = lcd_seg_lin;
   else
      endereco = 0;
   endereco += x-1;
   lcd_envia_byte(0,0x80|endereco);
}

void lcd_escreve( char c)
// envia caractere para o display
{
   switch (c)
   {
     case '\f'    :   lcd_envia_byte(0,1);
              delay_ms(2);
            break;
     case '\n'   :
     case '\r'    :   lcd_pos_xy(1,2);
              break;
     case '\b'    :   lcd_envia_byte(0,0x10);
              break;
     default   :   lcd_envia_byte(1,c);
              break;
   }
}

char lcd_le( byte x, byte y)
// le caractere do display
{
   char valor;
   // seleciona a posi  o do caractere
   lcd_pos_xy(x,y);
   // ativa rs
   output_high(lcd_rs);
   // l  o caractere
   valor = lcd_le_byte();
   // desativa rs
   output_low(lcd_rs);
   // retorna o valor do caractere
   return valor;
}


ARQUIVO PRINCIPAL

#include <16F877A.h>
#device adc = 8
#FUSES NOWDT
#FUSES HS
#FUSES NOPUT
#FUSES NOPROTECT
#FUSES NODEBUG
#FUSES BROWNOUT
#FUSES NOLVP
#FUSES NOCPD
#FUSES NOWRT

#use delay(clock = 20MHz)

#ifndef lcd_enable
   #define lcd_enable   pin_e1 // pino enable do LCD
   #define lcd_rs       pin_e2 // pino rs do LCD
   //#define lcd_rw       pin_e2 // pino rw do LCD
   #define lcd_d4       pin_d4 // pino de dados d4 do LCD
   #define lcd_d5       pin_d5 // pino de dados d5 do LCD
   #define lcd_d6       pin_d6 // pino de dados d6 do LCD
   #define lcd_d7       pin_d7 // pino de dados d7 do LCD
#endif
#include "mod_lcd.c"

void main(){
   
   unsigned int8 value = 0;
   
   setup_adc_ports(AN0_AN1_AN3);   setup_adc(ADC_CLOCK_DIV_16);
   
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);    
   set_adc_channel(0);
   delay_us(50);
   
   lcd_ini();
   delay_ms(50);
   

   while(true){

      value = read_adc();
      printf (lcd_escreve,"\fValor = %u\r\n",value);
      printf (lcd_escreve," lido do AD ");
      delay_ms (200);

   }
}
























Palavras chave:

Leughadh inneal-tionndaidh AD ann am PicsimLab
Čtení AD převodníku v PicsimLab
Läser AD-konverterare i PicsimLab
לייענען AD קאַנווערטער אין PicsimLab
Maca konverter AD ing PicsimLab
Читання AD конвертера в PicsimLab
Чытанне канвэртар AD у PicsimLab
Convertidor AD de lectura en PicsimLab
Léamh tiontaire AD i PicsimLab

LCD no PicsimLab com PIC 16F877A

CÓDIGO FEITO EM CCS C Compiler

ARQUIVO mod_lcd.c

/************************************************************************/
/*  MOD_LCD.C - Biblioteca de manipula  o de módulo LCD                 */
/*                                                                                                         */
/*                                                                      */
/************************************************************************/

// As definições  a seguir são utilizadas para acesso aos pinos do display
// caso o pino RW n o seja utilizado, comente a defini  o lcd_rw
#ifndef lcd_enable
   #define lcd_enable       pin_e1      // pino enable do LCD
   #define lcd_rs         pin_e0      // pino rs do LCD
   //#define lcd_rw      pin_e2      // pino rw do LCD
   #define lcd_d4         pin_d4      // pino de dados d4 do LCD
   #define lcd_d5         pin_d5      // pino de dados d5 do LCD
   #define lcd_d6         pin_d6      // pino de dados d6 do LCD
   #define lcd_d7         pin_d7      // pino de dados d7 do LCD
#endif

#define lcd_type 2           // 0=5x7, 1=5x10, 2=2 linhas
#define lcd_seg_lin 0x40    // Endere o da segunda linha na RAM do LCD

// a constante abaixo define a seq  ncia de inicializa  o do m dulo LCD
byte CONST INI_LCD[4] = {0x20 | (lcd_type << 2), 0xf, 1, 6};

byte lcd_le_byte()
// l  um byte do LCD (somente com pino RW)
{
   byte dado;
   // configura os pinos de dados como entradas
   input(lcd_d4);
   input(lcd_d5);
   input(lcd_d6);
   input(lcd_d7);
   // se o pino rw for utilizado, coloca em 1
   #ifdef lcd_rw
      output_high(lcd_rw);
   #endif
   output_high(lcd_enable); // habilita display
   dado = 0;   // zera a vari vel de leitura
   // l  os quatro bits mais significativos
   if (input(lcd_d7)) bit_set(dado,7);
   if (input(lcd_d6)) bit_set(dado,6);
   if (input(lcd_d5)) bit_set(dado,5);
   if (input(lcd_d4)) bit_set(dado,4);
   // d  um pulso na linha enable
   output_low(lcd_enable);
   output_high(lcd_enable);
   // l  os quatro bits menos significativos
   if (input(lcd_d7)) bit_set(dado,3);
   if (input(lcd_d6)) bit_set(dado,2);
   if (input(lcd_d5)) bit_set(dado,1);
   if (input(lcd_d4)) bit_set(dado,0);
   output_low(lcd_enable);   // desabilita o display
   return dado;   // retorna o byte lido
}

void lcd_envia_nibble( byte dado )
// envia um dado de quatro bits para o display
{
   // coloca os quatro bits nas saidas
   output_bit(lcd_d4,bit_test(dado,0));
   output_bit(lcd_d5,bit_test(dado,1));
   output_bit(lcd_d6,bit_test(dado,2));
   output_bit(lcd_d7,bit_test(dado,3));
   // d  um pulso na linha enable
   output_high(lcd_enable);
   output_low(lcd_enable);
}


void lcd_envia_byte( boolean endereco, byte dado )
{
   // coloca a linha rs em 0
   output_low(lcd_rs);
   // aguarda o display ficar desocupado
   //while ( bit_test(lcd_le_byte(),7) ) ;
   // configura a linha rs dependendo do modo selecionado
   output_bit(lcd_rs,endereco);
   delay_us(100);   // aguarda 100 us
   // caso a linha rw esteja definida, coloca em 0
   #ifdef lcd_rw
      output_low(lcd_rw);
   #endif
   // desativa linha enable
   output_low(lcd_enable);
   // envia a primeira parte do byte
   lcd_envia_nibble(dado >> 4);
   // envia a segunda parte do byte
   lcd_envia_nibble(dado & 0x0f);
}


void lcd_ini()
// rotina de inicializa  o do display
{
   byte conta;
   output_low(lcd_d4);
   output_low(lcd_d5);
   output_low(lcd_d6);
   output_low(lcd_d7);
   output_low(lcd_rs);
   #ifdef lcd_rw
      output_high(lcd_rw);
   #endif
   output_low(lcd_enable);
   delay_ms(15);
   // envia uma seq  ncia de 3 vezes 0x03
   // e depois 0x02 para configurar o m dulo
   // para modo de 4 bits
   for(conta=1;conta<=3;++conta)
   {
      lcd_envia_nibble(3);
      delay_ms(5);
   }
   lcd_envia_nibble(2);
   // envia string de inicializa  o do display
   for(conta=0;conta<=3;++conta) lcd_envia_byte(0,INI_LCD[conta]);
}

void lcd_pos_xy( byte x, byte y)
{
   byte endereco;
   if(y!=1)
      endereco = lcd_seg_lin;
   else
      endereco = 0;
   endereco += x-1;
   lcd_envia_byte(0,0x80|endereco);
}

void lcd_escreve( char c)
// envia caractere para o display
{
   switch (c)
   {
     case '\f'    :   lcd_envia_byte(0,1);
              delay_ms(2);
            break;
     case '\n'   :
     case '\r'    :   lcd_pos_xy(1,2);
              break;
     case '\b'    :   lcd_envia_byte(0,0x10);
              break;
     default   :   lcd_envia_byte(1,c);
              break;
   }
}

char lcd_le( byte x, byte y)
// le caractere do display
{
   char valor;
   // seleciona a posi  o do caractere
   lcd_pos_xy(x,y);
   // ativa rs
   output_high(lcd_rs);
   // l  o caractere
   valor = lcd_le_byte();
   // desativa rs
   output_low(lcd_rs);
   // retorna o valor do caractere
   return valor;
}


ARQUIVO PRINCIPAL:

#include <16F877A.h>
#device adc = 8

#FUSES NOWDT
#FUSES HS
#FUSES NOPUT
#FUSES NOPROTECT
#FUSES NODEBUG
#FUSES BROWNOUT
#FUSES NOLVP
#FUSES NOCPD
#FUSES NOWRT

#use delay (clock = 20MHz)

#ifndef lcd_enable
   #define lcd enable   pin_e1
   #define lcd_rs       pin_e2
   //#define lcd_rw     pin_e2
   #define lcd_d4       pind4
   #define lcd_d5       pin_d5
   #define lcd_d6       pin_d6
   #define lcd_d7       pin_d7
#endif

#include <C:\Users\Henrique\Documents\3MICROCONTROLADORES\13LCD\Drivers\mod_lcd.c>

void main(){
   
   float valor = 67.3215;
      
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_adc(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED, 0, 1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   
   lcd_ini();
   delay_ms(50);
   
   while(TRUE){
      //TODO: User Code
      
      //lcd_escreve('\f');//limpa a tela
      printf(lcd_escreve, "\fHello World !\n");
      //printf(lcd_escreve, "\fHello World !\r\n"); escreve da direita para esquerda
      delay_ms(200);
      
      output_toggle(PIN_D0);
            
      printf (lcd_escreve,"\fValor = %3.2f\r\n",valor);
      delay_ms(1000);
   }

}























Palavras chave:

Bhalela i-LCD usebenzisa i-PicsimLab
Escriu a la pantalla LCD amb PicsimLab
Rašykite į LCD naudodami PicsimLab
Andika LCD ukoresheje PicsimLab
Запись на LCD с помощью PicsimLab
Pagsulat sa LCD gamit ang PicsimLab
Пишите на ЛЦД користећи ПицсимЛаб
Ghi vào màn hình LCD bằng PicsimLab
Пишете на LCD с помощта на PicsimLab
כתוב ל-LCD באמצעות PicsimLab
Sgrìobh gu LCD a’ cleachdadh PicsimLab

16/03/2022

Comandos no SQL Server #3














FUNÇÕES NO SQL SERVER

Funções em T-SQL: São rotinas que retornam valores ou tabelas. Com elas
você poderá construir visões parametrizadas ou ainda construir suas próprias
funções, semelhantes a DATE(), Rtrim() dentre outras.

Existem 3 tipos de funções possíveis
- Scalar-valued user-defined function
- Multi-statement table-valued function
- inline table-valued function 

Funções Escalares: Retornam um valor único de dados do tipo definido
na cláusula RETURNS. Para uma função escalar embutida, não há um corpo
de função; o valor escalar é o resultado de uma única instrução. O retorno
pode ser qualquer tipo de dados, execeto text, ntext, image, cursor e timestamp.

-- função para excluir
CREATE FUNCTION Trim(@ST VARCHAR (1000
  returns VARCHAR?(1000)
   BEGIN
     RETURN (Ltrim(Rtrim(@ST))) --remove os espaços na esquerda
   END


--Excemplo função eslar TRIM
SELECT '>' + ('  Silva Telles   ')+'<' union
SELECT '>' + DBO.TRIM('   Silva Telles      ') + '<'


____________________________//__________________________

Exemplo 2

--GERANDO A FUNÇÃO
CREATE FUNCTION inventario(@ProductID INT) 
  return INT AS
-- Retorna estoque de produto
BEGIN 
  DECLARE @ret INT;
  SELECT @ret = Sum(p.quantity)
FROM production.productinventory p
      WHERE p.productid = @ProductID
AND p.localionid = '6';
     IF ( @ret IS NULL)
     SET @ret = 0;
     RETURN @ret;
     END;

--Invocando a função inventario
SELECT productmodelid, name, dbo.inventario(productid) 
    AS Estoque_atual
      FROM production.product
    WHERE productmodelid BETWEEN 75 AND 80;


_______________________________//_______________________________

Procedures (Procedimentos armazenados)
Um procedimento armazenado é um tipo especial de script escrito eem Transact-SQL,
usando a linguagem SQL e extensões SQL. Os procedimentos são salvos em um 
servidor de banco de dados para aperfeiçoar o desempenho e a consistência das 
tarefas repetitivas.
Procedimentos armazenados podem ser usados para as seguintes tarefas:
- Controlar autorização de acesso
- Criar um caminho de auditoria de atividades em tabelas de banco de dados
- Separar instruções de definição e de manipulação de dados relativas a um banco de
dados das aplicações que o acessam.

--Retornar apenas o conteúdo estático

CREATE PROCEDURE TESTE1 
 AS BEGIN SELECT 'O famoso hello world!'
   END

--Executando Procedure
EXEC TESTE1 

_______________________________/ / _____________________________


TRIGGERS: É um bloco de comandos Transact-SQL que é automaticamente executado 
quando um comando INSERT, DELETE ou UPDATE for executado em uma tabela do banco de dados.
Os Triggers são usados para realizar tarefas relacionadas com validações, restrições de 
acesso, rotinas de segurança e consistência de dados; desta forma estes controles deixam
de ser executados pela aplicação e passam a ser executados pelos Triggerss em determinadas
situações.

Sintaxe:
CREATE TRIGGER [nome do trigger] ON [nome da tabela]
  [FOR/AFTER/INSTEAD OF] [INSERT/UPDATE/DELETE] AS
    --CORPO DO TRIGGER

--Os parâmetros são:
NOME DO TRIGGER:
NOME DA TABELA: Tabela â qual o gatilho estará ligado, para ser disparado mediante
ações de insert, update ou delete.
FOR/AFTER/INSTEAD OF: uma dessas opções deve ser escolhida para definir o momento em
que o trigger será disparado.
INSERT/UPDATE/DELETE: uma ou várias dessas opções (separadas por vírgula) devem ser
indicadas para informar ao banco qual é a ação que disparará o gatilho.

Existem 2 tipos de triggers:
- DML (Acionadas através de comandos de manipulação de dados)
- DDL ((Acionadas através de comandos de definição de objetos no banco de dados)

Exemplo:
CREATE TRIGGER tg_aud_sal --unico registro
  ON salario AFTER UPDATE AS BEGIN
DECLARE @sal_antigo DECIMAL (10,2)
DECLARE @sal_novo DECIMAL (10,2)
DECLARE @matricula int

SELECT @matricula = (SELECT matricula FROM inserted)
SELECT @sal_antigo = (SELECT salario FROM deleted)
SELECT @sal_novo = (SELECT salario FROM inserted)

   INSERT INTO auditoria_salario VALUES
     (@matricula isnull (@sal_antigo, 0), @sal_novo, SYSTER_USER, getdate)__
   END


--Testando triggers
upadate salario set salario = '2500' where matricula = '1'
upadate salario set salario = '3000' where matricula = '2'

select *from auditoria_salario 


________________________ / / _______________________________________

TRIGGER no SQL Server

ALTER TRIGER trg_atualiza_saldo_cc ON conta_corrente --aluliza saldo onde a conta corrente recebe
FOR INSERT AS --inclui um registro 
  BEGIN 
    DECLARE @CONTA_C VARCHAR(20),--declara algumas variaveis
         @VALOR DECIMAL (10, 2),
         @OPER CHAR(1)
    SELECT @CONTA_C = I.conta_c,--faz a seleção
           @VALOR = I.valor,
   @OPER = I.operacao
    FROM inserted I -- e atribui o insert das variavéis
D = debito   C = crédito
   IF @OPER NOT IN ('D', 'C') BEGIN
     PRINT 'OPERACAO NAO PERMITIDA' 

ROLL BACK TRANSACTION 
    END
   ELSE IF (SELECT Count(*)
     FROM saldo_conta
     WHERE conta_c = @conta_c) = 0
    AND @OPER = 'D' -- e operação igual à débito
    BEGIN
      INSERT INTO saldo_conta
      VALUES   (@CONTA_C, @VALOR *-1) -- se está emprestando entao fica devendo
   END
  ELSE IF (SELECT Count(*)
    FROM saldo_conta
    WHERE conta_c = @conta_c) = 0
   AND @OPER = 'C'
   BEGIN
  INSERT INTO saldo_conta
  SET saldo = saldo + @VALOR
WHERE conta_c = @CONTA_C
   END
  ELSE IF (SELECT Count(*)
FROM saldo_conta
WHERE conta_c = @conta_c) > 0
AND @OPER = 'D'
     BEGIN
    UPDATE saldo_conta
SET saldo = saldo - @VALOR
WHERE conta_c = @CONTA_C
    END
END


Palavras chave:

FUNCIONES EN SERVIDOR SQL
FUNGSI ING SQL SERVER
פונקציות ב-SQL SERVER
ФУНКЦИИ В SQL СЕРВЕРЕ
ФУНКЦІЇ В SQL СЕРВЕРУ
SQL सर्भरमा कार्यहरू
CÁC CHỨC NĂNG TRONG SQL SERVER
MGA FUNCTION SA SQL SERVER
FUNKCIJE U SQL SERVERU
FUNCIONS EN SQL SERVER
FUNCIONS EN SQL SERVER

27/02/2022

Desafio #1 - Contador

Faça um contador que inicie com o número final da matricula e depois comece a contar de 0 a 99 e retorne em forma decrescente. Obs: matrícula = 2022178440488

Resolução:

CÓDIGO FEITO EM CCS C COMPILER

#include <16F877A.h>
#device ADC = 8
#use delay(crystal = 20MHz)
#define tempo 400

int v1[] = {0b00111111, 0b00000110, 0b01011011, 0b01001111, 0b01100110, 0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01100111};
int tam = sizeof(v1)/sizeof(int);

void contador(int valor1){
   output_b(0b00111111);
   output_d(0b01111111);
   delay_ms(1000);
   
   for(int i = valor1; i < tam; i++){
      output_d(v1[i]);
      delay_ms(tempo);
   }
   
   for(i = 1; i < tam; i++){
      for(int j = 0; j < tam; j++){
         output_b(v1[i]);
         output_d(v1[j]);
         delay_ms(tempo);
      }
   }
      
}

void main(){
   
    contador(8);
        
   while(true){      
      
      delay_ms(1000);
      
      for(int i = tam; i > 0; i--){
         for( int j = 10; j > 0; j--){
            output_b(v1[i-1]);
            output_d(v1[j-1]);
            delay_ms(tempo);
         }
      }
      
      delay_ms(1000);
      
      for (i = 0; i < tam; i++){
         for( int j = 0; j < tam; j++){
            output_b(v1[i]);
            output_d(v1[j]);
            delay_ms(tempo);
         }
      }
     
   }
}



















Resolução 2 feita em no PicSimlab

Código feito em CCS C Compiler

#include <16F877A.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES LP                       //Low power osc < 200 khz
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES BROWNOUT                 //Reset when brownout detected
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection

#use delay(clock = 20MHz)
#define delay 50

unsigned int i = 0, tempo, cont = 8;

byte const luz [10]={
   0b0111111, //0
   0b0000110, //1
   0b1011011, //2
   0b1001111, //3
   0b1100110, //4
   0b1101101, //5
   0b1111101, //6
   0b0100111, //7
   0b1111111, //8
   0b1101111  //9
};
  
byte const display []={
   0b000000,  // display desligado
   0b000100, // display 1
   0b001000, // display 2
   0b010000, // display 3
   0b100000,  // display 4
   0b1101101, //5
   0b1111101, //6
   0b0100111, //7
   0b1111111, //8
};

void main(){
   
   while(true){
   
      for(tempo = 0; tempo < 10; tempo++){
         i = cont/10;
         output_a(display[7]);
         output_d(luz[i]);
         delay_ms(delay);
  
         i = cont%10;
         output_a(display[4]);
         output_d(luz[i]);
         delay_ms(delay);
      }
      if(++cont >= 100)cont = 8;
      
   }
}



21/02/2022

1) Uma pessoa compra um pote com ovinhos de chocolate e, ao fazer pacotinhos, todos com a mesma quantidade percebeu que colocando 8 ou 9 ou 12 ovinhos em cada pacotinho sempre sobrariam 3 ovinhos no pote. O menor número de ovinhos é: 

Resolução:

8, 9 , 12 | 2
4 , 9, 6  | 2
2 , 9 , 6 | 2
1, 9, 3 | 3
1 , 3, 1 | 3
1 , 1, 1

22 . 32 = 72 + 3 = 75 ovinhos


2) Na linha 1 de 1 sistema métrico os trem partem em 2,4 min. Na linha 2 desse mesmo sistema, os trens partem 1,8 min. Se 2 trens partem simultaneamente das linhas 1 e 2 às 13 horas próximo horário simultaneamente qual será o horário das duas linhas.

Resolução:


24, 18 | 2
12, 9 | 2
6 , 9 | 2
3 , 9 | 3
1 , 3 | 3
1 , 1

22 . 32 = 72 = 7,2 min


3) Quais os divisores comuns entre 90 e 216 ?

Resoluçãao:

MDC (216 , 90) = 18

4) Divibilidade por 90 = { 1, 2, 3, 5, 6, 9, 18 } = 5
Divisibilidade por 216 = { 1, 2, 3, 4, 6, 9, 18} = 4

90 , 216 = { 1, 2, 3, 6, 9, 18 }

5) Calcule o maior número pelo qual dividindo 100 e 68 encontramos restos 10 e 8.

Resolução:

100 | X        
10    q1

68 | X
 8    q2

q1 . X + 10 = 100
q1 . X = 90

q2 . X + 8 = 68
q2 . X = 60

90 , 60 | 30, 30
3 , 2

Portanto: MDC (90 , 60) = 30

6) Qual o menor número que dividindo 15 e 18 deixa sempre o resto 12 ?

Resolução:

15, 18 | 2
15,   9 | 3
5,     3| 3
5,     1| 5
1,    1

2 . 32 = 90            X = 90 + 12 = 102


7) A diferença de idade entre 2 pessoas é de 15 anos e estão entre si 7 para 4.

Resolução:

X - Y = 15         7/4       (X - 4 ) / Y            15 / Y = (7 - 4) / 4         Y = 20

X - 20 = 15        
X = 15 + 20 = 35


17/01/2022

Comandos no SQL Server #2













--BULK INSERT: É usado no SQL server para copiar (importar) dados de um arquivo
texto ou nativo do SQL Server (também chamados de flat file)
É o modo mais rápido de se importar dodos; porém somente trabalha em uma direção e
com um tipo de arquivo: flat file.

--Exemplo de Bulk Insert
BULK INSERT produto FROM 'C:\SQLServer\scripts\Dados\produto.txt' 
   WITH CODEPAGE='ACP',
   DATA FILELETYPE = 'widechar', 
   filedterminator = '|', -- separando um do outro
   rowterminator = '\n', -- pula linha
   maxerrors = 0,          
   fire_triggers,           
   firestroe = 1,            -- importar a partir da primeira linha
   lastrow = 10             -- importar 10 linhas
)

________________________/ / ___________________________________

EXTENSÃO SQL: Permite a geração de 'scripts' poderosas e procedimentos
armazenados (scripts armazenados no servidor e que podem ser reutilizados).
Instruções de definição de dados CREATE VIEW, CREATE PROCEDURE, CREATE RULE,
CRIATE TRIGGER e CREATE DEFAULT dever ser cada uma a única instrução em um scripts

IF 1=1 AND 2 <> 2 BEGIN PRINT 'Correto é TRUE' 
  END ELSE
     PRINT 'Errado é falso'

DECLAARE @pedido INT, SET @pedido '10789';
  IF (SELECT Count(")
  FROM ped_detalhe WHERE pedido = @pedido
  GROUP BY pedido) > 3
     BEGIN 
        PRINT 'Condicao Satisfeita'
    END
    ELSE BEGIN
       PRINT 'Os Itens são' SELECT pedido, cod_mat
       FROM ped_detalhe
     END
_______________________ / /_______________________________

--Uso do WHILE no SQL Server

DECLARE @cont int
SET @CONT = 10
WHILE (SELECT GETDATE()- @cont) <= getdate()
    BEGIN
      PRINT GETDATE() -cont
        SET @cont = @cont -1
      IF (GETDATE() -@cont) >=GETDATE()
BREAK
      ELSE
  CONTINUE
END


--WHILE USANDO TABUADA
DECLARE @COUNT INT, @TAB INT
  SET @COUNT = 0
SET @TAB = 10

WHILE (@COUNT <= 10) BEGIN --enquanto cont < 10
   PRINT CAST (@COUNT as nvarchar) --imprimindo os valores
     + N' X' + --contatenando o valor X --
     CAST (@TAB as nvarchar) + N' = ' + CAST(@CONT * @TAB as nvarchar)
     CAST (@CONT * @TAB
  SET @CONT = @CONT +1
END

____________________________/ / ____________________

IF no SQL Server

--informe aqui o período para o qual deseja criar os dados
set @dataInicial = '01/01/2012'
set @dataFinal = '31/12/2030'

WHILE @dataInicial <= @dataFinal BEGIN
 set @data = @dataInicial
 set @ano = year(@data)
 set @mes = month(@data)
 set @dia = day(@data)
 set @diaSemana = datepart (weekday, @data)

if @diaSemana in (1,7)
 set @fimSemana = 'S'
else set @fimSemana = 'N'

/*Feriados locais/reginais e aqueles que não possuem data fixa
(carnaval, páscoa e corpus cristis) também devem ser adicionados aqui */

if(@mes = 1 and @dia =1) or (@mes = 12 and @dia =31)
 set @nomeFeriado = 'confraternização universal'
else
if (@mes = 4 and @dia =21)
 set @nomeFeriado = 'tiradentes'
 else
if (@mes = 5 and @dia =1) --dia do trabalho
 set @nomeFeriado = 'dia do trabalho'
else set @nomeFeriado = null

08/01/2022

Comandos no SQL Server #1

























Definição da Linguagem: Linguage Statmends
A linguagem SQL é dividida em 5 tipos de instruções de linguagem primária: DML, DDL, DCL, TCL

DML: Manipulação de linguagem de Dados, ou seja ão os que vai permitir manipular o banco de dados
DDL: Linguagem de Definição de Dados, são os comandos de criação de alteração de objetos dentro do banco de dados.
DSL: Linguagem de domínio específico, são os comandos para controlarmos os acessos dos usuários a base de dados ou tabela.
TCL: Linguagem de controle de transação, são as instruções que vai controlar as operações no banco de dados.

DML 
Select - recuperar dados 
Insert - inserir dados em uma tabela
Update - atualiza os dados existentes em uma tabela
Delete - exclui registros de uma tabela

DDL
Create - criar objetos no banco de dados, tabelas, indexes, procedures, views, functions,e tiggers
Alter - altera a estrutura da base de dados, tabelas, indexes, procedures, views, functions,e tiggers
Drop - apaga objeto do banco de dados, tabelas, indexes, procedures, views, functions,e tiggers
Truncate - remover todos os registros de uma tabela, tabelas, indexes, procedures, views, functions,e tiggers

DCL
Grante - atribui privilégios de acesso do usuário a objetos do banco de dados
Revoke - remove os privilégios de acesso aos objetos obtidos com o comando GRANT
Deny - nega permissão a um usuário ou grupo para realizar operação em um objeto ou recurso

TCL
Begin Transaction - Inicia uma transação
Commit -  salva o trabalho feito
Save Transaction - identificar um ponto em uma transação para que mais tarde você pode efetuar um ROLLBACK
Rollback - restaurar banco de dados ao original desde o último COMMIT




SELECT p.firstname,
p.lastname, 
e.vacationhours,
e.sickleavehours,
e.vacationhours + e.sickleavehours AS 'Horas Ausente'
FROM humanresources.employee AS e 
 JOIN person.person AS p 
 ON e businessentityid p businnessentityid
ORDER BY 'Horas Ausente' ASC


SELECT (2+5) -- retorna 7
SELECT (10%2) -- retorna 5


-- calcula a diferença de taxas de imposto
SELECT Max(taxrate) - Min(taxrate) AS 'Tax rate Difference' -- seleciona o maior e o menor valor
FROM sales salestaxrate
WHERE stateprovicenid IS NOT NULL


SELECT '1', 1 UNION SELECT 'A', 2 -- seleciona 2 colunas (1:A ; 1:2)


--seleciona tudo de city e ordena crescente por city
SELECT city FROM customers UNION ALL SELECT city
   FROM suppliers ORDER BY city




-- DDL CRIAÇÃO DA TABELA PARA EXERCICIOS
CREATE TABLE FUNCIONARIOS (
 ID int identy (1,1), -- campo do int com identificador (alto numeração)
 NOME VARCHAR(50) NOT NULL
 SALARIO DECIMAL(10,2) -- 2 casas decimais
 SETOR VARCHAR(30)
)

-- DML SELECT, EXEMPLO
SELECT *FROM funcionarios

SELECT nome, setor from funcionarios 

-- DML INSERT
INSERT INTO funcionarios VALUES ('Joao', 1000,''),
 ('Jose', 2000, '')

INSERT INTO funcionarios ('nome',salario), VALUES ('Pedro', 1000)-- insere 1 valor nulo na 3 coluna


--DML UPDATE
UPADATE funcionarios SET salario = '1500' WHERE id = '1' -- Altera o valor alterior para 1500

UPDATE funcionarios SET salario = salario * 1.5 WHERE id = '1' -- Altera e multiplica o salario pelo fator 1.5


--DML DELETE
DELETE funcionarios WHERE id = '1' -- exclui na tabela funcionarios onde 1 seja igual a 1



________________//_______________

Comandos DDL servem para gerar novas tabelas

--CREATE TABLE funcionario (
matricula INT IDENTITY (1,1), --inteiro, começa com 1 e acrescenta 1+1
nome CHAR(50) NOT NULL, -- 50 caracter e não pode ser nulo
data_nasc DATETIME -- só vai aceitar valor de data
)

--DDL GERANDO TABELA COM CHAVE ESTRANGEIRA
CREATE TABLE salario (
matricula INT PRIMARY KEY NOT NULL, --Não pode 2 vezes o mesmo número gravado na tabela
salario DECIMA (10, 2) NOT NULL,
FOREIGN KEY (matricula) REFERENCES funcionario(matricula)
)

--DDL PARA ADICIONAR CHAVE PRIMARIA
ALTER TABLE FUNCIONARIO ADD PRIMARY KEY (MATRICULA) 


--DDL GERANDO INDEX // índice para performação de consulta
CREATE INDEX ix_func1 ON funcionario(data_nasc)
CREATE INDEX ix_func2 ON funcionario(cidade, pais)


--Adicionando novo campo na tabela
ALTER TABLE funcionario  ADD genero  CHAR(1);
 
--Renomeando campo da tabela
EXEC sp_rename 'TABELA_ORIGEM.CAMPO_ORIG', 'Campo_orig', 'COLUMN'
EXEC Sp_rename 'funcionario.endereco', 'ender', 'COLUM' --'tabela que vai alterar . e o campo endereco' , 'para no nome x', 'tipo do objeto'


--Excluindo campo da tabela
ALTER TABLE funcionario DROP COLUMN genero; --exclui o campo genero

--Renomeando Tabela
EXEC sp_rename 'FUNCIONAIRO', 'FUNC'; -- renomeia de FUNCIONARIO para FUNC

--Excluindo tabela
DROP DATABASE CURSO;

--VISUALIZAÇÃO
CREATE VIEW v_funcionario AS SELECT *FROM FUNCIONARIOS


--Excluir um index
DROP index ix_func1 ON FUNCIONARIOS; --excluindo ix_func1 na tabela funcionarios

--Excluindo procedure
DROP PROCEDURE proc_salario;

--Excluindo função
DROP function func_salario;

--Excluindo Trigger
DROP trigger trig_func_salario;

--DDL TRUNCATE //VAI ELIMINAR TODOS OS DADOS DA TABELA, MAS A TABELA CONTINUARÁ DENTRO DO SISTEMA
TRUNCATE TABLE CIDADES; --os comandos anteriores serão eliminados

--Fazendo backup em tabela temporaria
SELECT *INTO #HJTEMP FROM person.Password -- person.password = nome da tabela


--ANALISE DE REGISTROS ANTES DO TRUNCATE
SELECT Count(*) AS AntesTruncateCount FROM person.Password;
go -- fará que ele siga para as instruções seguinte
--DDL TRUNCATE APAGADOS DADOS DA TABELA
TRUNCATE TABLE person.Password;
go
--VERIFICANDO TABELAS APOS TURNCATE
SELECT Count(*) AS DepoisTruncate FROM humanresources.jobcandidate;



______________________________/ /_________________________________

Comandos DCL (LINGUAGEM DE CONTROLE DE DADOS)

--GRANT, REVOKE e DENY: são comandos transact-sql usados para atribuir
--e negar permissões para acessos à objetos e recursos.

--CONCEDER (GRANT) - permite aos usuários ler / escrever em determinados objetos
de banco de daodos

--Cria um login e dá permissões no banco
exec master.dbo.sp_addlogin 'UsrTeste', 'SenhaTeste' --UsrTeste = usuário

--Concedendo Acesso de atualização para UsrTeste
GRANT UPDATE ON FUNCIONARIOS TO UsrTeste; -- Tabela 'FUNCIONARIOS' para o usuário UsrTeste

--Concedendo Acesso para INSERT usuário UsrTeste
GRANT INSERT ON FUNCIONARIOS TO UserTeste;

--Concedendo acesso de leitura para UsrTeste
GRANT SELECT ON FUNCIONARIOS TO UsrTeste;

--Concedendo acesso de DELETE PARA UsrTeste
GRANT DELETE ON FUNCIONARIOS TO UsrTeste;

--Concedendo acesso para EXECUTAR PROC TESTE_PROC para UsrTeste.
GRANT EXECUTE ON testproc TO UsrTeste;

--gerando uma procedure
CREATE PROCEDURE testproc as select *from cidades;

excutando procedure
EXEC testproc -- retorna o conteúdo da tabela cidades



--REVOGAR (REVOKE) - mantém os usuários de permissão de leitura / gravação em
objetos de banco de dados

--NEGAR (DENY) - Nega permissão a um usuário ou grupo para realizar operação
em um objeto ou recurso


--Verificando usuario logado
select CURRENT_USER

--ALTERANDO USUARIO LOGADO
SETUSER 'UsrTeste'

--inserindo dados
INSERT into FUNCIONARIOS values ('Maria', '1000', 'TI')

--UPDATE
UPDATE FUNCIONARIOS set nome='Marisa' where id='7'

--3° PARTE NEGA-DENY
--negando acesso de atualização UsrTeste
DENY UPDATE ON FUNCIONARIOS TO UsrTeste;

--NEGANDO ACESSO DE ATUALIZAÇÃO UsrTeste
DENY INSERT ON FUNCIONARIOS TO UsrTeste;

--NEGANDO ACESSO DE LEITURA UsrTeste
DENY SELECT ON FUNCIONARIOS TO UsrTeste;

--nega acesso a execução de procedure
DENY EXECUTE ON testtproc TO UsrTeste;

--VERIFICANDO USUARIO LOGADO
select CURRENT_USER

--Alterando usuario logado
SETUSER 'UsrTeste'

--EXECUTANDO PROCEDURE COM USUARIO UsrTeste
EXEC testproc


______________________/ / _______________________________

--TCL são usados para gerenciar as mudanças feitas por instruções
DML. Ele permite que as declarações sejam agrupadas em transações lógicas

BEGIN - Abre uma transação
COMMIT - Confirma/Salva uma transação
ROLLBACK = Rerter uma transação em caso de qualquer erro

--INICIA A TRANSAÇÃO
BEGIN TRANSACTION

--RETORNA A TABELA NO ESTADO ANTERIOR DO BEGIN TRANSACTION
ROLLBACK

--EFETIVA AS INFORMAÇÕES NA TABELA DO BD
COMMIT TRANSACTION --salva todas as informações 

--GERA UM PONTO DE RECUPERAÇÃO
SAVE TRANSACTION a3

--Restaura a tabela ate o ponto A2
ROLLBACK TRANSACTION a2


--Somente apresenta os clientes que fizeram compras antes da data atual
SELECT cli_cod
cli_nome
FROM clientes WHERE cli_cod IN (
SELECT cli_cod
FROM pedidos
WHERE ped_data <Getdate()


--Apresenta todos os clientes somente se qualquer cliente já fez algum pedido
SELECT cli_cod
cli_nome
FROM clientes WHERE cli_cod IN (
SELECT cli_cod
FROM pedidos


--Sub select
/*
P.num_ped = num_ped
P.data = data
P.cod_cli = cod_cliente
NOME_CLI */

SELECT P.num_ped, P.data, P.cod_cli,
(SELECT C.NOME_CLI FROM cliente C -- sub select para apresentar o nome do cliente
WHERE P.cod_cli = C.cod_cli) AS --onde o codigo do cliente seja = cod do cliente
NOME_CLI FROM pedidos AS P


--Trazer o total de cada cliente da tabela pedidos
P.cod_cli = cod_cli
NOME_CLI = NOME_CLI
(p.total) total = total



SELECT P.cod_cli,
(SELECT C.NOME_CLI FROM cliente C -- sub select para apresentar o nome do cliente
WHERE P.cod_cli = C.cod_cli) AS --onde o codigo do cliente seja = cod do cliente
NOME_CLI, Sum(p.total) total
FROM pedidos AS P GROUP BY P.cod_cli 


--GERANDO UMA CHAVE PRIMARIA COMPOSTA
ALTER TABLE MATRICULA ADD CONSTRAINT PK_1 PRIMARY KEY (ID_ALUNO, id_disciplina)

--ADICIONANDO CHAVE PRIMARIA TABELA DISCIPLINA
ALTER TABLE DISCIPLINA ADD CONSTRAINT PK_2 PRIMARY KEY(id_disciplina)

--Adicionando chave estrangeira na tabela matricula campo ID_ALUNO
ALTER TABLE MATRICULA ADD CONSTRAINT fk_mat1 FOREIGN KEY
(id_aluno) REFERENCES alunos(id_aluno)


_________________________/ / ____________________

INNER JOIN

--INNER JOIN
SELECT a.nome, c.nome_disc, b.periodo
FROM alunos a 
inner join matricula b
on a.id_aluno=b.id_aluno
inner join disciplina c
on b.id_disciplina=c.id_disciplina


________________________/ / ______________________

AGREGAÇÃO

--AGREGAÇÃO: São funções que executam um cálculo em um conjunto 
de valores e retornam um único valor


--AVG: Retorna a média dos valores em um grupo
--MIN: Retorna o mínimo na expressão
--MAX: Retorna o valor máximo na expressão
--SUM: Retorna a soma de todos os valores ou somente os valores
DISTINCT na expressão
--COUNT: Retorna o número de itens do grupo
--STEDV: Retorna o desvio padrão estatístico para a população de todos
os valores na expressão especificada
--GROUPING: Indica se uma expressão de coluna especificada em uma lista GROUPY BY
é agregada ou não.
--GROUPING_ID: É uma função que calcula o nível de agrupamento
--VAR: Retorna a variância estatistica de todos os valores da expressão especificada
--VARP: Retorna a variância estatística para o preenchimento de todos os valores
 da expressão especificada


--AVG Retorna a média dos valores em um grupo
SELECT AVG(populacao) FROM cidades

--AVG MEDIA POR ESTADO
SELECT UF, UF(POPULACAO) FROM CIDADES 
GROUP BY UF
ORDER BY 2

--AVG POR REGIÃO
SELECT B.regiao, AVG(a.POPULACAO) FROM CIDADES A
INNER JOIN regiao_uf 8
ON A.cod_uf=B.ID
GROUP BY B.regisao
ORDER BY 2 desc

--MIN 
SELECT MIN (populacao) from cidades 

--MIN POR ESTADO
SELECT UF, MIN(POPULACAO) FROM CIDADES
GROUP BY UF ORDER BY 2


--MIN POR REGIÃO
SELECT B.regiao, MIN(POPULACAO) FROM CIDADES A
  INNER JOIN regiao_uf B
  ON A.cod_uf=B.ID
  GROUP BY B.regiao
  ORDER BY 2

--MAX retorna o valor máximo na expressão
SELECT MAX(populacao) from cidadees

--MAX POR ESTADO
SELECT UF, MAX(POPULACAO) FROM CIDADES
GROUP BY UF
ORDER BY 2


SELECT B.regiao, MAX(a.POPULACAO) maximo FROM CIDADES a --a.POPULACAO= campo populacao
 INNER JOIN regiao_uf B
 ON A.cod_uf=B.ID
 GROUP BY B.regiao
 ORDER BY 2


/*As funções de classificação retornam um valor de classificação
para cada linha em uma partição. Dependendo da função usada, para
cada linha em uma partição.*/

SELECT rack() OVER (ORDER BY estado ASC) AS rack_uf,
 estado from uf

SELECT rack() OVER (ORDER BY estado ASC) AS rack_uf,
 regiao,
 estado from regiao_uf


--ROW NUMBER EM SQL
Retona o número sequencial de uma linha em uma partição de um 
conjunto de resultados iniciando em 1 para a primeira linha
de cada partição

SELECT ROW_NUMBER() OVER (ODER BY estado ASC) ROW_NUMBER_uf
regiao, estado, FROM regiao_uf

--FUNÇÕES LÓGICAS
--CHOOSE: Retorna o item ao índice espedifico de uma lista
de valores no SQL Server

SELECT Choose(1, 'Gerentee', 'Diretor', 'Desenvolvedor')AS Escolhido -- 1= posição

SELECT productcategoryid, Choose (productcateroyid, 'A', 'B', 'C') AS
Expressao FROM production.productcategory

SELECT jobtitle, hiredate,
Month(hiredate)mes,
Choose(Month(hiredate), 'Winter','Winter','Spring','Spring',
... ), As Quarter_hired
FROM humanresourses.employee 


--IIF: Retorna um de 2 valores 
DECLARE @a INT = 45,
@b INT = 40;
SELECT IIF (@a > @b, 'TRUE', 'FALSE') AS Resultado;

DECLARE @a INT = 45, @b INT = 40;
SELECT IIF (@a > @b, "Maior', "Menor') AS Resultado;

--FUNÇÕES MATEMÁTICAS
ABS: Uma função matemática que retorna o valor absoluto

SELECT Abs(-1.0),
Abs(0.0),
Abs(1.0),
Abs(-9);

RAND: Retorna um valor float pseudoaleatorio de 0 a 1

SELECT Rand();
SELECT Rand(), Rand(), Rand();

DECLARE @cont smallint;
SET @cont = 1;
WHILE @cont < 5 --enquanto contador for menor que 5
  BEGIN -- então faça
    SELECT RAND() Random_Number
    SET @cont = @cont + 1
  END;


ROUND: Retorna um valor numérico, arredondado.

SELECT Round(123.9994, 3), Round(123.9995);
SELECT Round(123.4545, 2); --precisão de 2 casas decimais
SELECT Round(123.45, -2); 

_____________/ / _____________________
--FUNÇÃO DE LIMITE
--TOP: É útil em grandes tabelas com milhares de registros

SELECT TOP 3 * FROM customers

_______________________ / /___________________________

--SRT: Retorna dados de caractere convertido em dados numéricos
SELECT Str(123.45, 6, 1);

--Conversao de numérico para caractere
SELECT 'Teste' +Str(123.45, 6, 1);

--CONCAT: Retorna uma cadeia de caracteres que retorna da concatenação
de 2 ou + valores

SELECT Concat (CURRENT_USER, 'Seu saldo é R$', 11.00, ' em',
  day(getdate()), '/', month(getdate()), '/', year(getdate())),
  AS resultado

--Substitui a cadeia de caracter cde em abcef...
SELECT REPLACE ('abcdefghicde', 'cde', 'xxx') para

SELECT REPLACE ('Isto é um teste' de,  'teste', 'producao') para;

SELECT REGIAO, REPLACE(REGIAO, 'sul', 'South') FROM regiao_uf

__________________/ / ____________

DATA E HORAS 

SELECT Sysdatetime() exSysdatetime
SELECT Sysdatetimeoffset() exSysdatetimeoffset
SELECT Syssutcdatetime() exSyssutcdatetime
SELECT CURRENT_TIMESTAMP exCURRENT_TIMESTAMP
SELECT Getdate() exGetdate
SELECT Getutcdate() exGetutcdate

--FUNÇÃO DE DATA E HORA PARTES QUE RETORNA O DIA/MES/ANO

SELECT Datename(day, Getdate()) DIA_N
  Datename(month, Getdate()) MES_N,
  Datename(year, Getdate()) ANO_N


--DATEADD: Retorna um novo valor datetime adicioando um intervalo
à datepart especificada da date especificada

SELECT Dateadd(day, 90, Getdate())

SELECT getdate() agora, Dateadd (day, 90, Getdate())-- adcionando 90 dias

SELECT getdate() agora, Dateadd(month, 2, Getdate()) -- adc 2 meses

SELECT getdate() agora, Dateadd(year, 3, Getdate())-- adc 3 anos


--DATEDIF: Retorna o número de limites de datepart de data ou
hora entre duas datas especificadas

--Diferença em dias
SELECT Datediff (day, '2022-03-12', '2017-07-13')

--Diferença em meses
SELECT Datediff (month, '2022-03-12', '2017-07-13')

--Diferença em anos
SELECT Datediff (year, '2022-03-12', '2017-07-13')

--FORMATANDO DATAS
SELECT convert(varchar(10), getdate(), 103)


____________________/ / ___________________________________

--USO DO CASE

DECLARE @data DATETIME
SET @data = getdate()-1
SELECT @data, CASE WHEN @data = Getdate() THEN 'Hoje'
SELECT CASE WHEN @data = Getdate() THEN 'Ontem'
SELECT CASE WHEN @data = Getdate() THEN 'Amanhã'
 END dia


USE AdventureWorks2014 SELECT 
  productnumber, productline,
  Categoria = CASE productline --nome da coluna: Categoria
  WHEN 'R' THEN 'Road'
  WHEN 'M' THEN 'Mountain'
  WHEN 'Not for sale' END, 
  NAME
FROM production.product
ORDER BY productnumber;


SELECT productnumber, NAME,
  CASE WHEN lisprice = 0 THEN 'Não está a venda'
  CASE WHEN lisprice < 50 THEN 'Abaixo de $50'
  CASE WHEN lisprice >= 0 AND listprice < 250 THEN 'Abaixo de $1000'
  ELSE 'Acima de $1000' END Price_Range, 'Produtos' AS Categoria
FROM production.product
ORDER BY productnumber


_________________________/ /_____________________________

--VIEWS: Pode ser definida como uma tabela virtual composta por linhas
e colunas de dados vindos de tabelas relacionadas em uma query

VANTAGENS: 
Reuso: Reutilização das views como objetos de caráter permanente
Segurança: As views permitem que ocultemos determinadas colunas de uma tabela
Simplificação do código: As views nos permitem criar um código de
programação muito mais limpo, na medida em que podem conter um SELECT complexo.


CREATE VIEW v_data_contratacao AS SELECT p.firstaname,
   p.lastname, e.businessentiyid, e.hiredate FROM
   humanresources.employee e JOIN person.person AS p
   ON e.businessentifyid = p.businessentiyid;


CREATE VIEW v_fornec_geral AS SELECT id_fornec, fornec FROM
   fornecedores1 UNION ALL
   SELECT id_fornect, fornec FROM fornecedores2 UNION ALL


_________________________ / / ____________________________________

--TEMP TABLE: Tabelas temporárias são geradas no database TempDB e 
podem ser classificadas como Locais e Globais:

* Tabelas Temporárias são geradas no prefixo "#" e possuem visibilidade para a conexão
responsável por sua criação; outas conexões não "enxergam" a tabela.
* Tabelas Temporárias Globais são geradas com o prefixo '##' e são visíveis por todas as conexões


--OPÇÃO DE DROP
- Uma tabela temporária (Local ou Global) só existe enquanto a conexão responsável
pela sua criação estiver ativa.

- No momento da desconexão, tabelas temporárias remanescentes serão dropadas automaticamente.

--GERANDO TABELA TEMPORÁRIA
CREATE TABLE #minhatemporaria (
  campo1 VARCHAR(80) NOT NULL,
  campo2 VARCHAR(80) NOT NULL)

--inserindo informações na tabela temporária
INSERT INTO #minhatemporaria VALUES ('Real', 1000)
INSERT INTO #minhatemporaria VALUES ('Dolar', 3000)


--Gerando tabela temporária através de um select
SELECT * INTO #minhatemporaria2 FROM #minhatemporaria

--Atualizando a tabela temporaria
UPDATE #minhatemporaria SET campo1= 'Libra' WHERE campo1= 'Real' 

--Deletando registros
DELETE FROM #minhatemporia

--Dropando a tabela temporaria
DROP TABELA #minhatemporaria