display com teclado

S

scmael

Guest
Caros amigos Preciso de ajuda Tenho um projeto que tem pic16c74 hoje é muito difícil de encontrar e demasiado caro Como faço para substituir o pic16f877 Pinout é a mesma.

;************************************************* *************
, Escrito por HAYSSAM SERHAN *
; COPYRIGHT HOME DESENHOS - 961 9 221737 *
*;
; ENDEREÇO RAMAS SERHAN *
, C / O HAYSSAM SERHAN *
; Universidade Americana de Beirute *
; POBOX: 11-0236/F6 *
; BEIRUT *
; LÍBANO *
*;
; DATA 28.7.97 *
; FILE guardada como DISPLAY.ASM *
; PARA PIC16C74 WDT = OFF OFF = CP *
;
ACERT.RELÓG 18,00 Ressonância MHZ *
;************************************************* *************

TÍTULO "DISPLAY.ASM - RTCLOCK PC TECLADO LCD EEPROM INTERFACE DISPLAY"

LIST P = 16C74
;
; CONFIGURAÇÃO DE HARDWARE

; Uma PORT SETUP
; LCD LINHAS DE CONTROLE
; RA4 = RS (REGISTER SELECT)
; RA5 = E (ENABLE)
; LCD DADOS DE LINHAS
; RA <3: 0>

; B PORT SETUP
; Teclado do PC INTERFACE
; RB0/INT = KEYBOARD
ACERT.RELÓG SIGNAL
; RB1 = KEYBOARD SINAL DE DADOS
; DADOS júri
; RB2 = CS0
; Rb3 = CS1
; RB4 = CS2
; RB5 = CS3
; RB6 = CS4
; RB7 = CS5

; C PORT SETUP
; RC0 = RTC CONTROL LINHAS
; RC1 = RTC I / O
; RC2 = RTC RELÓGIO
; Sinal para o SHIFT REGISTER
; RC3 RCL = sinal para o SHIFT REGISTER
; RC6 = SINAL DE DADOS AO SHIFT REGISTER
; RC4 = PEÇAS
; RC5 = PEÇAS
; RC7 = PEÇAS; D PORT SETUP
; DADOS DE SAÍDA PARA DISPLAY
; RD <7: 0>

; E PORT SETUP
; EEPROM INTERFACE
; RE0 = SCL
; RE1 = SDA
; RE2 = PEÇAS

INCLUDE <P16C74.INC>
;
;------------------------------------------------- ---------------------------
; REGISTER FILE CESSÃO
;------------------------------------------------- ---------------------------

; Programa segura leitura e escrita de DS1302 real time clock
; FICHEIROS.Também permite ler e escrever de um bloco de 31 BYTES
; De memória para / RTC NÃO VOLÁTEIS DA ÁREA DE DADOS.

; CESSÃO DO PORTO

LCD_DATA EQU PORTA; DADOS DO LCD está para baixo 4-BITS
LCD_DATA_TRIS EQU TRISA; TRIS DO REGISTO DE DADOS LCD
LCD_CNTL EQU PORTA; dois controles LINHAS
E EQU 5; LCD ENABLE de comando
RS EQU 4; LCD SELECT CONTROLE DE LINHA

; B PORT CESSÃO

KEYPOR EQU PORTB; PORTB
RB1 EQU 1
CS0 EQU 2
CS1 EQU 3
CS2 EQU 4
CS3 EQU 5
CS4 EQU 6
CS5 EQU 7

; C PORT CESSÃO

RTCRES EQU 0; RTC LINHAS DE CONTROLE
RTCIO EQU 1; RTC I / O
RTCCLK EQU 2; RTC RELÓGIO
ISPCLK EQU 3; SHIFT SÉRIE DE RELÓGIO
ISPDAT EQU 6; SHIFT SÉRIE DE DADOS DE ENTRADA

; D PORT CESSÃO
DISPDAT EQU PORTD

; E PORTO CESSÃO

SCL EQU ,0; EEROM relógio bit
SDA EQU ,1; EEROM dados pouco
SDPORT EQU PORTE; EEROM dados porto
SCPORT EQU PORTE; EEROM relógio porto

SHIFT EQU ,1
EQU ,2-CHAVE
BEG EQU ,6
HI EQU ,7

; VARIABLE CESSÃO

GP1 EQU 0x20; General Purpose FICHEIROS
GP2 EQU GP1
1FSRCOPY EQU GP2 1; CÓPIA DO FSR
SÉRIE EQU FSRCOPY 1; GP REGISTAR para transferir ETC.

; ********** RELÓGIO DE TEMPO REAL COPIE ****

RTCD EQU SÉRIE 1; DIAS
RTCH EQU RTCD 1; HORAS
RTCM EQU RTCH 1; ACTA
RTCS EQU RTCM 1; SEGUNDOS

WCOPY EQU RTCS 1; Fotocópia do registo na W interromper Push
Scopy EQU WCOPY 1; Cópia do estatuto registo em interromper Push
PCOPY EQU Scopy 1; Cópia da pclath em interromper Push
BANDEIRA EQU PCOPY 1; Geral finalidade bandeira bits aqui
BANDEIRA KEYVAL EQU 1; Usado para formar chave código

; ********** SÉRIE EEPROM REGISTAR ***********

COUNT EQU KEYVAL
1
EESER EQU COUNT
1EEPAGE EQU EESER 1; Page número
EEBYTE EQU EEPAGE 1; Byte counter
EESTART EQU EEBYTE 1; eerom iniciar endereço no bloco BAIXA
EECOUNT EQU EESTART 1; Bit count quando deslocando
FLA EQU EECOUNT 1; Misc bandeira bits
STRCOM EQU FLA 1; EEROM página / endereço ponteiro

; **************** RTC INTERMÉDIAS REGISTAR *******

MSDH1 EQU STRCOM
1LSDH1 EQU MSDH1
1MSDM1 EQU LSDH1
1LSDM1 EQU MSDM1
1MSDS1 EQU LSDM1
1LSDS1 EQU MSDS1
1
; **************** PC KEYBOARD REGISTAR ************

NBITS EQU LSDS1
1Nbytes EQU NBITS
1KEYTEMP EQU Nbytes
1LASTKEY EQU KEYTEMP
1KEYBUFF EQU LASTKEY
1Flag1 EQU KEYBUFF
1KTMP EQU Flag1
1BLL EQU KTMP
1
; ************** RTC General Purpose REGISTAR ******

MSD EQU BLL 1; TEMP.REGISTRE,
detém mais significativas
; DIGIT A BCD CONVERSÃO DE BIN
MSD LSD EQU 1; TEMPORÁRIA DE,
detém menos significativo
; DIGIT A BCD CONVERSÃO DE BIN
TEMP EQU LSD 1; TEMPORÁRIA DE
CHAR EQU TEMP 1; TEMPORÁRIA DE,
USD EQU CHAR 1;
TSD EQU USD 1;
MSDH EQU TSD
1MSDM EQU MSDH
1MSDS EQU MSDM
1LSDH EQU MSDS
1LSDM EQU LSDH
1LSDS EQU LSDM
1
OBJETIVO GERAL ;*************** REGISTAR ***********

