You are on page 1of 9

#Programação de Miguel Wisintainer

#Mikroc 1.3 BETA


#Projeto: Painel com MAX6952
#11/02/1999
program PAINEL
#Definicao Pinos Comunicacao com o MAX6952
symbol CLK = PORTC.0
symbol SDA = PORTC.1
symbol CS = PORTC.2
#Entrada as Chaves
symbol Chaves_D = PORTD
symbol Chaves_B = PORTB
#Manda dado para o MAX6952
sub procedure max6952_putchar(dim reg, data as char)
dim bits as byte
#Manda dados para MAXIM MSB
for bits = 7 to 0 step -1
CLK = 0
SDA = reg.bits
CLK = 1
next bits
#Manda dados para MAXIM LSB
for bits = 7 to 0 step -1
CLK = 0
SDA = data.bits
CLK = 1
next bits
end sub
#Inicializa o MAX6952
sub procedure MAX_6952_init
dim l as byte
CS = 0
for l = 1 to 5 # MaxSayisi = 5
max6952_putchar(0x01,0x88)
next l
CS = 1
CS = 0
for l = 1 to 5 # MaxSayisi = 5
max6952_putchar(0x02,0x88)
next l
CS = 1
CS = 0
for l = 1 to 5 # MaxSayisi = 5
max6952_putchar(0x03,0x01)
next l
CS = 1
CS = 0
for l = 1 to 5 # MaxSayisi = 5
max6952_putchar(0x04,0x01)
next l
CS = 1
end sub
#Mensagem fixas Hino Nacional Brasileiro
const Mensagem_erro = " TESTE DE carACTERE"
#Contantes para Tamanho de Registros
const Tam_Registro = 32
const Tam_K_EEPROM = 64
const Numero_de_Registros = ((Tam_K_EEPROM * 1024) / Tam_Registro) - 1
#Guarda Mensagem a ser impressa do Display
#O maior texto possivel eh de TAM_REGISTRO caracteres
dim Mensagem as string[Tam_Registro+20]
dim i,l as WORD
#Variaveis Digitacao Comando HYPERTERMINAL e INDICADOR FIM DE LINHA
dim Comando_Mensagem as string[Tam_Registro]
dim txt_cat as string[1]
dim received_byte as byte
dim dado_lido as byte
dim numero_mensagem as string[3]
#INDICE DENTRO DO BANCO DE DADOS DBASEII
dim index as WORD
#Escreve no endereco o dado
sub procedure SI2C_Write(dim ee_adr as word, dim ee_data as byte)
I2C_Start() ' Issue I2C start signal
I2C_Wr($A0)
I2C_Wr(hi(ee_adr)) ' Send byte(address for EEPROM)
I2C_Wr(Lo(ee_adr)) ' Send byte(address for EEPROM)
I2C_Wr(ee_data) ' Send data(data that will be written)
I2C_Stop()
delay_ms(5)
end sub
#Le do endereco o dado
sub function SI2C_Read(dim ee_adr as Word) as byte
I2C_Start() ' Issue I2C start signal
I2C_Wr($A0)
I2C_Wr(hi(ee_adr)) ' Send byte(address for EEPROM)
I2C_Wr(Lo(ee_adr)) ' Send byte(address for EEPROM)
I2C_Repeated_Start
I2C_Wr($A1)
result = I2C_Rd(0) ' Read the data
I2C_Stop() ' Issue I2C stop signal
end sub
#Seleciona Mensagem
#Le do PORTD, a combinacao Binaria
#Concatena 20 caracteres brancos, por causa da indexacao, que vai a + 19
sub procedure Mensagem_Imprime()
#Configura MAX6952 NO MODO CASCATA...DOUT
CS = 0 # HABILITA MAXIM
max6952_putchar(0x20,0xB0)
max6952_putchar(0x00,0)
max6952_putchar(0x00,0)
CS = 1 # DESABILITA MAXIM
Mensagem = "hello "
#Comando_Mensagem = " "
#strcat(mensagem, Comando_Mensagem)
#strcat(mensagem, " ")
#Scroll
i = 0
while 1=1 #Loop com Wend
#Se encontrou fim da frase (esqueca os espacos no final)
if i = strlen(mensagem) - 20 then
goto Saida_loop
end if
CS = 0 # HABILITA MAXIM
max6952_putchar(0x20,mensagem[16 + i])
max6952_putchar(0x20,mensagem[12 + i])
max6952_putchar(0x20,mensagem[8 + i])
max6952_putchar(0x20,mensagem[4 + i])
max6952_putchar(0x20,mensagem[0 + i])
CS = 1 # DESABILITA MAXIM
CS = 0 # HABILITA MAXIM
max6952_putchar(0x21,mensagem[17 + i])
max6952_putchar(0x21,mensagem[13 + i])
max6952_putchar(0x21,mensagem[9 + i])
max6952_putchar(0x21,mensagem[5 + i])
max6952_putchar(0x21,mensagem[1 + i])
CS = 1 # DESABILITA MAXIM
CS = 0 # HABILITA MAXIM
max6952_putchar(0x22,mensagem[18 + i])
max6952_putchar(0x22,mensagem[14 + i])
max6952_putchar(0x22,mensagem[10 + i])
max6952_putchar(0x22,mensagem[6 + i])
max6952_putchar(0x22,mensagem[2 + i])
CS = 1 # DESABILITA MAXIM
CS = 0 # HABILITA MAXIM
max6952_putchar(0x23,mensagem[19 + i])
max6952_putchar(0x23,mensagem[15 + i])
max6952_putchar(0x23,mensagem[11 + i])
max6952_putchar(0x23,mensagem[7 + i])
max6952_putchar(0x23,mensagem[3 + i])
CS = 1 # DESABILITA MAXIM
delay_ms(250) # DELAY 250ms
i = i + 1 #Avanca indexacao Mensagem
#inttostr(i,comando_mensagem)
#Usart_Write_Text(comando_mensagem)
#Usart_Write(13)
wend
saida_loop:
end sub
#Rotina que apaga todos os registros de mensagens
sub procedure Apaga_Todas_Mensagens()
for l = 0 to Numero_de_Registros
#Coloca um Null no comeco de cada registro
SI2C_Write(l*Tam_Registro,0x00)
next l
end sub
#Mostra Registro apontado por index
sub procedure Mostra_Registro()
#Ve se nao ta vazio
if SI2C_Read(index * Tam_Registro) = 0 then
Usart_Write_Text(chr(13) + "MENSAGEM VAZIA" + chr(13))
else
#Indexa e le byte por byte e manda via serial
i = 0
dado_lido = SI2C_Read((index * Tam_Registro)+i)
#Pula linha
Usart_Write(13)
#Enquanto nao chegou no fim da menagem, delimitada por NULL
#Ou nao encontrou NULL (normalmente quando a EEPROM eh virgem
while (dado_lido <> 0) and (i <> Tam_Registro) and (dado_lido <> 255)
#Usart_Write_Text(chr(dado_lido))
dado_lido = SI2C_Read((index * Tam_Registro)+i)
#Transforma em String
txt_cat[0] = dado_lido
#Manda pela serial
Usart_Write_Text(txt_cat)
#Proximo caractere
i = i + 1
wend
#Pula linha
Usart_Write(13)
end if
end sub
#Nova Rotina Leitura Usart que mostra dado lido
#Parametro = numero de caracteres maximos
sub procedure Usart_Read_Text_New(dim tam as WORD)
dim index_caractere as byte
#Ponteiro dentro do Registro
index_caractere = 0
#Indica que nenhuma tecla foi pressionada
received_byte = 0
#Buffer Recepcao
Comando_Mensagem = ""
#Espera pressionar a tecla Enter para finalizar
while received_byte <> 13
#Aguarda pressionar uma tecla
while Usart_Data_Ready = 0
wend
#Le Tecla
received_byte = Usart_Read
#Se for Backspace
if received_byte = 8 then
#Verifica se tem mais de 1 caracter
if index_caractere > 0 then
#Se sim, volta
index_caractere = index_caractere - 1
#E poe NULL no final
Comando_Mensagem[index_caractere] = 0
#Apenas para transformar em String e imprimir
txt_cat[0] = received_byte
#Imprime
Usart_Write_Text(Txt_Cat)
end if
else
if received_byte <> 13 then
#Nao deixa digitar mais que Tam caracteres
if index_caractere<>tam then
#Caso contrario avanca indice
index_caractere = index_caractere + 1
#Transforma em string
txt_cat[0] = received_byte
#Concatena
strcat(Comando_Mensagem,Txt_Cat)
#Imprime
Usart_Write_Text(Txt_Cat)
end if
end if
end if
wend
#Usart_Write_Text(Comando_Mensagem)
end sub
#Apaga conteudo da memoria
sub procedure Edita_registro()
#Pede confirmacao
Usart_Write_Text(chr(13) + "DIGITE NOVA MENSAGEM" + chr(13))
#Aguarda confirmacao
Usart_Read_Text_New(Tam_Registro)
#Se for sim...
if strlen(Comando_Mensagem) > 63 then
#Chama funcao apagar registros
Usart_Write_Text(chr(13) + "MENSAGEM MUITO GRANDE" + chr(13))
else
#Grava registro na posicao do Index
for i = 0 to strlen(Comando_Mensagem)
SI2C_Write((index*Tam_Registro)+i,Comando_Mensagem[i])
next i
Usart_Write_Text(chr(13) + "MENSAGEM ATUALIZADA" + chr(13))
#Poe indicador de fim de mensagem
SI2C_Write((index*Tam_Registro)+i,0)
end if
end sub
#Apaga conteudo da memoria
sub procedure Apaga_todos_registros()
#Pede confirmacao
Usart_Write_Text(chr(13) + "DIGITE 'SIM' PARA CONFIRMAR" + chr(13))
#Aguarda confirmacao
Usart_Read_Text_new(3)
#Se for sim...
if strstr(Comando_Mensagem,"SIM") = 0 then
#Chama funcao apagar registros
Usart_Write_Text(chr(13) + "APAGANDO MENSAGENS" + chr(13))
Apaga_Todas_Mensagens()
Usart_Write_Text("MENSAGENS APAGADAS" + chr(13))
end if
end sub
#Lista todos os registros....
sub procedure Lista_Todos_Registros()
#Do registro 0 a Numero_de_Registros
for l = 0 to Numero_de_Registros
#Converte para string, para imprimir pela serial
inttostr(l,numero_mensagem)
#Pula linha
Usart_Write(13)
#Mostra posicao da Mensagem sendo impressa
Usart_Write_Text("Mensagem numero ")
Usart_Write_Text(numero_mensagem)
#Pula linha
Usart_Write(13)
#Se nao tiver Mensagem, alerta
if SI2C_Read(l * Tam_Registro) = 0 then
Usart_Write_Text("MENSAGEM VAZIA" + chr(13))
else
i = 0
#Le caractere da Mensagem (EEPROM), indexando
dado_lido = SI2C_Read((l * Tam_Registro)+i)
#Ou nao encontrou NULL (normalmente quando a EEPROM eh virgem
while (dado_lido <> 0) and (i <> Tam_Registro) and (dado_lido <> 255)
#Usart_Write_Text(chr(dado_lido))
dado_lido = SI2C_Read((l * Tam_Registro)+i)
#Transforma em String
txt_cat[0] = dado_lido
#Manda pela serial
Usart_Write_Text(txt_cat)
#Avanca para proximo caractere
i = i + 1
wend
#Pula linha
Usart_Write(13)
end if
next l
end sub
#Desvia para um registro (ponteiro)
sub procedure Vai_Para_um_registro()
#Pede confirmacao
Usart_Write_Text(chr(13) + "IR PARA QUAL REGISTRO" + chr(13))
#Aguarda confirmacao
Usart_Read_Text_new(4)
#Se for sim...
if strtoint(Comando_Mensagem) > Numero_de_Registros then
#Registro invalido
Usart_Write_Text(chr(13) + "REGISTRO INVALIDO" + chr(13))
else
#Tranforma de string para byte
index = strtoint(Comando_Mensagem)
#Posicionado
Usart_Write_Text(chr(13) + "REGISTRO REPOSICIONADO" + chr(13))
end if
end sub
#Manda Mensagem para painel
sub procedure Manda_Para_Painel(dim numero as WORD)
#Ve se nao ta vazio
if SI2C_Read(numero * Tam_Registro) = 0 then
Mensagem ="MENSAGEM VAZIA"
else
#Indexa e le byte por byte e manda via serial
i = 0
dado_lido = SI2C_Read((index * Tam_Registro)+i)
#Enquanto nao chegou no fim da menagem, delimitada por NULL
Mensagem = ""
#Ou nao encontrou NULL (normalmente quando a EEPROM eh virgem
#Ou nao encontrou NULL (normalmente quando a EEPROM eh virgem
while (dado_lido <> 0) and (i <> Tam_Registro) and (dado_lido <> 255)
#Usart_Write_Text(chr(dado_lido))
dado_lido = SI2C_Read((index * Tam_Registro)+i)
#Transforma em String
txt_cat[0] = dado_lido
#Manda pela serial
strcat(mensagem, txt_cat)
#Proximo caractere
i = i + 1
wend
end if
#Usart_Write_Text(chr(13) + "OLHE O PAINEL" + chr(13))
Mensagem_Imprime()

