Facebook
From Walloping Pudu, 8 Years ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 309
  1. /*
  2.  * cw5.4.asm
  3.  *
  4.  *  Created: 2014-05-28 18:04:56
  5.  *   Author: Maciek
  6.  */
  7.  
  8.  ;MOŻE NIE DZIAŁAć !!! Jak tak to prawdopodobnie trzeba zamienić 'rcall' na 'call' i 'rjmp' na 'jmp'
  9.  .include "m32def.inc"
  10.  .equ   oczekiwanie=5 ;czas - mnożnik x10[ms]
  11.  
  12.  .equ   odjemna=-6
  13.  .equ   odjemnik=3
  14.  
  15.  .cseg
  16.  .org 0
  17.         rjmp    PROGRAM
  18.  
  19.  ;Deklaracja tablicy w pamięci FLASH
  20.  .org 0x32
  21.  digit: .DB 0x7E, 0x30, 0x6D, 0x79, 0x33, 0x5B, 0x5F, 0x70, 0x7F, 0x7B, 0x77, 0x1F, 0x4E, 0x3D, 0x4F, 0x47
  22.  
  23.  ;Deklaracja komórki pamięci do programu czekania
  24.  .dseg
  25.  .org 0x60
  26.  CZAS_10MS: .byte 1
  27.  
  28.  .cseg
  29.  PROGRAM:
  30.  ;Przygotowanie stosu
  31.         ldi             r16, high(RAMEND)
  32.         out             sph, r16
  33.         ldi             r16, low(RAMEND)
  34.         out             spl, r16
  35.  
  36. ;Ustawienie wyjść
  37.         ser             r16
  38.         out             ddra,r16        ;port segmentów (potrzebne piny 6-0 -> 6-a...0-g)
  39.         out             ddrd,r16        ;port wyświetlaczy (potrzebne piny 3-0 -> 3-wyświetlacz lewy...0-wyświetlacz prawy)
  40.                                                 ;+ PD7 i PD6 na znak i flage 'overflow'
  41.  
  42. ;Ustawienie wartości czasu oczekiwania (przepisanie przez pamięć RAM)
  43.         ldi             r16,oczekiwanie
  44.         sts             CZAS_10MS,r16
  45.  
  46. ;Inicjalizacja rejestrów przechowujących wynik
  47.         clr             r23     ;high
  48.         clr             r22     ;low
  49.  
  50. ;Zasadnicza część
  51.         ldi             r23,high(odjemna)
  52.         ldi             r22,low(odjemna)
  53.         subi    r22,low(odjemnik)
  54.         sbci    r23,high(odjemnik)
  55.  
  56.         brvs    OVER    ;Jeśli jest flaga overflow to zapal diode na D6
  57.        
  58. P_DODATK:
  59.         sbrc    r23,7   ;sprawdź jaki jest znak liczby 16-bitowej, jeśli 0 przeskocz,...
  60.         sbi             portd,7 ;ale jeśli 1 (czyli '-') to zapal diode na D7
  61.  
  62. ;Zamiana z U2 na binarny (liczenie modułu) TYLKO W PRZYPADKU LICZBY UJEMNEJ!!!
  63.         sbrc    r23,7   ;sprawdź jaki jest znak liczby 16-bitowej, jeśli 0 przeskocz,...
  64.         rcall   MODUL
  65.  
  66. WYSWIETLANIE:
  67.         rcall   DISPLAY ;Wyświetlanie 16-bitowej liczby z R23:R22
  68.         rcall   WAIT
  69.         rjmp    WYSWIETLANIE
  70.  
  71. OVER:
  72.         sbi             portd,6
  73.         rjmp    P_DODATK
  74.  
  75. ;===========================================
  76. ;           =====PODPROGRAMY=====          
  77. ;===========================================
  78. ;Program wyświetlający w formacie HEX
  79. DISPLAY:
  80.         push    r16             ;Roboczy rejestr
  81.  
  82.         ;1111111111111111111111
  83.         ;Pobranie, zdekodowanie znaku i wysłanie do segmentów pierwszego wyświetlacza
  84.         mov             r16,r23         ;Utworzenie kopii wartości
  85.         andi    r16,0xf0        ;Wyizolowanie wartości 4-bitowej
  86.         swap    r16
  87.         rcall   SHIFT_POINT     ;Ustawienie wskaźnika na wartość liczby w tablicy dekodującej
  88.         lpm             r16,z           ;Pobranie wartości z komórki o adresie zawartym we wskaźniku
  89.         com             r16                     ;Negacja bitów (bo sterowanie zerem)
  90.         out             porta,r16       ;Wysłanie na port "segmentów"
  91.        
  92.         ;Włączenie pierwszego wyświetlacza
  93.         ldi             r16,0x08
  94.         com             r16
  95.         out             portd,r16
  96.  
  97.  
  98.         ;2222222222222222222222
  99.         ;Pobranie, zdekodowanie znaku i wysłanie do segmentów drugiego wyświetlacza
  100.         mov             r16,r23         ;Utworzenie kopii wartości
  101.         andi    r16,0x0f        ;Wyizolowanie wartości 4-bitowej
  102.         rcall   SHIFT_POINT     ;Ustawienie wskaźnika na wartość liczby w tablicy dekodującej
  103.         lpm             r16,z           ;Pobranie wartości z komórki o adresie zawartym we wskaźniku
  104.         com             r16                     ;Negacja bitów (bo sterowanie zerem)
  105.         rcall   LED_OFF
  106.         out             porta,r16       ;Wysłanie na port "segmentów"
  107.        
  108.         ;Włączenie drugiego wyświetlacza
  109.         ldi             r16,0x04
  110.         com             r16
  111.         out             portd,r16
  112.  
  113.  
  114.         ;33333333333333333333333333
  115.         ;Pobranie, zdekodowanie znaku i wysłanie do segmentów trzeciego wyświetlacza
  116.         mov             r16,r22         ;Utworzenie kopii wartości
  117.         andi    r16,0xf0        ;Wyizolowanie wartości 4-bitowej
  118.         swap    r16
  119.         rcall   SHIFT_POINT     ;Ustawienie wskaźnika na wartość liczby w tablicy dekodującej
  120.         lpm             r16,z           ;Pobranie wartości z komórki o adresie zawartym we wskaźniku
  121.         com             r16                     ;Negacja bitów (bo sterowanie zerem)
  122.         rcall   LED_OFF
  123.         out             porta,r16       ;Wysłanie na port "segmentów"
  124.        
  125.         ;Włączenie trzeciego wyświetlacza
  126.         ldi             r16,0x02
  127.         com             r16
  128.         out             portd,r16
  129.  
  130.         ;44444444444444444444444
  131.         ;Pobranie, zdekodowanie znaku i wysłanie do segmentów czwartego wyświetlacza
  132.         mov             r16,r22         ;Utworzenie kopii wartości
  133.         andi    r16,0x0f        ;Wyizolowanie wartości 4-bitowej
  134.         rcall   SHIFT_POINT     ;Ustawienie wskaźnika na wartość liczby w tablicy dekodującej
  135.         lpm             r16,z           ;Pobranie wartości z komórki o adresie zawartym we wskaźniku
  136.         com             r16                     ;Negacja bitów (bo sterowanie zerem)
  137.         rcall   LED_OFF
  138.         out             porta,r16       ;Wysłanie na port "segmentów"
  139.        
  140.         ;Włączenie czwartego wyświetlacza
  141.         ldi             r16,0x01
  142.         com             r16
  143.         out             portd,r16
  144.        
  145.         ;Sztuczne oczekiwanie, żeby wyrównać jasność świecenia
  146.         ldi             r16,25
  147. DODATK_OCZEK:
  148.         dec             r16
  149.         brne    DODATK_OCZEK
  150.  
  151.         rcall   LED_OFF
  152.  
  153.         pop             r16
  154.         ret
  155.  
  156. ;Wyłączenie wszystkich wyświetlaczy
  157. LED_OFF:
  158.         push    r16
  159.         ldi             r16,0x00
  160.         com             r16
  161.         out             portd,r16
  162.         pop             r16
  163.         ret
  164.  
  165. ;Przesunięcie wskaźnika
  166. SHIFT_POINT:
  167.         ldi             zh,high(2*digit)
  168.         ldi             zl,low(2*digit)
  169.         push    r16
  170.         add             zl,r16   
  171.         ldi             r16,0
  172.         adc             zh,r16
  173.         pop             r16
  174.         ret
  175.  
  176.  
  177. ;Podprogram czekający (odczytuje wartość do czekania z pamięci RAM - CZAS_MS)
  178. WAIT:
  179.         push    r16
  180.         push    r17
  181.         push    r18
  182.         lds             r16,CZAS_10MS
  183. LOOP1:
  184.         ldi             r17,60
  185. LOOP2:
  186.         ldi             r18,50
  187. LOOP3:
  188.         dec             r18
  189.         brne    LOOP3
  190.         dec             r17
  191.         brne    LOOP2
  192.         dec             r16
  193.         brne    LOOP1
  194.         pop             r18
  195.         pop             r17
  196.         pop             r16
  197.         ret
  198.  
  199. ;Zamiana liczby ujemnej w formacie U2 na binarny moduł
  200. MODUL:
  201.         com             r22
  202.         com             r23
  203.         ldi             r16,1
  204.         ldi             r17,0
  205.         add             r22,r16
  206.         adc             r23,r17
  207.         ret