EECH EQU LSDS 1; eerom iniciar endereço no bloco ALTA
STRNUM EQU EECH
1TTT EQU STRNUM
1TTTF EQU TTT
1PPP EQU TTTF
1TABOFF EQU PPP
1EECL EQU TABOFF 1; eerom iniciar endereço no bloco BAIXA
DISPCON EQU EECL
1LCDH EQU DISPCON
1AAA EQU LCDH
1BBB EQU AAA
1CCC EQU BBB
1LL EQU CCC
1HH EQU LL
1EL EQU HH
1EH EQU EL
1LLL EQU EH
1
INL EQU 0x70
INH EQU INL
1ILH EQU INH
1CSHIFT EQU ILH
1CAMINHO EQU CSHIFT
1WAY2 EQU CAMINHO
1Colo EQU WAY2
1TCOLO EQU Colo
1IEE EQU TCOLO
1IEE OTYO EQU
1TBUFF EQU OTYO
1
CH1 EQU 0xA0
CH2 EQU CH1
1CH3 EQU CH2
1CH4 EQU CH3
1C5 EQU CH4
1CH6 EQU C5
1CH7 EQU CH6
1CH8 EQU CH7
1CH9 EQU CH8
1CH10 EQU CH9
1CH11 EQU CH10
1CH12 EQU CH11
1CH13 EQU CH12
1CH14 EQU CH13
1CH15 EQU CH14
1CH16 EQU CH15
1
CH17 EQU CH16
1CH18 EQU CH17
1CH19 EQU CH18
1CH20 EQU CH19
1CH21 EQU CH20
1CH22 EQU CH21
1CH23 EQU CH22
1CH24 EQU CH23
1CH25 EQU CH24
1CH26 EQU CH25
1CH27 EQU CH26
1CH28 EQU CH27
1CH29 EQU CH28
1CH30 EQU CH29
1CH31 EQU CH30
1CH32 EQU CH31
1
;
CLKR EQU 100h; Rolando valor para RTC - subtrair count
, Valor a partir deste momento a contagem decrescente Preset.
DIV256 EQU b'00000111 '; 256us prescale definição
ROMBASE EQU 0; Início do programa ROM