end sub
#Le Chaves e manda para Painel
sub procedure Le_Chaves()
Manda_Para_Painel(Chaves_b * 256 + Chaves_d)
end sub
sub procedure Apaga_Registro()
#Pede confirmacao
Usart_Write_Text(chr(13) + "APAGA QUAL REGISTRO" + chr(13))
#Aguarda confirmacao
Usart_Read_Text_new(4)
#Se for sim...
if strtoint(Comando_Mensagem) > Numero_de_Registros then
#Registro invalido
Usart_Write_Text(chr(13) + "REGISTRO INVALIDO" + chr(13))
else
#Tranforma de string para byte
index = strtoint(Comando_Mensagem)
#Apaga
SI2C_Write(index*Tam_Registro,0x00)
Usart_Write_Text(chr(13) + "REGISTRO APAGADO" + chr(13))
end if
end sub
#Mostra Menus de operacao sobre mensagens
#Aguarda opcao de menu
sub procedure Menu()
while TRUE
#ENTRE COM UM COMANDO
Usart_Write_Text("Entre com o comando:"+ chr(13))
#AGUARDA ENTRADA
while Usart_Data_Ready() = 0
wend
#Aguarda comando
Usart_Read_Text_new(11)
#Usart_Write_Text(Comando_Mensagem)
#Se Comando for ERASE
if strstr(Comando_Mensagem,"ERASE ALL") = 0 then
Apaga_todos_registros()
else
#Se Comando for HELP
if strstr(Comando_Mensagem,"HELP") = 0 then
Usart_Write_Text(chr(13)+ "Painel de Mensagens - DBASE II SINTAX" + chr
(13))
Usart_Write_Text("-------------------------------------" + chr(13))
Usart_Write_Text("ERASE ALL,ERASE,GOTO BOTTON,GOTO TOP,DISPLAY,EDIT,LIS
T ALL,HELP,GOTO, PAINEL, EXIT" + chr(13))
else
#Se Comando for GOTO TOP
if strstr(Comando_Mensagem,"GOTO TOP") = 0 then
index = Numero_de_Registros
Usart_Write_Text(chr(13) + "NO TOPO" + chr(13))
else
#Se Comando for GOTO TOP
if strstr(Comando_Mensagem,"GOTO BOTTON") = 0 then
index = 0
Usart_Write_Text(chr(13) + "NA BASE" + chr(13))
else
#Se Comando for DISPLAY
if strstr(Comando_Mensagem,"DISPLAY") = 0 then
Mostra_Registro()
else
#Se Comando for EDIT
if strstr(Comando_Mensagem,"EDIT") = 0 then
Edita_registro()
else
#Se Comando for LIST
if strstr(Comando_Mensagem,"LIST ALL") = 0 t
hen
Lista_Todos_Registros()
else
if strstr(Comando_Mensagem,"GOTO") = 0 th
en
Vai_Para_um_registro()
else
if strstr(Comando_Mensagem,"PAINEL") =
0 then
Manda_Para_Painel(index)
txt_cat[0] = 13
Usart_Write_Text(txt_cat)
else
if strstr(Comando_Mensagem,"ERASE")
= 0 then
Apaga_Registro()
else
if strstr(Comando_Mensagem,"EXIT"
) = 0 then
Usart_Write_Text(chr(13) + "V
OLTANDO AO PAINEL" + CHR(13))
goto sai_menu
else
Usart_Write_Text(chr(13) + "C
OMANDO INVALIDO!!!" + CHR(13))
end if
end if
end if
end if
end if
end if
end if
end if
end if
end if
end if
wend
sai_menu:
end sub
main:
#Define Portc como saida
TRISC = 0x80
#Define PORTD E PORTB (MSB) com entrada (Selecao Mensagem)
TRISD = 0xFF
TRISB = 0xFF
#Inicializa SPI para conversar com o MAX6952
#SPI_INIT
#Inicializa MAX6952
MAX_6952_init
#Inicializa SOFT I2C
I2C_Init(100000)
#Usart Init 19200, para comunicacao com PC
Usart_Init(19200)
#Index para mensagens recebe 0
index = 0
#Seleciona_Mensagem()
#Menu()
#Seleciona_Mensagem_Imprime()
while 1 = 1
#SE NAO PRESSIONADO UMA TECLA
if Usart_Data_Ready = 0 then
#FICA MOSTRANDO NO PAINEL
Le_Chaves()
else
#SE FOI PRESSIONADO, VERIFICA SE FOI A LETRA "U"
if Usart_Read = "U" then
#APRESENTA MENUS
Menu()
end if
end if
wend
end.

You might also like