Flashing Lights


C and Assembly programs to flash LEDs on PORTA, and wait using the timer overflow


Flowchart:



Assembly Program:

; Program to increment Port A using the HC12 timer subsytem
; to time delays

prog:   equ     $0800

TSCR:   equ     $0086            ; Timer System Control Register
TMSK2:  equ     $008D            ; Timer Interrupt Mask 2
TFLG2:  equ     $008F            ; Timer Interrupt Flag 2

DDRA:   equ     $0002            ; Data Direction Register A
PORTA:  equ     $0000            ; Port A Data


CODE:   section .text
        org     prog
        lds     #$0A00           ; set the stack pointer
        movb    #$ff,DDRA        ; Port A output
        clr     PORTA            ; 0 -> Port A
        movb    #$80,TSCR        ; Turn on timer
        movb    #$02,TMSK2       ; Set timer overflow rate at 32 ms
        movb    #$80,TFLG2       ; Clear TOF flag
loop:   brclr   TFLG2,#$80,loop  ; Wait for timer overflow
        inc     PORTA
        movb    #$80,TFLG2       ; Clear TOF flag
        bra     loop             ; Wait forever


C Program:

/* 
 * Program to increment Port A using the HC12 timer subsytem
 * to time delays
 */

#include "hc12.h"

main()
{
    DDRA = 0xff;                   /* Make Port A output */
    PORTA = 0x00;                  /* Clear Port A */
    TSCR = 0x80;                   /* Turn on timer */
    TMSK2 = 0x02;                  /* Set timer overflow rate */
                                   /* at 32 ms */
    TFLG2 = 0x80;                  /* Clear timer overflow flag */
    while (1)                      /* Repeat forever */
    {
        while (!(TFLG2 & 0x80)) ;  /* Wait for TOF flag */
        PORTA = PORTA + 1;         /* Increment Port A */
        TFLG2 = 0x80;              /* Clear timer overflow flag */
    }
}