;
DEV_FREQ EQU D'28000000 "; DEVICE frequência é 20 MHz
DEV_FREQ2 EQU D'3000000 '; DEVICE frequência é 2 MHz
DB_HI_BYTE EQU (ALTO (((DEV_FREQ / 4) * 1 / D'1000 ") / 3)) 1
LCD_INIT_DELAY EQU (ALTO (((DEV_FREQ / 4) * D'46 '/ D'10000') / 3)) 1
LCD_INIT_DELAY2 EQU (ALTO (((DEV_FREQ2 / 4) * D'46 '/ D'10000') / 3)) 1
;
T1OSO EQU 0; DO RC0 / T1OSO / T1CKI
;
RESET_V EQU 0x0000; ENDEREÇO DO RESET VECTOR
ISR_V EQU 0x0004; ENDEREÇO DO interromper VECTOR
TABLE_ADDR EQU 0x07E0; ENDEREÇO ONDE INÍCIO QUADROS
TAB_ASC1 EQU 0x067B
TAB_ASC2 EQU 0x0754
;
; LCD MODULE COMANDOS
;
DISP_ON EQU 0x00C; exibição em
DISP_ON_C EQU 0x00E; DISPLAY ON, CURSOR SOBRE
DISP_OFF EQU 0x008; DISPLAY OFF
CLR_DISP EQU 0x001; limpar o visor
ENTRY_INC EQU 0x006;
ENTRY_INC_S EQU 0x007;
ENTRY_DEC EQU 0x004;
ENTRY_DEC_S EQU 0x005;
DD_RAM_ADDR EQU 0x080; menos significativo 7-bits são DE ENDEREÇO
DD_RAM_UL EQU 0x080; CONER superior esquerdo do ecrã
DD_RAM_AD1 EQU 0x08C;
DD_RAM_AD2 EQU 0x0C0;;------------------------------------------------- ---------------------------
; Bandeira bit cessão
;------------------------------------------------- ---------------------------
; Os bits no pavilhão são definidas aqui

KEYIN EQU 0; Defina se um hit chave está aguardando em KEYMAKE

; CONSTANT CESSÃO

; RTC CHIP (DS1302) -
ACERT.RELÓG COMANDO constantes.
, Estas são escritas no RTC RTCWR OU EM RTCRD.
COMWR EQU B'10001110 '

SECWR EQU B'10000000 '; comando para escrever o RTC SEGUNDOS
MINWR EQU B'10000010 '; comando para escrever o RTC ACTA
HOUWR EQU B'10000100 '; comando para escrever o RTC HORAS
DAYWR EQU B'10001010 '; comando para escrever o RTC DIAS

SECRD EQU B'10000001 '; COMANDO para ler o RTC SEGUNDOS
MINRD EQU B'10000011 '; COMANDO para ler o RTC ACTA
HOURD EQU B'10000101 '; COMANDO para ler o RTC HORAS
DAYRD EQU B'10001011 '; COMANDO para ler o RTC DIAS

; PORTO FAZ SENTIDO LASTRAGEM RTC DADOS LINE OUTPUT / INPUT

RTCDOUT EQU B'00000000 '; RTC DADOS DE LINHA DE PRODUÇÃO
RTCDIN EQU B'00000010 '; RTC DADOS DE LINHA DE ENTRADA

; PORTO FAZ SENTIDO LASTRAGEM EEPROM SDA LINE OUTPUT / INPUT

SDAIN EQU b'00000010 '; SDA entrada é realizada quando TRIS
SDAOUT EQU b'00000000 '; SDA é produzido quando TRIS realizadas

;------------------------------------------------- --------------------------
; EEROM rotinas
;------------------------------------------------- --------------------------
; 24LC65 EEROM manipulação.
; READEE / WRITEE lê / escreve 16 bytes no início do EEFSR (60 H), utilizando
; EERD e EEWR.
; No estado ocioso fora das rotinas eerom SCL a linha deve ser
; Realizada baixo se a linha de dados é partilhada com outros dispositivos.
; Routines READEE / WRITEE chamar um nível de sub-rotinas.
; Quando EERD e EEWR são chamados,
criado como --
; EESTART - eerom ler iniciar baixa endereço de 8 bits
; Na saída --
; EEBYTE - erro no código do status saída
; Note que o NOP's pode ser necessário diminuir a interface para
; Algumas eerom partes.

; EEROM constante - código dispositivo de hardware e endereço

EECONT EQU b'10100000 '; 7 bits byte único
; Dispositivo código é 1010 para 24LC65B
; Em bits 7-4.
; Dispositivos de hardware como estabelecido pelo endereço A0, 1,2
; É colocado em bits 3-1.

; Ram os seguintes registos são utilizadas e devem ser equiparada à
; Valores adequados para dar BASE RAM PÁGINA acesso durante eerom leitura / gravação.
; EESER, EEBYTE, EESTART, EECOUNT, STRCOM
; O seguinte valor define a leitura / gravação ram começar endereço

EEFSR EQU b'01100000 '; Ponto no início de ram

;
;------------------------------------------------- ---------------------------
; Bit cessão
;------------------------------------------------- ---------------------------

; BANDEIRA bits são definidos aqui

EEREAD EQU 0; Defina para ler sobre a entrada EERDWR

;*********************** Macros ************************* *

; BANK0 ESCOLHE REGISTER FILE BANCO 0

BANK0 MACRO
BCF STATUS, RP0; SELECT BANCO 0
ENDM

; BANK1 ESCOLHE REGISTER FILE Banco 1

BANK1 MACRO
BSF STATUS, RP0; SELECT BANCO 1
ENDM

; PAGE0 ESCOLHE ROM Página 0

PAGE0 MACRO
BCF PCLATH, 3; SELECT ROM Página 0
ENDM

; Página1 ESCOLHE ROM PÁGINA 1

Página1 MACRO
BSF PCLATH, 3; SELECT ROM PÁGINA 1
ENDM

; RTCCLO TRASEIRAS RTC
ACERT.RELÓG LINHA DO BAIXO

RTCCLO MACRO
BCF PORTC, RTCCLK
ENDM

; RTCCHI TRASEIRAS DO RTC
ACERT.RELÓG LINHA ALTA

RTCCHI MACRO
BSF PORTC, RTCCLK
ENDM

; RTCDLO TRASEIRAS RTC DADOS DA LINHA BAIXA

RTCDLO MACRO
BCF PORTC, RTCIO
ENDM

; RTCDHI TRASEIRAS RTC DADOS DA LINHA ALTA

RTCDHI MACRO
BSF PORTC, RTCIO
ENDM

; RTCRLO TRASEIRAS DO RTC RESET LINHA DE BAIXA

RTCRLO MACRO
BCF PORTC, RTCRES
ENDM

; RTCRHI TRASEIRAS DO RTC RESET LINHA DE ALTA

RTCRHI MACRO
BSF PORTC, RTCRES
ENDM

; RTCIDLE TRASEIRAS DO RTC INACTIVIDADE NO ESTADO

RTCIDLE MACRO
RTCRLO
RTCDLO
RTCCLO
ENDM
;******
; PUSH salva o W, STATUS, PCLATH registos durante interromper

TOQUE MACRO
MOVWF WCOPY; Salvar no banco curent

SWAPF STATUS, W; Deixe Z bit como é

BANK0; Salvar restante em banco 0

MOVWF Scopy

MOVFW PCLATH; Situação e W são seguros - agora salvar PCLATH
MOVWF PCOPY
ENDM;******
; PULL restaura a W, STATUS, PCLATH registos após uma PUSH

PULL MACRO
BANK0; Restaurar do banco 0
MOVFW PCOPY; Restaurar PCLATH primeiro
MOVWF PCLATH

SWAPF Scopy, W; Restaurar mordidela posição de Situação
MOVWF STATUS

SWAPF WCOPY, F
SWAPF WCOPY, W; Deixe Z bit como é
ENDM;******
; TSTRTC move para W TIMER0 reg e define ZERO estatuto

TSTRTC MACRO
MOVFW TMR0; ensaio para Timeout
ENDM

;******
; EEBIT relógios a transportar para o bit de dados eerom linha.

EEBIT MACRO
LOCAL EEBIT1, EEBIT2
SKPNC
GOTO EEBIT1

; Carry é claro

BCF SDPORT, SDA
GOTO EEBIT2

; Carry está definido

EEBIT1 BSF SDPORT, SDA

; Relógio a eerom

EEBIT2 NOP
BSF SCPORT, SCL; Relógio alta
NOP
BCF SCPORT, SCL; Relógio baixa
ENDM;******
; EEGET relógios o byte (à esquerda) em EESER da eerom.Bit count
; É, por um'0 'no pavilhão EESER.
; Sair com SCL SDA e baixos e tanto como saídas

EEGET MACRO
LOCAL EEGET1

MOVLW b'11111110 »8 bits de dados para ser lido de forma bandeira é pouco 8.
MOVWF EESER

MOVLW SDAIN; SDA é input
BANK1
MOVWF TRISE
BANK0

EEGET1 BSF SCPORT, SCL; Relógio elevado para obter os dados pouco
CLRC; Assumir dados é baixa por agora
BTFSC SDPORT, SDA; Teste SDA bit
SETC; dados foi realmente alto!
RLF EESER; Carry = bits de dados para dados shifter
BCF SCPORT, SCL; Relógio baixa após dados lidos
BC EEGET1; Bit count bandeira ensaio - loop até aparecer 0

; Byte foi recebida a EESER, restaure ônibus para saídas

MOVLW SDAOUT; SDA é saída
BANK1
MOVWF TRISE
BANK0
ENDM

;******
; EEPUT relógios o byte (esquerda) na EESER na eerom.Bit count
; Está em EECOUNT.

EEPUT MACRO
LOCAL EEPUT1

EEPUT1 RLF EESER; Obter um bit de dados
EEBIT; Carry para EEROM dados e relógio ele
DECFSZ EECOUNT; Count os bits
GOTO EEPUT1; Loop até que todos os bits enviados
ENDM

;******
; TABSET estabelece o quadro LCD compensado antes ponteiro seqüência de saída
; Começa

TABSET MACRO
MOVLW b'11111111 '; Offset é incrementado em cada chamada para
; Tabela - primeira chamada deve gerar valor zero
; Compensado.
MOVWF TABOFF
ENDM;******
; PONTO incrementos a string ponteiro deslocado e adiciona-o ao
; PCL corda pronta para pesquisa

PONTO MACRO
INCF TABOFF
MOVFW TABOFF
ADDWF PCL
ENDM

;******
; POINT8 incrementos a string ponteiro deslocado e adiciona-o ao
; PLC prontos para string lookup.Define PCLATH a 8

POINT8 MACRO
MOVLW ,8
MOVWF PCLATH
INCF TABOFF
MOVFW TABOFF
ADDWF PCL
ENDM

;******
; POINT9 incrementos a string ponteiro deslocado e adiciona-o ao
; PCL pronto para string lookup.Define PCLATH a 9

POINT9 MACRO
MOVLW ,9
MOVWF PCLATH
INCF TABOFF
MOVFW TABOFF
ADDWF PCL
ENDM

;******
; POINT10 incrementos a string ponteiro deslocado e adiciona-o ao
; PCL pronto para string lookup.Define PCLATH a 10

POINT10 MACRO
MOVLW ,10
MOVWF PCLATH
INCF TABOFF
MOVFW TABOFF
ADDWF PCL
ENDM

;******
; POINT11 incrementos a string ponteiro deslocado e adiciona-o ao
; PCL pronto para string lookup.Define PCLATH a 11

POINT11 MACRO
MOVLW ,11
MOVWF PCLATH
INCF TABOFF
MOVFW TABOFF
ADDWF PCL
ENDM

;******
; POINT12 incrementos a string ponteiro deslocado e adiciona-o ao
; PCL pronto para string lookup.Define PCLATH a 12

POINT12 MACRO
MOVLW ,12
MOVWF PCLATH
INCF TABOFF
MOVFW TABOFF
ADDWF PCL
ENDM

;******
; POINT13 incrementos a string ponteiro deslocado e adiciona-o ao
; PCL pronto para string lookup.Define PCLATH a 13

POINT13 MACRO
MOVLW ,13
MOVWF PCLATH
INCF TABOFF
MOVFW TABOFF
ADDWF PCL
ENDM

;******
; POINT14 incrementos a string ponteiro deslocado e adiciona-o ao
; PCL pronto para string lookup.Define PCLATH a 14

POINT14 MACRO
MOVLW ,14
MOVWF PCLATH
INCF TABOFF
MOVFW TABOFF
ADDWF PCL
ENDM

;******
; POINT15 incrementos a string ponteiro deslocado e adiciona-o ao
; PCL pronto para string lookup.Define PCLATH a 15

POINT15 MACRO
MOVLW ,15
MOVWF PCLATH
INCF TABOFF
MOVFW TABOFF
ADDWF PCL
ENDM

; RESET ADDRESS.DETERMINAÇÃO DO TIPO DE RESET
;

ORG RESET_V; RESET VECTOR LOCALIZAÇÃO
GOTO START; SIM
;
;******
; Interrupt vector - teclado do PC

ORG ISR_V
GOTO INT
;
;************************* Subrotinas *********************** *****

;******
; STRING envia a string com o número de registo W - para a RAM

STRING
MOVWF STRNUM
TABSET; Xero o offset
Página1
CONVITE DOSTR; Caracteres de corda
PAGE0; Restaurar rom página

REGRESSO

;******
; String2 envia a string com o número de registo W - para o LCD

String2
MOVWF STRNUM
TABSET; Xero o offset
Página1
CONVITE DOSTR2; Caracteres de corda
PAGE0; Restaurar rom página

REGRESSO

INIT_DISPLAY MOVLW DISP_ON_C; DISPLAY ON, ON CURSON
CONVITE SEND_CMD; enviar este comando para exibir MÓDULO
MOVLW CLR_DISP; limpar o visor
CONVITE SEND_CMD; enviar este comando para exibir MÓDULO
MOVLW ENTRY_INC; SET modo de entrada de INC, NÃO SHIFT
CONVITE SEND_CMD; enviar este comando para exibir MÓDULO
REGRESSO

CLEAR_DISP
MOVLW CLR_DISP; limpar o visor
CONVITE SEND_CMD; enviar este comando para exibir MÓDULO
REGRESSO

;
DISPLAY
MOVLW DD_RAM_AD2;
CONVITE SEND_CMD;
CONVITE LOAD_HRS; NÃO, FAZER UM NOMAL DISPLAY
CONVITE LOAD_COLON;
CONVITE LOAD_MIN;
CONVITE LOAD_COLON;
CONVITE LOAD_SEC;
REGRESSO
;
;
LOAD_HRS
MOVF MSDH, W; MSD CARGA DE VALOR NA WREG
CONVITE NUM_TABLE; CHEGAR AO CÓDIGO ASCII
CONVITE SEND_CHAR; ENVIAR ESTE CHARACTER à exibição
;
MOVF LSDH, W; LSD CARGA DE VALOR NA WREG
CONVITE NUM_TABLE; Obter código ASCII
CONVITE SEND_CHAR; Envie este personagem para o Ecrã
REGRESSO
;
LOAD_COLON MOVLW ''; valor ASCII para um espaço em branco
BTFSC LSDS, 0; É um MESMO TDO ou segunda
ADDLW ':' - ''; é estranho, Segundo cólon está ON.
; ADD delta para compensar ASCII
CONVITE SEND_CHAR; Envie este personagem para o visor
REGRESSO
;
LOAD_MIN
MOVF MSDM, W; Coloque o valor para a MSD Wreg
CONVITE NUM_TABLE; Obter o código ASCII
CONVITE SEND_CHAR; Envie este personagem para o Ecrã
;
MOVF LSDM, W; Coloque o valor para o LSD Wreg
CONVITE NUM_TABLE; Obter o código ASCII
CONVITE SEND_CHAR; Envie este personagem para o Ecrã
REGRESSO
LOAD_SEC
MOVF MSDS, W; Coloque o valor para a MSD Wreg
CONVITE NUM_TABLE; Obter o código ASCII
CONVITE SEND_CHAR; Envie este personagem para o Ecrã
;
MOVF LSDS, W; Coloque o valor para o LSD Wreg
CONVITE NUM_TABLE; Obter o código ASCII
CONVITE SEND_CHAR; Envie este personagem para o Ecrã
REGRESSO
;
;************************************************* ************************
; * SendChar - Envia personagem para LCD *
; * Esta rotina divide o personagem na parte superior e inferior *
; * Nibbles e envia para o LCD, superior mordidela primeiro.*
; * Os dados são transmitidos na PORT <3:0> pinos *
;************************************************* ************************

SEND_CHAR
MOVWF CHAR; Caracteres a ser enviado é em W
CONVITE LCD_DELAY; Espere para LCD de estar pronta
CONVITE LCD_DELAY;
CONVITE LCD_DELAY;
CONVITE LCD_DELAY;
CONVITE LCD_DELAY;
CONVITE LCD_DELAY;
SWAPF CHAR, W;
ANDLW 0x0F; Get superior mordidela
MOVWF LCD_DATA; Enviar dados para o LCD
BSF LCD_CNTL, RS; Set LCD modo a dados
BSF LCD_CNTL, E; alternar E para LCD
NOP
BCF LCD_CNTL, E
MOVF CHAR, W
ANDLW 0x0F; Get inferior mordidela
MOVWF LCD_DATA; Enviar dados para o LCD
BSF LCD_CNTL, RS; Set LCD modo a dados
BSF LCD_CNTL, E; alternar E para LCD
NOP
BCF LCD_CNTL, E
; BCF LCD_CNTL, RS
REGRESSO

;************************************************* **************
; * Sendcmd - envia comando para LCD *
; * Esta rotina divide o comando na parte superior e inferior *
; * Nibbles e envia-las ao LCD, superior nible primeiro.*
; * Os dados são transmitidos na PORT <3:0> pinos *
;************************************************* **************

SEND_CMD
MOVWF CHAR; Caracteres a ser enviado é em W
CONVITE LCD_DELAY; Espere para LCD de estar pronta
CONVITE LCD_DELAY;
CONVITE LCD_DELAY;
CONVITE LCD_DELAY;
CONVITE LCD_DELAY;
CONVITE LCD_DELAY;
SWAPF CHAR, W;
ANDLW 0x0F; Get superior mordidela
MOVWF LCD_DATA; Enviar dados para o LCD
BCF LCD_CNTL, RS; Set LCD de modo comando
BSF LCD_CNTL, E; alternar E para LCD
NOP
BCF LCD_CNTL, E
MOVF CHAR, W
ANDLW 0x0F; Get inferior mordidela
MOVWF LCD_DATA; Enviar dados para o LCD
BSF LCD_CNTL, E; Toggle E para LCD
NOP
BCF LCD_CNTL, E
REGRESSO
;
; Esta rotina toma as vezes que o atraso calculado loop precisa de
; Ser executada,
com base na LCD_INIT_DELAY equiparar que inclui o
; Freqüência de operação.Estas utilizações registos antes de eles são necessários para
; Guardar a hora.
;

LCD_DELAY MOVLW LCD_INIT_DELAY;
MOVWF dólares; Uso MSD e LSD Registos de Initilize LCD
CLRF TSD;
LOOP2 DECFSZ TSD; Atraso tempo MSD = * ((3 * 256) 3) * Tcy
GOTO LOOP2;
DECFSZ USD;
END_LCD_DELAY
GOTO LOOP2;
RETURN;

LCD_DELAY3 MOVLW LCD_INIT_DELAY2;
MOVWF dólares; Uso MSD e LSD Registos de Initilize LCD
CLRF TSD;
LOOP23 DECFSZ TSD; Atraso tempo MSD = * ((3 * 256) 3) * Tcy
GOTO LOOP23;
DECFSZ USD;
END_LCD_DELAY3
GOTO LOOP23;
RETURN;

; Esta é a subrotina para interromper um teclado do PC

INT PUSH; Salvar W, STATUS, PCLATH
MOVLW 0
MOVWF PCLATH; Permitir para chamar a tabela
BTFSC INTCON, intf; PARA ENSAIO SOBRE interromper INT/RB0
GOTO KBD
GOTO INTX; Sair de interromper

KBD
MOVFW NBITS
SUBLW 0x00
BNZ BIT1_8

BIT0
GOTO Bump

BIT1_8
MOVFW NBITS
SUBLW 0x09
BZ BIT9

MOVFW NBITS
SUBLW 0x0A
BZ BIT10

CLRC
BTFSC KEYPOR, RB1
SETC
DRR KEYTEMP
GOTO Bump

BIT9
GOTO Bump

BIT10
MOVFW KEYTEMP
SUBLW 0x12
BZ TAT

MOVFW KEYTEMP
SUBLW 0x59
BNZ NOTLS

TAT
MOVFW LASTKEY
SUBLW 0xF0
BNZ MAKELS
BCF Flag1, SHIFT

MOVLW 0x12
MOVWF LASTKEY
GOTO Tidy

MAKELS
BSF Flag1, SHIFT
MOVLW 0x12
MOVWF LASTKEY
GOTO Tidy

NOTLS
MOVFW KEYTEMP
SUBLW 0x14
BNZ NOTCTRL
NOP
GOTO Tidy

NOTCTRL
MOVFW KEYTEMP
SUBLW 0xF0
BNZ NOTBREAK
MOVFW KEYTEMP
MOVWF LASTKEY
GOTO Tidy

NOTBREAK
MOVFW LASTKEY
SUBLW 0xF0
BNZ NOT_F0
MOVLW 0x00
MOVWF LASTKEY
GOTO Tidy

NOT_F0
MOVFW KEYTEMP
MOVWF LASTKEY
MOVWF KTMP
BTFSC Flag1, SHIFT
GOTO deslocada

UNSHIFTED
CONVITE ASC1
GOTO SKIP1

Deslocada
CONVITE ASC2

SKIP1NOT0
MOVWF KEYBUFF
BSF Flag1, CHAVE
MOVLW 0x01
MOVWF Nbytes

Tidy
MOVLW 0x00
MOVWF NBITS
MOVWF KEYTEMP
GOTO INTDONE

Bump
INCF NBITS

INTDONE
BCF INTCON, intf
PULL
RETFIE

; Geral saída de interromper

INTX BCF INTCON, RBIF; aberto interrypt chamando bandeira
BCF INTCON, intf
BCF PIR1, RCIF
PULL; Restauração W, STATUS e PCLATH
RETFIE

; RTCGET lê o DS1302 real time clock dias, horas, MINS, SECS,
; PARA PIC RAM.

RTCGET MOVLW SECRD,
preparar para ler o RTC SEGUNDOS
MOVWF SÉRIE; INSTITUÍDO AO COMANDO
CONVITE RTCRD; RECEBER OS SEGUNDOS DADOS
MOVFW SÉRIE
MOVWF RTCS;
criar cópia local do RTC SEGUNDOS

MOVLW MINRD,
preparar para ler o RTC ACTA
MOVWF SÉRIE; INSTITUÍDO AO COMANDO
CONVITE RTCRD; RECEBER OS DADOS DE ACTA
MOVFW SÉRIE
MOVWF RTCM;
criar cópia local do RTC ACTA

MOVLW HOURD,
preparar para ler o RTC HORAS
MOVWF SÉRIE; INSTITUÍDO AO COMANDO
CONVITE RTCRD; RECEBER AS HORAS DE DADOS
MOVFW SÉRIE
MOVWF RTCH;
criar cópia local do RTC HORAS

MOVLW DAYRD; PREPARAR PARA LER OS DIAS RTC
MOVWF SÉRIE; INSTITUÍDO AO COMANDO
CONVITE RTCRD; RECEBER OS DIAS DE DADOS
MOVFW SÉRIE
MOVWF RTCD;
criar cópia local do RTC DIAS

RETURN; SAIR DA LEITURA NOVO HORÁRIO DE RTC

; RTCPUT escreve o RTC NOVO TEMPO AO DS1302 DESDE PIC RAM e
; Reinicia o RTC

RTCPUT
MOVLW COMWR
MOVWF SÉRIE
MOVLW B'00000000 '
MOVWF GP1
CONVITE RTCWR

CONVITE CLKSTOP; parar o
ACERT.RELÓG Enquanto estava escrevendo o NOVOS HORÁRIOS
; E minutos.Zeros PRESENTE E OS SEGUNDOS
; Também impede QUAISQUER ERROS ENTRE capotamento
; ESCRITO OS NOVOS horas e minutos.

MOVLW DAYWR; WRITE COMANDO PARA RTC
MOVWF SÉRIE; SET RTC comando para escrever novos HORAS
MOVFW RTCD; obter o novo RTC DIAS
MOVWF GP1; CRIAR NOVOS DADOS DIAS
CONVITE RTCWR; escrever novos dias para o RTC

MOVLW HOUWR; WRITE COMANDO PARA RTC
MOVWF SÉRIE; SET RTC comando para escrever novos HORAS
MOVFW RTCH; obter o novo RTC HORAS
MOVWF GP1; CRIAR NOVOS DADOS DE HORAS
CONVITE RTCWR; escrever novas HORAS AO RTC

MOVLW MINWR; ESCREVER PARA RTC
MOVWF SÉRIE; SET RTC comando para escrever novos ACTA
MOVFW RTCM; obter o novo RTC ACTA
MOVWF GP1; CRIAR NOVOS DADOS ACTA
CONVITE RTCWR; escrever novas minutos do RTC

MOVLW SECWR; ESCREVER PARA RTC
MOVWF SÉRIE; SET RTC comando para escrever novos SEGUNDOS
MOVFW RTCS; obter o novo RTC ACTA
MOVWF GP1; CRIAR NOVOS DADOS SEGUNDOS
CONVITE RTCWR; escrever novas segundos para a RTC

CONVITE CLKGO; Reiniciar o RTC

MOVLW COMWR
MOVWF SÉRIE
MOVLW B'10000000 '
MOVWF GP1
CONVITE RTCWR

RETURN; SAÍDA DE ESCREVER NOVO TEMPO PARA RTC

; CLKGO começa a RTC CHIP.

CLKGO MOVLW SECRD; CHEGAR AO segundos de RTC
MOVWF SÉRIE
CONVITE RTCRD; GET-los agora
BCF SÉRIE, 7; TOP BIT CLEAR para iniciar o relógio
MOVFW SÉRIE
MOVWF GP1; INÍCIO DO RELÓGIO COM O MESMO TEMPO
MOVLW SECWR; WRITE VOLTAR AO segundos com o 'Executar' BANDEIRA
MOVWF SÉRIE
CONVITE RTCWR
REGRESSO

; CLKSTOP OPOSIÇÃO AO RTC CHIP.

CLKSTOP MOVLW SECWR
MOVWF SÉRIE
MOVLW 0FFH; WRITE RTC SECS COM TODOS OS'1 'S TO STOP IT
MOVWF GP1
CONVITE RTCWR
REGRESSO

; RTCWR escreve o real time clock CHIP com o comando BYTE EM SÉRIE
; EO ESCRITA EM DADOS BYTE GP1 em binário.
; Assume que na entrada RTC RST / E SCLK são baixos.
; À saída RTC RST / IS LEFT ALTA E BAIXA SCLK ESTÁ PRONTO PARA A ESQUERDA
, Leitura /
gravação a ter lugar.

RTCWR
RTCCLO; RTC
ACERT.RELÓG linha deverá ser baixa, quando --
RTCRHI; - RTC RESET LINHA GOES ALTA
CONVITE RTCTX; COMANDO EM SÉRIE AO RTC
MOVFW GP1; OBTER OS DADOS BYTE --
MOVWF SÉRIE; - e configurar o Shifter
CONVITE RTCTX; DADOS PARA RTC
RTCRLO; dados tenham sido escritos para o RTC
RETURN; saída da RTC WRITE PLUS DADOS DE COMANDO

; RTCRD lê o real time clock CHIP com o comando BYTE EM SÉRIE
; EO ler dados BYTE RETORNO EM SÉRIE EM BCD.
; Assume que na entrada RTC RST / E SCLK são baixos.
; À saída RTC RST / IS LEFT ALTA E BAIXA SCLK ESTÁ PRONTO PARA A ESQUERDA
, Leitura /
gravação a ter lugar.

RTCRD RTCCLO; RTC
ACERT.RELÓG linha deverá ser baixa, quando --
RTCRHI; - RTC RESET LINHA GOES ALTA
CONVITE RTCTX; COMANDO EM SÉRIE AO RTC
MOVLW RTCDIN; FAZER O RTC I / O PORTO DE ENTRADA PIN
BANK1
MOVWF TRISC
BANK0
CONVITE RTCRX; DADOS DO RTC
MOVLW RTCDOUT; FAZER O RTC I / O PORTO PIN UMA SAÍDA
BANK1
MOVWF TRISC
BANK0
RTCRLO; dados tenham sido escritos para o RTC
RETURN; saída da RTC ESCREVER DE COMANDO E LEIA

; RTCTX transmite o FORA DE SÉRIE DE DADOS AO RTC
; GP2 UTILIZAÇÕES E SÉRIE

RTCTX
LOCAL RTX1, RTX2
MOVLW ,8; número de bits para desviar
MOVWF GP2
RTX1 RTCDLO; RESPEITAR OS DADOS BIT será um'0 'PARA JÁ
DRR SÉRIE; GET BIT DE DADOS
BNC RTX2; BRANCH se os dados foi um'0 '
RTCDHI; DADOS BIT foi um'1 'EFECTIVAMENTE
RTX2 RTCCHI;
ACERT.RELÓG os dados para o RTC
RTCCLO
DECF GP2; COUNT BITS AS de serem escritas no RTC
BNZ RTX1; LOOP até que todos os ENVIADO AO RTC
REGRESSO

; RTCRX recebe os dados do RTC EM SÉRIE
; GP2 UTILIZAÇÕES E SÉRIE

RTCRX
LOCAL RRX1, RRX2
MOVLW ,8; número de bits para desviar
MOVWF GP2
RRX1 CLRC; RESPEITAR OS DADOS BIT será um'0 'PARA JÁ
BTFSC PORTC, RTCIO; LEIA AS BIT DA RTC
SETC; os dados foram realmente um'1 '
DRR SÉRIE; SHIFT BIT DE DADOS EM SÉRIE
RRX2 RTCCHI;
ACERT.RELÓG os dados para o RTC
RTCCLO
DECF GP2; COUNT BITS AS de serem escritas no RTC
BNZ RRX1; LOOP até que todos os ENVIADO AO RTC
REGRESSO
;
;******
; CHAVE testa se uma keyhit está aguardando para ser analisada --
; Devolve-chave em KEYVAL com TRANSPORTAR SET

GETKE1
CLRC; assumimos qualquer tecla para o momento
BTFSS Flag1, CHAVE

; Não saia com a tecla para transportar claro

RETURN; Sair CHAVE

; Espera-chave bateu tão bip,
manuseie bandeira e sair transportar conjunto

BCF Flag1, CHAVE; Limpar bandeira dizendo uma tecla batida está esperando
SETC; Bandeira ao chamador que KEYVAL é válido
RETURN; Sair do TKEY

;******
; BSTART começa eerom comunicações do SCL, SDA alta insumos.
; Iniciar Gera bit - alto enquanto SCL SDA vai alto / baixo seguido por
; O endereço escravo - a leitura / gravação bit NÃO é enviado para cá.
; Format é --

; BIT 7,6,5,4 Escravo endereço - 1010; BIT 3,2,1 eerom pager

; ENTRY is with SDA,SDL as inputs and set high.
; EXIT with SDA,SCL low and outputs

BSTART
BSF SDPORT,SDA
NOP
BSF SCPORT,SCL
NOP
BCF SDPORT,SDA ; SDA low with SCL high
; This is a start edge
NOP
BCF SCPORT,SCL ; SCL low

; Form the control byte with page address

MOVLW 0x00
MOVWF EESER
CLRC ; Ready for the shift
RLF EESER ; Page select in bits 3,2,1
MOVLW EECONT ; Get the control byte with ls nibble zero
IORWF EESER ; Set up control byte
MOVLW .7 ; Set bit count
MOVWF EECOUNT
EEPUT
RETURN
;******
; BSTOP ends eerom communications. Generates stop bit - SCL
; high while SDA goes LOW/HIGH. Then drop SCL.

BSTOP
BCF SDPORT,SDA ; SDA low
NOP

BSF SCPORT,SCL ; SCL high
NOP

BSF SDPORT,SDA ; SDA high
NOP

BCF SCPORT,SCL ; SCL low
NOP
RETURN ;******
; GETACK gets the ack from the eerom.
; Turns round SDA line and clocks device - exits with EESER clear
; if ack is seen. Eerom is left with SDA/SCL as outputs and low.

GETACK
MOVLW SDAIN ; SDA is input
BANK1
MOVWF TRISE
BANK0
BSF SCPORT,SCL ; SCL high
NOP ; Need to wait up to 4 us
NOP
CLRF EESER ; Assume ack will be seen!
BTFSC SDPORT,SDA ; Test SDA bit for a LOW ack
COMF EESER ; Ack was not seen
BCF SCPORT,SCL ; SCL low
MOVLW SDAOUT ; SDA is output
BANK1
MOVWF TRISE
BANK0
RETURN

;****** ;; READEE/WRITEE reads/writes 16 bytes of ram with eerom page number
; in EEPAGE and the start address in EESTART.

; EEROM 16 byte read on 16 byte address boundary

READEE
BSF FLA,EEREAD ; Flag reading
GOTO WRITEE1

; EEROM 8 byte write on 8 byte address boundary

WRITEE
BCF FLA,EEREAD ; Flag writing
WRITEE1
MOVWF STRCOM ; Save eerom page/address value
MOVLW .16 ; Read/write 16 bytes

;
; Form eerom read start address

EERDWR
MOVWF EEBYTE ; Read/write 16 bytes
MOVFW STRCOM
MOVWF EESTART ; Set eerom start address

; Generate the start bit and the control byte which includes the
; page number

CALL BSTART ; Generate a start and control byte with
; page number (7 bits)
CLRC ; Want to read data but device needs a write
; to accept the word address
EEBIT ; Send the bit to eerom
CALL GETACK ; Check for acknowledge from eerom
BTFSC EESER,0 ; Skip if ack was seen from eerom
GOTO EERDQ ; Error here - ack was not seen

; Set up the start address

MOVFW EECH ; Get the start address
MOVWF EESER ; Shift address from here to eerom
MOVLW 8 ; Set up the bit count
MOVWF EECOUNT
EEPUT ; Clock the address to the eerom
CALL GETACK ; Check for acknowledge from eerom
BTFSC EESER,0 ; Skip if ack was seen from eerom
GOTO EERDQ ; Error here - ack was not seen MOVFW EESTART ; Get the start addresS
MOVWF EESER ; Shift address from here to eerom
MOVLW 8 ; Set up the bit count
MOVWF EECOUNT
EEPUT ; Clock the address to the eerom
CALL GETACK ; Check for acknowledge from eerom
BTFSC EESER,0 ; Skip if ack was seen from eerom
GOTO EERDQ ; Error here - ack was not seen ; Test if read or write and action (read is flagged '1')

BTFSC FLA,EEREAD ; Skip if writing

;
; Read the eerom

GOTO EERD

;******
; Writes bytes from FSR pointed ram to eerom as address in EESTART

; On entry -----

; EEBYTE has the byte count.
; EESTART has the eerom start address.
; fsr points to start of ram area.

; On exit -----

; EESTART is preserved
; EEBYTE is zero unless a bus error occurs when it is set to 1. ; Get a data byte and write to eerom

EEWR MOVFW 0 ; Use FSR to retrieve data byte from ram
MOVWF EESER ; Data to shifter
MOVLW 8 ; Set up the bit count
MOVWF EECOUNT
EEPUT ; Byte to eerom

CALL GETACK ; Check for acknowledge from eerom
BTFSC EESER,0 ; Skip if ack was seen from eerom
GOTO EEWRQ ; Error here - ack was not seen

; Written a byte - test if more bytes to send and action if so

DECF EEBYTE ; Another byte to write?
BZ EEWRX ; Exit if no more bytes to write
INCF FSR ; Move the ram read pointer
GOTO EEWR

; Handle the error state

EEWRQ MOVLW 1
MOVWF EEBYTE ; Flag that a bus error has occured
CALL BSTOP
GOTO EEWRZ1

; All bytes written so terminate the write cycle and wait for eerom
; to be idle.

EEWRX CALL BSTOP ; Send a stop
MOVLW b'00000111' ; Set TMR0 for 1/4 second tick
BANK1
MOVWF OPTION_REG ; and do it
BANK0
MOVLW CLKR-.44 ; 40 gives 11 ms delay
MOVWF TMR0 ; Preset divider
EEWRZ MOVF TMR0,W ; Test for timeout
BNZ EEWRZ ; Loop until timed out
EEWRZ1
RETURN ; Exit back to caller

;******
; EERD reads from the eerom.
; On entry -----
; EEBYTE has the byte count.
; EESTART has the eerom start address.
; On exit -----
; Page 3 has the read data
; EESTART is preserved
; EEBYTE is zero unless a bus error occurs when it is set to 1. EERD
CALL BSTART ; Generating the start condition again!
SETC ; Reading data so tell eerom
EEBIT ; Send the bit to eerom
CALL GETACK ; Check for acknowledge from eerom
BTFSC EESER,0 ; Skip if ack was seen from eerom
GOTO EERDQ ; Error here - ack was not seen

; Eerom is set up for reading - ack data bytes until 8 are read and
; then a stop is sent and read is terminated

EERDB EEGET ; Get the byte from the eerom --
MOVFW EESER ; -- into this reg!
MOVWF 0 ; -- and save at indirect address
DECF EEBYTE ; Count the bytes read from eerom
BZ EERDX ; Exit from reading when all bytes are read

; Another byte to read so ack and loop

BCF SDPORT,SDA ; SDA low is ACK to eerom

MOVLW b'00000000' ; SDA out:
NOP
BSF SCPORT,SCL ; SCL to clock low for ACK to eerom
NOP ; Send ack for 4 us
BCF SCPORT,SCL ; SCL low
INCF FSR ; Move the ram write pointer
GOTO EERDB ; Loop until data block is read

; Handle the error state

EERDQ MOVLW 1
MOVWF EEBYTE ; Flag that a bus error has occured
GOTO EERDX1 ; Jump and exit

; All bytes read so terminate the read cycle.

EERDX CALL BSTOP ; Stop condition to eerom

; On exit, if flag is set, jump return to string send routine

EERDX1
RETURN ; Exit back to caller

;**********************************************************
AFFDISP

MOVFW AAA
MOVWF FSR
MOVFW INDF
MOVWF PORTD
BSF PORTB,CS0
NOP
NOP
BCF PORTB,CS0
INCF FSR
MOVFW INDF
MOVWF PORTD
BSF PORTB,CS1
NOP
NOP
BCF PORTB,CS1
MOVFW AAA
ADDLW 0x10
MOVWF FSR
MOVFW INDF
MOVWF PORTD
BSF PORTB,CS2
NOP
NOP
BCF PORTB,CS2
INCF FSR
MOVFW INDF
MOVWF PORTD
BSF PORTB,CS3
NOP
NOP
BCF PORTB,CS3
MOVFW AAA
ADDLW 0x20
MOVWF FSR
MOVFW INDF
MOVWF PORTD
BSF PORTB,CS4
NOP
NOP
BCF PORTB,CS4
INCF FSR
MOVFW INDF
MOVWF PORTD
BSF PORTB,CS5
NOP
NOP
BCF PORTB,CS5
CALL LCD_DELAY3
INCF AAA
INCF AAA

RETURN
;********************************************************** ;ROTAT
MOVFW CSHIFT
MOVWF ILH
REPEAT
CLRC
RLF INL ; THROUGHT CARRY
RLF INH ; THROUGHT CARRY
DECF ILH
BNZ REPEAT
RETURN

ROTAT2
MOVFW CSHIFT
MOVWF ILH
REPEAT2
CLRC
RRF INH ; THROUGHT CARRY
RRF INL ; THROUGHT CARRY
DECF ILH
BNZ REPEAT2
RETURN

;*********************************************************
DTIME
CALL RTCGET

MOVFW RTCH
ANDLW 0x0F
MOVWF LSDH
RRF RTCH
RRF RTCH
RRF RTCH
RRF RTCH
MOVFW RTCH
ANDLW 0x0F
MOVWF MSDH ;MOVFW RTCM
ANDLW 0x0F
MOVWF LSDM
RRF RTCM
RRF RTCM
RRF RTCM
RRF RTCM
MOVFW RTCM
ANDLW 0x0F
MOVWF MSDM ;MOVFW RTCS
ANDLW 0x0F
MOVWF LSDS
RRF RTCS
RRF RTCS
RRF RTCS
RRF RTCS
MOVFW RTCS
ANDLW 0x0F
MOVWF MSDS

RETURN

;*********************************************************
RECOR
MOVWF KEYBUFF
MOVLW EEFSR
MOVWF FSR
MOVLW 0x30
SUBWF KEYBUFF,0
CALL STRING

MOVLW EEFSR ; Point at start of read/write ram
MOVWF FSR ; Set up the start pointer

MOVFW EECL ; Get PAGE 1 BLOCK 1 identity
CALL WRITEE ; Write the 16 bytes back from the eerom

MOVFW EECL
ADDLW 0x10
ADDCF EECH
MOVWF EECL

CALL LCD_DELAY
CALL LCD_DELAY

RETURN
; *************************** INIT *********************** ;;**********************************************************************
;***** Start program here , Power - ON reset occured
;********************************************************************** ;START ; Power_ON Reset ( Beginning of program)
BANK0 ; Bank 0
CLRF STATUS ; Do Initialization ( Bank 0 )
CLRF INTCON
CLRF PIR1
CLRF T1CON ; RC1 is NOT overridden by TCKO
CLRF NBITS
CLRF KEYTEMP
CLRF KEYBUFF
CLRF FLAG1
CLRF KTMP
CLRF LASTKEY
CLRF EECL
CLRF EECH

MOVLW 0x07

BANK1 ; Bank 1
MOVWF ADCON1
MOVLW 0x80
MOVWF OPTION_REG ;
CLRF PIE1 ; Disable all peripheral interrupts
BANK0 ; Bank 0

CLRF ADCON0
CLRF PORTD ; ALL PORT output should output Low.
CLRF PORTE
CLRF PORTB
CLRF PORTA
BCF SCPORT,SCL

;************** PORT SETUP **************************************

BANK1

; A port setup

MOVLW B'00000000'
MOVWF TRISA

; B port setup

MOVLW b'00000011' ; Set port data directions
MOVWF TRISB

; C PORT SETUP

MOVLW B'00000000' ; SET PORT DATA DIRECTIONS
MOVWF TRISC

; D PORT SETUP

MOVLW B'00000000'
MOVWF TRISD

; E PORT SETUP

MOVLW B'00000000'
MOVWF TRISE
; BSF PIE1,RCIE
BANK0

;******
; Set up timer options
; Timer0 is set for internal, 1/4 ms pre scale
; TIMER1
; TIMER2 is used to debounce the keypad in interrupt ONLY
; It is set for 256 us increment in PR2

MOVLW b'01111111' ; Prescale 16, postscale 16, timer enabled
MOVWF T2CON

; Set miscellaneous flags
CLRF FLAG ;; Initialize the LCD Display Module ;CLRF LCD_CNTL ; ALL PORT output should output low.

DISPLAY_INIT
CALL LCD_DELAY ;
CALL LCD_DELAY ;
CALL LCD_DELAY ;
CALL LCD_DELAY ;
CALL LCD_DELAY ;

MOVLW 0x03 ; Command for 4-bit interface
MOVWF LCD_DATA ;
BSF LCD_CNTL,E ;
NOP
NOP
BCF LCD_CNTL,E ;

CALL LCD_DELAY ;
CALL LCD_DELAY ;
CALL LCD_DELAY ;
CALL LCD_DELAY ;
CALL LCD_DELAY ;

MOVLW 0x03 ; Command for 4-bit interface
MOVWF LCD_DATA ;
BSF LCD_CNTL,E ;
NOP
NOP
BCF LCD_CNTL,E ;

CALL LCD_DELAY ;
CALL LCD_DELAY ;
CALL LCD_DELAY ;
CALL LCD_DELAY ;
CALL LCD_DELAY ;

MOVLW 0x03 ; Command for 4-bit interface
MOVWF LCD_DATA ;
BSF LCD_CNTL,E ;
NOP
NOP
BCF LCD_CNTL,E ;

CALL LCD_DELAY ;
CALL LCD_DELAY ;
CALL LCD_DELAY ;
CALL LCD_DELAY ;
CALL LCD_DELAY ;

MOVLW 0x02 ; Command for 4-bit interface
MOVWF LCD_DATA ;
BSF LCD_CNTL,E ;
NOP
NOP
BCF LCD_CNTL,E ;

CALL LCD_DELAY ;
CALL LCD_DELAY ;
CALL LCD_DELAY ;
CALL LCD_DELAY ;
CALL LCD_DELAY ; ;; Command sequence for 2 lines of 5x7 characters ;CMD_SEQ MOVLW 0x02
MOVWF LCD_DATA
BSF LCD_CNTL,E ;
NOP
NOP
BCF LCD_CNTL,E ;
MOVLW 0x08 ;
MOVWF LCD_DATA ;
BSF LCD_CNTL,E ;
NOP
NOP
BCF LCD_CNTL,E ; ;; Busy Flag should valid after this point ;CALL LCD_DELAY ;
CALL LCD_DELAY ;
CALL LCD_DELAY ;
CALL LCD_DELAY ;
CALL LCD_DELAY ;

MOVLW DISP_OFF ;
CALL SEND_CMD ;
MOVLW CLR_DISP ;
CALL SEND_CMD ;
MOVLW ENTRY_INC ;
CALL SEND_CMD ;
MOVLW DISP_ON_C ;
CALL SEND_CMD ;
MOVLW DD_RAM_ADDR ;
CALL SEND_CMD ;

; Global interrupt enable

BCF INTCON,RBIF ; Cancel keypad just in case
BCF INTCON,INTF
BSF INTCON,INTE
BSF INTCON,PEIE
BSF INTCON,GIE ; Enable all Interrupts

RTCIDLE ; IDLE THE CLOCK INTERFACE

; CLEAR THE DISPLAY IN THIS PLACE SO WE HAVE TO SHIFT 32 ZEROS INTO THE
; ispLSI 2032

BCF PORTC,3
NOP
BSF PORTC,6
CLRF DISPCON
CONTI
BSF PORTC,3
NOP
NOP
BCF PORTC,3
INCF DISPCON
BTFSS DISPCON,5
GOTO CONTI

IDLE
MOVLW EEFSR ; Point at start of read/write ram
MOVWF FSR ; Set up the start pointer

; BCF INTCON,GIE ; Enable all Interrupts

CALL CLEAR_DISP ;

CLRF TTTF
CLRF TTT
CLRF LSDS

MOVLW DD_RAM_ADDR
CALL SEND_CMD

MOVLW .11
CALL STRING2

MOVLW .12
CALL STRING2

MOVLW DD_RAM_AD2
CALL SEND_CMD

MOVLW .13
CALL STRING2

MOVLW .14
CALL STRING2

; BSF INTCON,GIE ; Enable all Interrupts

;--------------------------------------------------------------------------
;WAITING LOOP TO SEE IF THE USER WANT TO PROGRAM NEW DATA INTO THE BILLBOARD
;THE LOOP WILL WAIT ABOUT 8 SECONDS ,IF F8 KEY IS NOT PRESSED IN THIS DELAY
;THEN THE BILLBOARD WILL DISPLAY OLD DATA
;---------------------------------------------------------------------------

CLRF OTYO
CLRF TTT COMEÇARCALL RTCGET ; READ FROM THE REAL TIME CLOCK

BTFSS RTCS,0
GOTO GEN

BTFSC OTYO,0
GOTO TEN

BSF OTYO,0
INCF TTT BENBTFSC TTT,3
GOTO AFF11
GOTO TEN
GEN
BCF OTYO,0

TEN
CALL GETKE1
BNC BEGIN ; Just loop until key found

CALL LCD_DELAY ;
CALL LCD_DELAY ;

MOVLW 0x0A ; F8
SUBWF KTMP,W
BZ DRY

MOVLW 0x09 ; F10
SUBWF KTMP,W
BZ AFF11

GOTO BEGIN
DRY
MOVLW 0xA0
MOVWF DISPCON

DATAEN
CLRF IEE

DATAENTRY

; BCF INTCON,GIE ; Enable all Interrupts

CALL CLEAR_DISP
MOVLW DD_RAM_ADDR ;
CALL SEND_CMD

MOVFW IEE
ADDLW 0x01
CALL STRING2

MOVFW IEE
ADDLW 0x02
CALL STRING2

MOVLW DD_RAM_AD2 ;
CALL SEND_CMD

MOVFW IEE
ADDLW 0x03
CALL STRING2

MOVFW IEE
ADDLW 0x04
CALL STRING2

; BSF INTCON,GIE ; Enable all Interrupts
CLRF COLO

DAE
; CALL GETKE1
; BNC DAE ; Just loop until key found

; Key in W register - parse it

; MOVLW 0xE0
; SUBWF KTMP,W
; BNZ DAE2

TRW
CALL GETKE1
BNC TRW ; Just loop until key found

CALL LCD_DELAY ;
CALL LCD_DELAY ;

MOVLW 0x75 ;UP
SUBWF KTMP,W
BZ TEW

MOVLW 0x72 ;DOWN
SUBWF KTMP,W
BNZ DAE2

MOVLW 0x0A
SUBWF IEE,W
BZ DAE
INCF IEE
INCF IEE
GOTO DATAENTRY

TEW
MOVLW 0x00
SUBWF IEE,W
BZ DAE

DECF IEE
DECF IEE
GOTO DATAENTRY

DAE2
MOVLW 0x05 ; F1 : SO PROGRAM THE RTCCLOCK WITH NEW TIME
SUBWF KTMP,W ; IN THE FORMAT HHMMSS
BZ PTIME

MOVLW 0x06 ; F2 : PROGRAM THE BILLBOARD WITH DATA THAT IS
SUBWF KTMP,W ; DISPLAYED FROM RIGHT TO LEFT (NOTE:NUMBER OF
BZ PRL ; CHARACTERS MUST BE n*16 IF NOT THE SYSTEM
; WILL COMPLETE IT WITH SPACE)

MOVLW 0x04 ; F3 : PROGRAM THE BILLBOARD WITH DATA THAT IS
SUBWF KTMP,W ; DISPLAYED FROM DOWN TO UP (NOTE:THIS MUST BE
BZ PDU ; A 12 CHARACTERS MESSAGE)
; THIS FUNCTION MAY BE PROGRAMMED MANY TIME AS
; WE WANT

MOVLW 0x0C ; F4 : PROGRAM THE BILLBOARD WITH DATA THAT IS
SUBWF KTMP,W ; DISPLAYED FROM LEFT TO RIGHT LIKE OPENING
BZ PLR ; A CURTAIN ON A MESSAGE(NOTE:THIS MUST BE A 12
; CHARACTERS MESSAGE ALSO)
; THIS FUNCTION MAY BE PROGRAMMED MANY TIME AS
; WE WANT

MOVLW 0x09 ; F10
SUBWF KTMP,W
BZ AFF11

MOVLW 0x03 ; F5 : READ THE REAL TIME CLOCK
SUBWF KTMP,W
BNZ DAE

;***********************************************************************

RRTC
; BCF INTCON,GIE ; Enable all Interrupts

CALL CLEAR_DISP
MOVLW DD_RAM_ADDR ;
CALL SEND_CMD

MOVLW .10
CALL STRING2
; BSF INTCON,GIE ; Enable all Interrupts

BACK
CALL DTIME

CALL DISPLAY
CALL LCD_DELAY
CALL LCD_DELAY

CALL GETKE1
BNC BACK ; Just loop until key found

GOTO DATAENTRY

;***********************************************************************

PLR
; BCF INTCON,GIE ; Enable all Interrupts
CLRF TTT
CALL CLEAR_DISP
MOVLW DD_RAM_ADDR
CALL SEND_CMD

MOVLW .8
CALL STRING2

MOVLW DD_RAM_AD2
CALL SEND_CMD

; BSF INTCON,GIE ; Enable all Interrupts

MOVFW DISPCON
MOVWF FSR
MOVLW 0x02
MOVWF INDF
INCF FSR
MOVFW FSR
MOVWF DISPCON

GOTO WAI

;***********************************************************************

PTIME
; BCF INTCON,GIE ; Enable all Interrupts

CALL CLEAR_DISP
MOVLW DD_RAM_ADDR
CALL SEND_CMD

MOVLW .2
CALL STRING2

MOVLW DD_RAM_AD2
CALL SEND_CMD

; BSF INTCON,GIE ; Enable all Interrupts

ID1
CALL GETKE1
BNC ID1
MOVFW KEYBUFF
CALL SEND_CHAR
MOVFW KEYBUFF
ANDLW 0x0F
MOVWF MSDH

ID2
CALL GETKE1
BNC ID2 Sorry, but you need login in to view this attachment
 

Welcome to EDABoard.com

Sponsor

Back
Top