;*************************************************************************** ;* UP2016.ASM: Upcounter 0 - 99 with the SLO2016 ;* ;* Copyright ©2002 Rob's ElectroSoft ;* ;* RES can be reached by email: at90s2313@europe.com ;* Website: http://www.attiny.com ;* ;* Version :1.0 ;* Target MCU :AT90S1200-12PI@4MHz ;* Date :04-06-2002 ;*************************************************************************** .device AT90S1200 .include "1200def.inc" rjmp RESET ;reset handle ;* long delay (50 msec) ;* Register variables .def T1 = r1 .def T2 = r2 .def tmp = r16 ;* Defines ;* Code longDelay: clr T1 ;T1 used as delay 2nd count clr T2 ;T2 used as delay 3d count delay_1: dec T2 brne delay_1 dec T1 brne delay_1 dec tmp ;tmp must be preset as brne delay_1 ; delay master count ret ;* Pinning defenitions AT90S1200 -> SLO2016 ;* Defines .equ BL = 7 ;Blanking at PB7 .equ D6 = 6 ;D6 Data at PB6 .equ D5 = 5 ;D5 Data at PB5 .equ D4 = 4 ;D4 Data at PB4 .equ D3 = 3 ;D3 Data at PB3 .equ D2 = 2 ;D2 Data at PB2 .equ D1 = 1 ;D1 Data at PB1 .equ D0 = 0 ;D0 Data at PB0 .equ A1 = 6 ;A1 Address at PD6 .equ A0 = 5 ;A0 Address at PD5 .equ WR = 4 ;WR Write at PD4 .equ CLR = 3 ;CLR Clear at PD3 ;* Register variables .def temp = r17 ;temporary data .def units = r18 ;units .def tens = r19 ;tens ;* Show displays (when first shown also second is shown -> by WR) ;* Code showFirst: cbi PORTD, A0 ;activate digit0 ldi temp, 0x30 ;start from char '0' in ROM add temp, units out PORTB, temp ;set data on digit3 sbi PORTB, BL ;displays On ret showSec: sbi PORTD, A0 ;activate digit1 ldi temp, 0x30 ;start from char '0' in ROM add temp, tens out PORTB, temp ;put data on digit3 sbi PORTB, BL ;displays On ret ;* Main program (includes RESET) ;* 1st all settings and init SLO2016 ;* Code RESET: ser temp ;all outputs out DDRB, temp ;at Port B cbi PORTB, BL ;displays Off first out DDRD, temp ;at Port D cbi PORTD, A0 ;start with digit0 cbi PORTD, A1 ;A1 stays lo al the time sbi PORTD, CLR ;Clear high cbi PORTD, WR ;WR low ;* Reset digits -> show [ 00] on display start: ldi temp, 0x30 ;zero digit ('0' = 0x30 in ROM) out PORTB, temp ; (see ASCII table datasheet) sbi PORTD, A0 ;activate digit1 out PORTB, temp sbi PORTB, BL ;display On ldi tmp, 5 ;wait for 0.25 secs rcall longDelay clr units ;zero 'units' clr tens ;zero 'tens' ;* start counting process incUnits: inc units ;start counting cpi units, 10 ;if 10 -> inc tens breq incTens rcall showFirst ;countup digit3 ldi tmp, 5 ;wait 0.25 secs rcall longDelay cbi PORTB, BL ;displays Off rjmp incUnits incTens: clr units ;reset units inc tens ;count tens one upwards cpi tens, 10 ;after 10 times -> restart program breq start rcall showSec ;countup digit2 rcall showFirst ;also show first ldi tmp, 5 ;wait 0.25 secs rcall longDelay cbi PORTB, BL ;displays Off rjmp incUnits