I
IMSlo
Guest
Quelqu'un peut-il me dire pourquoi le code ci-joint ne fonctionnera pas sur un PIC 16F88.Il s'agit d'une simple minuterie de temps écoulé s'exécute sur un timer0 interrompre et afficher l'heure sur un X 2 16 LCD.J'ai téléchargé le code à partir de plusieurs endroits et mettez-la ensemble.Avec les modifications mineures nécessaire, le code sera exécuté pendant des jours sur une 16f627a.Sur les 88 elle se déroulera quelques secondes, zéro jusqu'à exécuter quelques secondes, jusqu'à zéro et peut-être même lancer quelques minutes et jusqu'à zéro.Il finira par cesser de fumer quelques fois avec l'affichage indiquant les numéros et encore, avec le blanc d'affichage.Je suis au bout de mon latin.S'il vous plaît ignorer les commentaires, car ils mai mai ou ne pas être juste.Toute aide serait appréciée.
;************************************************* *****************************
; Zéro défaut ONE SECOND TIMER
; (Roman Noir 2001, domaine public, l'utiliser comme vous le souhaitez)
;
;
;************************************************* *****************************;================================================= =============================
; Processeur définies;
LIST p = 16F88, dites ce que l'assembleur de puces, nous utilisons
include "P16F88.inc"; inclure les valeurs par défaut de la puce
Errorlevel 0, -302; supprimer les messages de sélection de banque;================================================= =============================
; MPLAB stuff here
LISTE B = 5, n = 97, = t ON, st = OFF
; Onglets annonce absolu = 5, lignes = 97, l'assiette de longues files = ON, table des symboles = OFF
__CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF _PWRTE_ON & & & _WDT_OFF _INTRC_IO
; Programme de Configuration Register 2
__CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF
LCD_PORT Equ PORTB
LCD_TRIS Equ TRISB
LCD_RS Equ 0x04; ligne de contrôle LCD
LCD_RW Equ 0x06
LCD_E Equ 0x07;================================================= =============================
; Variables ici
CBLOCK 0x20
sec
sec10
min
min10
hr
HR10
bres_hi; Salut octet de notre 24bit variable
bres_mid; byte mi
bres_lo; lo octet
; (Il nous faut seulement 3 octets pour ce système)
status_temp, utilisé pour faire une interruption de service
w_temp, utilisé pour faire une interruption de service
templcd; magasin temp pour le mode 4 bits
templcd2
count; utilisés dans les routines en boucle
count1, utilisé dans le retard de routine
nbval, utilisé dans le retard de routine
countb, utilisé dans le retard de routine
Oldtime
ENDC;================================================= =============================
; Le code ici
org 0x000; série de base de mémoire programme à Vector réinitialiser 0x000
réinitialiser
setup Goto, mis en place ints et des trucs du port
org 0x004; vecteur d'interruption, le code du gestionnaire int vient ensuite.
;================================================= =============================
;************************************************* *****************************
; Gestionnaire d'interruption (fonctionne ce code chaque timer0 interruption)
;************************************************* *****************************
;
;------------------
int_handler
;
;------------------
;-------------------------------------------------
D'abord nous préservons W et le statut registre
w_temp movwf; mettre hors cours le contenu des registres W
movf STATUS, w; registre d'état de se déplacer dans W registre
status_temp movwf; mettre hors contenu du registre d'état
;-------------------------------------------------
; Note!nous recevons ici toutes les 256 instructions, nous
; Peut maintenant faire de notre système d'un calendrier spécial seconde.
; Il est composé de trois étapes principales;
; * Soustraire 256 chefs d'accusation de notre 24bit variable
; * Teste si nous avons atteint le point de consigne
, * Le cas échéant, ajouter des chiffres de 1.000.000 à 24bit variables et générer l'événement.
;-------------------------------------------------
, * 24 bits optimisée soustraire ici
; Ceci est fait avec les instructions minimales.
; On soustrait 256 participants de la variable 24bit
; Par décrémentation juste l'octet de mi-parcours.
tstf bres_mid; premier test pour la mi == 0
skpnz; = NZ aucun dépassement de capacité nécessaire
DECF bres_hi, f; z, est donc sous-alimentation, de sorte dec le MSB
bres_mid decfsz, f; dec le milieu byte (soustraire 256)
; Maintenant le montant intégral 24 bits optimisée soustraire est fait!
, Ce qui est environ 4 fois plus rapide qu'un "bon"
; 24bit soustraire.
goto int_exit; nz, si définitivement pas une seconde pour le moment.
; Dans la plupart des cas, l'int complet prend
; Seulement 16 instructions.
;------------------------
; * Teste si nous avons atteint une seconde.
; Obtient seulement ici quand mi == 0, il peut être une seconde.
; Vers celle-ci ne reçoit que 1 pour 256 fois.
(Ceci est notre critère de optimisée)
, Il sera là quand bres_mid == 0.
tstf bres_hi, trop Salut essai pour zéro
skpz; z = les deux salut et le milieu sont à zéro, est d'une seconde!
goto int_exit; nz, donc pas une seconde pour le moment.
;-------------------------------------------------
; Se présente ne peut ici si nous avons atteint une seconde.
, Maintenant nous pouvons générer notre seul second événement, comme ajouter des
; Une seconde à notre horloge ou autre chose.
; (Dans cet exemple, nous basculer une LED)
; L'autre chose que nous devons faire est d'ajouter 1.000.000 chiffres
; À notre 24bit variable et tout recommencer.
;-------------------------------------------------
; Ajouter les 1.000.000 premiers comtes.
; Une seconde = 1.000.000 = 0F 42 40 (en hexadécimal)
; Comme nous le savons Salut == 0 à la mi == 0 ce qui rend très vite.
; Il s'agit d'un 24 bits optimisée ajouter, parce que nous pouvons
; Suffit de charger les deux octets haut et ont seulement besoin de le faire
; Un plus réel sur l'octet bas.Cela est beaucoup plus rapide
; D'un "bon 24bit ajouter.
movlw 0x0F; valeur obtenir msb
movwf bres_hi; charge dans msb
movlw 0x42; obtenir une valeur moyenne
movwf bres_mid; charge en milieu
movlw 0x40; valeur LSB d'ajouter
addwf bres_lo, f; l'ajouter au reste déjà en LSB
skpnc; nc = pas de débordement, de manière mi-parcours est toujours OK
INCF bres_mid, f, c, de sorte lsb débordé, de sorte à mi inc
, Ce qui est optimisé et s'appuie sur le milieu étant connus
Et que le milieu débordera pas d'une inc.
; That's it!Nos 24bit optimisé ajouter n'est fait,
, Ce qui est environ deux fois plus rapide comme un "vrai"
; 24bit ajouter.
;-------------------------
; Maintenant nous ne «l'événement» que nous faisons tous une seconde.
; Note!Pour cet exemple nous basculer une LED, ce qui
; Donnera une led et qui se trouve sur une seconde
Et à pied pour une seconde.
; Ajouter votre propre code ici pour votre tout-deuxième événement.
; Note!Mon conduit est sur Porta, 3
, Votre être amené mai sur un axe différent.
; Movlw b'00001000 '; masque de bit 3
; Xorwf PORTB, f; bascule PORTA, bit3 (activer
/ désactiver les LED)
movlw sec; point à inscrire sec
movwf FSR
newdigit: INCF INDF, f; chiffres actuels up one
movlw sec; obtenir différence entre sec et FSR
subwf FSR, W
Sethi appel; utiliser pour obtenir la limite haute 1
subwf INDF, W; atteint ce nombre encore inscrit?
btfss STATUS, Z; Sauter par-dessus si oui
goto int_exit else isr sortie
clrf INDF; série actuelle chiffre à 0
INCF FSR, f; point à la prochaine chiffres
goto newdigit, non, incrémenter le chiffre suivant;-------------------------------------------------
, Maintenant notre seul deuxième événement est terminé, nous pouvons quitter le
; Gestionnaire d'interruption.
;-------------------------------------------------
Et enfin nous restaurer w et registres de l'état.
; Efface également TMRO int flag maintenant, nous sommes finis.
int_exit
BCF INTCON, 2; réinitialiser l'indicateur d'interruption tmr0
bcf STATUS, Z
status_temp movf, W; récupérer des copies du registre d'état
movwf STATUS; restaurer statut de pré-rapport de recherche internationale enregistrer le contenu
swapf w_temp, f
w_temp swapf, W; restaurer la pré-ISR le contenu des registres W
retfie; retour d'interruption
;------------------------------------------------- -----------------------------
;------------------------------------------------- ------------------------;
; Limite haute 1 des chiffres à la position de W;
;------------------------------------------------- ------------------------;
Sethi:
addwf PCL, f
dt H'A ', H'6', H'A ', H'6', H'A ', H'A';************************************************* *****************************
; SETUP (exécute ce qu'une seule fois au démarrage)
;************************************************* *****************************;
;------------------
setup; label goto
;------------------
movlw B'01100000 '; 4Mhz = B'01100000'
banksel OSCCON
movwf OSCCON
banksel 0
, Attendez que la CVMO se stabilise
lp:
btfss OSCCON, 2
Aller au LP;-------------------------------------------------
; Note!16F84 version.
; Note!Nous mettons en place des périphériques et des directions portuaires.
, Ce qui devra être changé pour les différents pays insulaires du Pacifique.
;-------------------------------------------------
, Ou l'option de configuration
movlw b'00001000 ';
; ------- X;
; Note!Nous avons mis le prédiviseur au WDT, de sorte timer0; N'a AUCUN prédiviseur et débordera toutes les 256
, Des instructions et de faire une interruption.
;OPTION_REG banksel, allez banque reg bon
movwf OPTION_REG; Charger des données dans OPTION_REG
banksel 0; retour à la banque normales 0
;-------------------------------------------------
; PORTB pins configuration direction
; 1 = input, 0 = sortie
clrf PORTB;
;
movlw b'00000000 '; tous PORTB 8 sont sorties
;
banksel TRISB, allez banque reg bon
movwf TRISB; envoyer masque pour PORTB
banksel 0; retour à la banque reg normale
;-------------------------------------------------
; PORTA Pins configuration direction
; 1 = input, 0 = sortie
clrf PORTA;
;
movlw b'00000000 '; tous Porta 5 sont sorties,
; (Avec 16F84 Porta a seulement inférieure à 5 bits)
;
banksel TRISA, allez banque reg bon
movwf TRISA; envoyer masque pour Porta
banksel 0; retour à la banque reg normale
;-------------------------------------------------
; INTCON configuration
;
Car cet exemple de code, nous permettons à l'timer0
; Débordement de l'interrompre.
;
; Permettre interrompt dernier
; Interrompre le programme d'installation
movlw b'11100000 '; GIE = sur toie = ON (timer0 int overflow)
; Bsf INTCON, 7
; Bsf INTCON, 6
; Bsf INTCON, 5
banksel INTCON
movwf INTCON
banksel 0
clrf sec
clrf sec10
clrf min
clrf min10
clrf hr
clrf HR10
;-------------------------------------------------
; Note!Maintenant, le matériel est mis en place nous avons besoin de charger le
; D'abord compter pendant une seconde dans nos 24bit BRES variable.
;-------------------------------------------------
; Note!Cet exemple utilise 4 Horloge MHz, qui est
; 1.000.000 comptes par seconde.
;
; Nous avons besoin d'une période de 1 seconde, nous devons donc de charge
; 1000000, chiffres à chaque fois.
; 1,000,000 = 0F 42 40 (en hexadécimal)
;
; Nous avons aussi besoin d'ajouter 256 chefs d'accusation pour la première fois,
; Donc nous suffit d'ajouter 1 à la mi-octet.
Check débordement de la mi si nécessaire.
, Ici on charge la variable de 24 bits.
movlw 0x0F; valeur obtenir msb
movwf bres_hi; mettre en Salut
movlw 0x42 1; obtenir la valeur moyenne (note nous avons ajouté 1 à celle-ci)
movwf bres_mid; mettre en mi
movlw 0x40; obtenir la valeur LSB
movwf bres_lo; mettre en mi
, appel lcd_initEt maintenant l'installation terminée, on peut commencer l'exécution.
;-------------------------------------------------
Goto Main; démarrage du programme principal
;------------------------------------------------- -----------------------------
; Initialiser LCD
Lcd_init Delay100 appel d'attendre pour LCD de régler
movlw 0x20; Set 4 bit de mode
appel LCD_Cmd
movlw 0x28; Set changement d'affichage
appel LCD_Cmd
movlw 0x06; Réglez le mode d'affichage de caractères
appel LCD_Cmd
movlw 0x0c; l'écran étant réglée sur la commutation et de commande du curseur
appel LCD_Cmd; curseur Partez
LCD_Clr appel; affichage clair
retlw 0x00
; Commande set de routine
LCD_Cmd movwf templcd
templcd swapf, W; envoyer grignoter supérieure
0x0f andlw; claire supérieure 4 bits de W
movwf LCD_PORT
BCF LCD_PORT, LCD_RS; ligne RS à 1
Pulse_e appel, le pouls de la ligne E élevés
templcd movf, W; envoyer inférieur grignoter
0x0f andlw; claire supérieure 4 bits de W
movwf LCD_PORT
BCF LCD_PORT, LCD_RS; ligne RS à 1
Pulse_e appel, le pouls de la ligne E élevés
Delay5 appel
retlw 0x00
LCD_CharD addlw 0x30; ajouter 0x30 à convertir en ASCII
LCD_Char movwf templcd
templcd swapf, W; envoyer grignoter supérieure
0x0f andlw; claire supérieure 4 bits de W
movwf LCD_PORT
bsf LCD_PORT, LCD_RS; ligne RS à 1
Pulse_e appel, le pouls de la ligne E élevés
templcd movf, W; envoyer inférieur grignoter
0x0f andlw; claire supérieure 4 bits de W
movwf LCD_PORT
bsf LCD_PORT, LCD_RS; ligne RS à 1
Pulse_e appel, le pouls de la ligne E élevés
Delay5 appel
retlw 0x00
LCD_Line1 movlw 0x80; passer à la 1ère rangée, première colonne
appel LCD_Cmd
retlw 0x00
LCD_Line2 movlw 0xc0; passer à la 2e rangée, première colonne
appel LCD_Cmd
retlw 0x00
LCD_Line1W addlw 0x80; passer à la 1ère rangée, colonne W
appel LCD_Cmd
retlw 0x00
LCD_Line2W addlw 0xc0; passer à la 2e rangée, colonne W
appel LCD_Cmd
retlw 0x00
LCD_CurOn movlw 0x0D; l'écran étant réglée sur la commutation et de commande du curseur
appel LCD_Cmd
retlw 0x00
LCD_CurOff movlw 0x0c; l'écran étant réglée sur la commutation et de commande du curseur
appel LCD_Cmd
retlw 0x00
LCD_Clr movlw 0x01; affichage Clear
appel LCD_Cmd
retlw 0x00
; LCD_HEX movwf tmp1
; Swapf tmp1, w
; Andlw 0x0f
, Appel HEX_Table
, Appel LCD_Char
; Movf tmp1, w
; Andlw 0x0f
, Appel HEX_Table
, Appel LCD_Char
; Retlw 0x00
Delay255 movlw 0xff; retard 255 ms
goto d0
Delay100 movlw d'100 '; 100 ms de retard
goto d0
Delay50 movlw d'50 '; 50 ms de retard
goto d0
Delay20 movlw d'20 'de retard 20mS
goto d0
Delay5 movlw 0x05; délai 5.000 ms (4 Horloge MHz)
d0 movwf count1
d1 movlw 0xC7; retard 1mS
movwf nbval
movlw 0x01
movwf countb
Delay_0
decfsz nbval, f
goto $ 2
decfsz countb, f
goto Delay_0
decfsz count1, f
goto d1
retlw 0x00
Pulse_e bsf LCD_PORT, LCD_E
nop
BCF LCD_PORT, LCD_E
retlw 0x00
; fin de routines LCD
DispTime
MOVLW 0x04
APPEL LCD_Line1W
movf HR10, w
APPEL LCD_CharD
movf h, w
APPEL LCD_CharD
Movlw ":"
APPEL LCD_Char
movf min10, w
APPEL LCD_CharD
movf min, W
APPEL LCD_CharD
Movlw ":"
APPEL LCD_Char
movf sec10, 10
APPEL LCD_CharD
movf w sec,
APPEL LCD_CharD
RETOUR;************************************************* ****************************;************************************************* *****************************
; MAIN (boucle du programme principal)
;************************************************* *****************************
;
;------------------
principale; label goto
;------------------
appel lcd_init
;-------------------------------------------------
; Note!Cet exemple utilise le trop-plein timer0 interrompre.
; Ce sera interrompre notre programme principal de toutes les 256 instructions
, Et ne le système de minuterie une seconde.
;-------------------------------------------------
main_loop;
Oldtime movf, W; Oldtime est la même que la SEC?
subwf sec, W
btfsc STATUS, Z, sinon, passez sur la prochaine instruction
main_loop Goto, continuer d'autre vérification
appel dispTime; SEC a changé, afficher l'heure
movf sec, W; faire sec et oldsec les mêmes
movwf Oldtime
, Ou les appels vers les pièces du programme principal.
; L'interruption fait tout le stuff une minuterie seconde.
; Stuff
; Stuff
; Stuff
; Stuff
;-------------------------------------------------
goto main_loop; continuer à courir le code principal.
;------------------------------------------------- -----------------------------;================================================= =============================
fin, pas de code après ce point.
;================================================= =============================
;************************************************* *****************************
; Zéro défaut ONE SECOND TIMER
; (Roman Noir 2001, domaine public, l'utiliser comme vous le souhaitez)
;
;
;************************************************* *****************************;================================================= =============================
; Processeur définies;
LIST p = 16F88, dites ce que l'assembleur de puces, nous utilisons
include "P16F88.inc"; inclure les valeurs par défaut de la puce
Errorlevel 0, -302; supprimer les messages de sélection de banque;================================================= =============================
; MPLAB stuff here
LISTE B = 5, n = 97, = t ON, st = OFF
; Onglets annonce absolu = 5, lignes = 97, l'assiette de longues files = ON, table des symboles = OFF
__CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF _PWRTE_ON & & & _WDT_OFF _INTRC_IO
; Programme de Configuration Register 2
__CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF
LCD_PORT Equ PORTB
LCD_TRIS Equ TRISB
LCD_RS Equ 0x04; ligne de contrôle LCD
LCD_RW Equ 0x06
LCD_E Equ 0x07;================================================= =============================
; Variables ici
CBLOCK 0x20
sec
sec10
min
min10
hr
HR10
bres_hi; Salut octet de notre 24bit variable
bres_mid; byte mi
bres_lo; lo octet
; (Il nous faut seulement 3 octets pour ce système)
status_temp, utilisé pour faire une interruption de service
w_temp, utilisé pour faire une interruption de service
templcd; magasin temp pour le mode 4 bits
templcd2
count; utilisés dans les routines en boucle
count1, utilisé dans le retard de routine
nbval, utilisé dans le retard de routine
countb, utilisé dans le retard de routine
Oldtime
ENDC;================================================= =============================
; Le code ici
org 0x000; série de base de mémoire programme à Vector réinitialiser 0x000
réinitialiser
setup Goto, mis en place ints et des trucs du port
org 0x004; vecteur d'interruption, le code du gestionnaire int vient ensuite.
;================================================= =============================
;************************************************* *****************************
; Gestionnaire d'interruption (fonctionne ce code chaque timer0 interruption)
;************************************************* *****************************
;
;------------------
int_handler
;
;------------------
;-------------------------------------------------
D'abord nous préservons W et le statut registre
w_temp movwf; mettre hors cours le contenu des registres W
movf STATUS, w; registre d'état de se déplacer dans W registre
status_temp movwf; mettre hors contenu du registre d'état
;-------------------------------------------------
; Note!nous recevons ici toutes les 256 instructions, nous
; Peut maintenant faire de notre système d'un calendrier spécial seconde.
; Il est composé de trois étapes principales;
; * Soustraire 256 chefs d'accusation de notre 24bit variable
; * Teste si nous avons atteint le point de consigne
, * Le cas échéant, ajouter des chiffres de 1.000.000 à 24bit variables et générer l'événement.
;-------------------------------------------------
, * 24 bits optimisée soustraire ici
; Ceci est fait avec les instructions minimales.
; On soustrait 256 participants de la variable 24bit
; Par décrémentation juste l'octet de mi-parcours.
tstf bres_mid; premier test pour la mi == 0
skpnz; = NZ aucun dépassement de capacité nécessaire
DECF bres_hi, f; z, est donc sous-alimentation, de sorte dec le MSB
bres_mid decfsz, f; dec le milieu byte (soustraire 256)
; Maintenant le montant intégral 24 bits optimisée soustraire est fait!
, Ce qui est environ 4 fois plus rapide qu'un "bon"
; 24bit soustraire.
goto int_exit; nz, si définitivement pas une seconde pour le moment.
; Dans la plupart des cas, l'int complet prend
; Seulement 16 instructions.
;------------------------
; * Teste si nous avons atteint une seconde.
; Obtient seulement ici quand mi == 0, il peut être une seconde.
; Vers celle-ci ne reçoit que 1 pour 256 fois.
(Ceci est notre critère de optimisée)
, Il sera là quand bres_mid == 0.
tstf bres_hi, trop Salut essai pour zéro
skpz; z = les deux salut et le milieu sont à zéro, est d'une seconde!
goto int_exit; nz, donc pas une seconde pour le moment.
;-------------------------------------------------
; Se présente ne peut ici si nous avons atteint une seconde.
, Maintenant nous pouvons générer notre seul second événement, comme ajouter des
; Une seconde à notre horloge ou autre chose.
; (Dans cet exemple, nous basculer une LED)
; L'autre chose que nous devons faire est d'ajouter 1.000.000 chiffres
; À notre 24bit variable et tout recommencer.
;-------------------------------------------------
; Ajouter les 1.000.000 premiers comtes.
; Une seconde = 1.000.000 = 0F 42 40 (en hexadécimal)
; Comme nous le savons Salut == 0 à la mi == 0 ce qui rend très vite.
; Il s'agit d'un 24 bits optimisée ajouter, parce que nous pouvons
; Suffit de charger les deux octets haut et ont seulement besoin de le faire
; Un plus réel sur l'octet bas.Cela est beaucoup plus rapide
; D'un "bon 24bit ajouter.
movlw 0x0F; valeur obtenir msb
movwf bres_hi; charge dans msb
movlw 0x42; obtenir une valeur moyenne
movwf bres_mid; charge en milieu
movlw 0x40; valeur LSB d'ajouter
addwf bres_lo, f; l'ajouter au reste déjà en LSB
skpnc; nc = pas de débordement, de manière mi-parcours est toujours OK
INCF bres_mid, f, c, de sorte lsb débordé, de sorte à mi inc
, Ce qui est optimisé et s'appuie sur le milieu étant connus
Et que le milieu débordera pas d'une inc.
; That's it!Nos 24bit optimisé ajouter n'est fait,
, Ce qui est environ deux fois plus rapide comme un "vrai"
; 24bit ajouter.
;-------------------------
; Maintenant nous ne «l'événement» que nous faisons tous une seconde.
; Note!Pour cet exemple nous basculer une LED, ce qui
; Donnera une led et qui se trouve sur une seconde
Et à pied pour une seconde.
; Ajouter votre propre code ici pour votre tout-deuxième événement.
; Note!Mon conduit est sur Porta, 3
, Votre être amené mai sur un axe différent.
; Movlw b'00001000 '; masque de bit 3
; Xorwf PORTB, f; bascule PORTA, bit3 (activer
/ désactiver les LED)
movlw sec; point à inscrire sec
movwf FSR
newdigit: INCF INDF, f; chiffres actuels up one
movlw sec; obtenir différence entre sec et FSR
subwf FSR, W
Sethi appel; utiliser pour obtenir la limite haute 1
subwf INDF, W; atteint ce nombre encore inscrit?
btfss STATUS, Z; Sauter par-dessus si oui
goto int_exit else isr sortie
clrf INDF; série actuelle chiffre à 0
INCF FSR, f; point à la prochaine chiffres
goto newdigit, non, incrémenter le chiffre suivant;-------------------------------------------------
, Maintenant notre seul deuxième événement est terminé, nous pouvons quitter le
; Gestionnaire d'interruption.
;-------------------------------------------------
Et enfin nous restaurer w et registres de l'état.
; Efface également TMRO int flag maintenant, nous sommes finis.
int_exit
BCF INTCON, 2; réinitialiser l'indicateur d'interruption tmr0
bcf STATUS, Z
status_temp movf, W; récupérer des copies du registre d'état
movwf STATUS; restaurer statut de pré-rapport de recherche internationale enregistrer le contenu
swapf w_temp, f
w_temp swapf, W; restaurer la pré-ISR le contenu des registres W
retfie; retour d'interruption
;------------------------------------------------- -----------------------------
;------------------------------------------------- ------------------------;
; Limite haute 1 des chiffres à la position de W;
;------------------------------------------------- ------------------------;
Sethi:
addwf PCL, f
dt H'A ', H'6', H'A ', H'6', H'A ', H'A';************************************************* *****************************
; SETUP (exécute ce qu'une seule fois au démarrage)
;************************************************* *****************************;
;------------------
setup; label goto
;------------------
movlw B'01100000 '; 4Mhz = B'01100000'
banksel OSCCON
movwf OSCCON
banksel 0
, Attendez que la CVMO se stabilise
lp:
btfss OSCCON, 2
Aller au LP;-------------------------------------------------
; Note!16F84 version.
; Note!Nous mettons en place des périphériques et des directions portuaires.
, Ce qui devra être changé pour les différents pays insulaires du Pacifique.
;-------------------------------------------------
, Ou l'option de configuration
movlw b'00001000 ';
; ------- X;
; Note!Nous avons mis le prédiviseur au WDT, de sorte timer0; N'a AUCUN prédiviseur et débordera toutes les 256
, Des instructions et de faire une interruption.
;OPTION_REG banksel, allez banque reg bon
movwf OPTION_REG; Charger des données dans OPTION_REG
banksel 0; retour à la banque normales 0
;-------------------------------------------------
; PORTB pins configuration direction
; 1 = input, 0 = sortie
clrf PORTB;
;
movlw b'00000000 '; tous PORTB 8 sont sorties
;
banksel TRISB, allez banque reg bon
movwf TRISB; envoyer masque pour PORTB
banksel 0; retour à la banque reg normale
;-------------------------------------------------
; PORTA Pins configuration direction
; 1 = input, 0 = sortie
clrf PORTA;
;
movlw b'00000000 '; tous Porta 5 sont sorties,
; (Avec 16F84 Porta a seulement inférieure à 5 bits)
;
banksel TRISA, allez banque reg bon
movwf TRISA; envoyer masque pour Porta
banksel 0; retour à la banque reg normale
;-------------------------------------------------
; INTCON configuration
;
Car cet exemple de code, nous permettons à l'timer0
; Débordement de l'interrompre.
;
; Permettre interrompt dernier
; Interrompre le programme d'installation
movlw b'11100000 '; GIE = sur toie = ON (timer0 int overflow)
; Bsf INTCON, 7
; Bsf INTCON, 6
; Bsf INTCON, 5
banksel INTCON
movwf INTCON
banksel 0
clrf sec
clrf sec10
clrf min
clrf min10
clrf hr
clrf HR10
;-------------------------------------------------
; Note!Maintenant, le matériel est mis en place nous avons besoin de charger le
; D'abord compter pendant une seconde dans nos 24bit BRES variable.
;-------------------------------------------------
; Note!Cet exemple utilise 4 Horloge MHz, qui est
; 1.000.000 comptes par seconde.
;
; Nous avons besoin d'une période de 1 seconde, nous devons donc de charge
; 1000000, chiffres à chaque fois.
; 1,000,000 = 0F 42 40 (en hexadécimal)
;
; Nous avons aussi besoin d'ajouter 256 chefs d'accusation pour la première fois,
; Donc nous suffit d'ajouter 1 à la mi-octet.
Check débordement de la mi si nécessaire.
, Ici on charge la variable de 24 bits.
movlw 0x0F; valeur obtenir msb
movwf bres_hi; mettre en Salut
movlw 0x42 1; obtenir la valeur moyenne (note nous avons ajouté 1 à celle-ci)
movwf bres_mid; mettre en mi
movlw 0x40; obtenir la valeur LSB
movwf bres_lo; mettre en mi
, appel lcd_initEt maintenant l'installation terminée, on peut commencer l'exécution.
;-------------------------------------------------
Goto Main; démarrage du programme principal
;------------------------------------------------- -----------------------------
; Initialiser LCD
Lcd_init Delay100 appel d'attendre pour LCD de régler
movlw 0x20; Set 4 bit de mode
appel LCD_Cmd
movlw 0x28; Set changement d'affichage
appel LCD_Cmd
movlw 0x06; Réglez le mode d'affichage de caractères
appel LCD_Cmd
movlw 0x0c; l'écran étant réglée sur la commutation et de commande du curseur
appel LCD_Cmd; curseur Partez
LCD_Clr appel; affichage clair
retlw 0x00
; Commande set de routine
LCD_Cmd movwf templcd
templcd swapf, W; envoyer grignoter supérieure
0x0f andlw; claire supérieure 4 bits de W
movwf LCD_PORT
BCF LCD_PORT, LCD_RS; ligne RS à 1
Pulse_e appel, le pouls de la ligne E élevés
templcd movf, W; envoyer inférieur grignoter
0x0f andlw; claire supérieure 4 bits de W
movwf LCD_PORT
BCF LCD_PORT, LCD_RS; ligne RS à 1
Pulse_e appel, le pouls de la ligne E élevés
Delay5 appel
retlw 0x00
LCD_CharD addlw 0x30; ajouter 0x30 à convertir en ASCII
LCD_Char movwf templcd
templcd swapf, W; envoyer grignoter supérieure
0x0f andlw; claire supérieure 4 bits de W
movwf LCD_PORT
bsf LCD_PORT, LCD_RS; ligne RS à 1
Pulse_e appel, le pouls de la ligne E élevés
templcd movf, W; envoyer inférieur grignoter
0x0f andlw; claire supérieure 4 bits de W
movwf LCD_PORT
bsf LCD_PORT, LCD_RS; ligne RS à 1
Pulse_e appel, le pouls de la ligne E élevés
Delay5 appel
retlw 0x00
LCD_Line1 movlw 0x80; passer à la 1ère rangée, première colonne
appel LCD_Cmd
retlw 0x00
LCD_Line2 movlw 0xc0; passer à la 2e rangée, première colonne
appel LCD_Cmd
retlw 0x00
LCD_Line1W addlw 0x80; passer à la 1ère rangée, colonne W
appel LCD_Cmd
retlw 0x00
LCD_Line2W addlw 0xc0; passer à la 2e rangée, colonne W
appel LCD_Cmd
retlw 0x00
LCD_CurOn movlw 0x0D; l'écran étant réglée sur la commutation et de commande du curseur
appel LCD_Cmd
retlw 0x00
LCD_CurOff movlw 0x0c; l'écran étant réglée sur la commutation et de commande du curseur
appel LCD_Cmd
retlw 0x00
LCD_Clr movlw 0x01; affichage Clear
appel LCD_Cmd
retlw 0x00
; LCD_HEX movwf tmp1
; Swapf tmp1, w
; Andlw 0x0f
, Appel HEX_Table
, Appel LCD_Char
; Movf tmp1, w
; Andlw 0x0f
, Appel HEX_Table
, Appel LCD_Char
; Retlw 0x00
Delay255 movlw 0xff; retard 255 ms
goto d0
Delay100 movlw d'100 '; 100 ms de retard
goto d0
Delay50 movlw d'50 '; 50 ms de retard
goto d0
Delay20 movlw d'20 'de retard 20mS
goto d0
Delay5 movlw 0x05; délai 5.000 ms (4 Horloge MHz)
d0 movwf count1
d1 movlw 0xC7; retard 1mS
movwf nbval
movlw 0x01
movwf countb
Delay_0
decfsz nbval, f
goto $ 2
decfsz countb, f
goto Delay_0
decfsz count1, f
goto d1
retlw 0x00
Pulse_e bsf LCD_PORT, LCD_E
nop
BCF LCD_PORT, LCD_E
retlw 0x00
; fin de routines LCD
DispTime
MOVLW 0x04
APPEL LCD_Line1W
movf HR10, w
APPEL LCD_CharD
movf h, w
APPEL LCD_CharD
Movlw ":"
APPEL LCD_Char
movf min10, w
APPEL LCD_CharD
movf min, W
APPEL LCD_CharD
Movlw ":"
APPEL LCD_Char
movf sec10, 10
APPEL LCD_CharD
movf w sec,
APPEL LCD_CharD
RETOUR;************************************************* ****************************;************************************************* *****************************
; MAIN (boucle du programme principal)
;************************************************* *****************************
;
;------------------
principale; label goto
;------------------
appel lcd_init
;-------------------------------------------------
; Note!Cet exemple utilise le trop-plein timer0 interrompre.
; Ce sera interrompre notre programme principal de toutes les 256 instructions
, Et ne le système de minuterie une seconde.
;-------------------------------------------------
main_loop;
Oldtime movf, W; Oldtime est la même que la SEC?
subwf sec, W
btfsc STATUS, Z, sinon, passez sur la prochaine instruction
main_loop Goto, continuer d'autre vérification
appel dispTime; SEC a changé, afficher l'heure
movf sec, W; faire sec et oldsec les mêmes
movwf Oldtime
, Ou les appels vers les pièces du programme principal.
; L'interruption fait tout le stuff une minuterie seconde.
; Stuff
; Stuff
; Stuff
; Stuff
;-------------------------------------------------
goto main_loop; continuer à courir le code principal.
;------------------------------------------------- -----------------------------;================================================= =============================
fin, pas de code après ce point.
;================================================= =============================