variaveis internas desta funcao utilizem caracteristicas proprias da funcao de origem, neste exemplo podemos observar que foi criada a funcao SN74HC595() e todas as variaveis internas desta funcao comecam com SN74HC595_ seguido do nome da variavel propriamente dito, a primeira vista temos a impressao de que o programa fica carregado, porem, facilita muito o inter-relacionamento das variaveis como um todo. Outro ponto interessante e a chamada recorrente de funcoes, na linha abaixo podemos ver que chamamos a funcao display() duas vezes dentro da funcao SN74HC595(). SN74HC595(Display(Unidade), Display(Dezena)); Com esta unica linha de comando montamos os dois bytes referentes aos digitos de dezena e unidade e enviamos serialmente essas informacoes. /****************************************************************************** JL Audio Manutencao Eletronica Data: 10/2012Autor: Jean CarlosProjeto: Registrador de deslocamento SN74HC595Microprocessador: PIC18F4520Clock do processador: 8MHzEstacao de desenvolvimento: PK2Lab V 1.1Compilador: MikroC PRO V 4.60.0.0Versao atual: 1.0Descricao: Demonstracao do uso de shift register para expansao de I/O *******************************************************************************/// Inicializacoes do programa // Configuracao do LCD da placa PK2Lab V.1.1 sbit LCD_RS at RB2_bit;sbit LCD_EN at RB3_bit;sbit LCD_D4 at RB4_bit;sbit LCD_D5 at RB5_bit;sbit LCD_D6 at RB6_bit;sbit LCD_D7 at RB7_bit; sbit LCD_RS_Direction at TRISB2_bit;sbit LCD_EN_Direction at TRISB3_bit;sbit LCD_D4_Direction at TRISB4_bit;sbit LCD_D5_Direction at TRISB5_bit;sbit LCD_D6_Direction at TRISB6_bit;sbit LCD_D7_Direction at TRISB7_bit; //******************************************************************************// Variaveis Globais short Contador = 0; // Variavel para contagem de 0 a 99.short Dezena = 0, Unidade = 0; #define Latch PORTC.B0#define Clock PORTC.B1#define Ser_Out PORTC.B2 //******************************************************************************// Rotinas Auxiliares//******************************************************************************// Driver de display de 7 segmentos, numero a ser impresso e passado como// argumento da funcao. unsigned char Display(unsigned char no){ unsigned char Pattern; unsigned char SEGMENT[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D, 0x7D,0x07,0x7F,0x6F}; Pattern = SEGMENT[no]; // Segmento a retornar return (Pattern);} void SN74HC595(char SN74HC595_Display1, char SN74HC595_Display2){ short SN74HC595_Aux; // Variavel local de controle do laco for for(SN74HC595_Aux = 0; SN74HC595_Aux < 8; SN74HC595_Aux ++) { if( SN74HC595_Display1 & 0b10000000) Ser_Out = 1;// Mascara o setimo bit else Ser_Out = 0; // e verifica se e zero ou um. SN74HC595_Display1 = SN74HC595_Display1 << 1; // Rotaciona o proximo bit Clock = 1; // Pulsa o clock para envio do bit Delay_us(1); Clock = 0; } Ser_Out = 0; // Mantem a linha de dados em nivel baixo for(SN74HC595_Aux = 0; SN74HC595_Aux < 8; SN74HC595_Aux ++) { if( SN74HC595_Display2 & 0b10000000) Ser_Out = 1;// Mascara o setimo bit else Ser_Out = 0; // e verifica se e zero ou um. SN74HC595_Display2 = SN74HC595_Display2 << 1; // Rotaciona o proximo bit Clock = 1; // Pulsa o clock para envio do bit Delay_us(1); Clock = 0; } Ser_Out = 0; // Mantem a linha de dados em nivel baixo Latch = 1; Delay_us(1); Latch = 0;} //******************************************************************************//Rotina Principal void main(){TRISA = 0b00000000;PORTA = 0b00000000;TRISB = 0b00000000;PORTB = 0b00000000;TRISC = 0b00000000;PORTC = 0b00000000;TRISD = 0b00000000;PORTD = 0b00000000;TRISE = 0b00000000;PORTE = 0b00000000;ADCON1 = 0X0F; // Entradas digitais.OSCCON.B5 = 1; // Ajusta oscilador interno para 8MHzOSCCON.B4 = 1; // Ajusta oscilador interno para 8MHz Lcd_Init();Lcd_Cmd(_Lcd_Cursor_Off);Lcd_Cmd(_LCD_CLEAR);Lcd_Out(1,1,"*** PK2Lab ***");Lcd_Out(2,1,"Shift SN74HC595");Sound_Init(&PORTE,0);Sound_Play(1000,200);Delay_ms(100);Sound_Play(1000,200); while(1){ Dezena = Contador / 10; Unidade = Contador % 10; SN74HC595(Display(Unidade), Display(Dezena)); Delay_ms(200); Contador ++; if(Contador == 100) { Contador = 0; Sound_Play(1000,200); Delay_ms(100); Sound_Play(1000,200); Delay_ms(100); Sound_Play(1000,200); while(1){}; // Trava o programa ate