; test2.asm ; Prova di assembler 8051 ; usando AS31 ; ; La scheda GPC2 con il suo monitor consente di caricare un programma ; dall'indirizzo 8050h. ; Quell'indirizzo viene fatto corrispondere all'inizio della ROM (indirizzo 0), quindi ; dopo quell'indirizzo si trovano i vettori di interruzione. ; Al piedino P1.2 sono connessi un LED ed un cicalino (uscita PWM nella ; documentazione). ; ; Per produrre un suono si utilizza un ciclo di ritardo. ; Ogni istruzione 'djnz ...' impiega 24 cicli. L'oscillatore va a 11,0592 MHz. ; Vengono quindi eseguiti 11.059.200 / 24 = 460.800 loop al secondo. ; Se lasciamo a 0 il registro contatore, l'istruzione DJNZ verra' eseguita 256 ; volte, quindi avremo in un secondo 460.800 / 256 = 1800 ripetizioni del loop ; ogni secondo. Dato che un ciclo dell'oinda quadra prodotta dal beeper sara' ; costituito da una parte ad 1 ed una a 0, quindi da due ripetizioni del loop, ; il cicalino oscilera' a 900 Hz. Se invece useremo un conteggio di 128, la ; frequenza del tono raddoppiera', quindi avremo un tono a 1800 Hz. ; ; Produciamo adesso un suno intermittente: 64 cicli a 900Hz, pari a circa 70 mS, ; seguiti da 128 cicli a 1800 Hz, quindi sempre 70 mS, seguiti da una pausa di 140 mS. ; .org 8050h ; on: mov r1,128 ; Numero di semicicli lo: mov r0,0 ; Durata del semiciclo (0 -> 256) cpl p1.2 ; commuta l'onda lo1: djnz r0,lo1 ; loop di ritardo semiciclo djnz r1,lo ; loop sui semicicli ; mov r1,0 ; Numero di semicicli (0 -> 256) hi: mov r0,128 ; Durata del semiciclo cpl p1.2 ; commuta l'onda hi1: djnz r0,hi1 ; loop di ritardo semiciclo djnz r1,hi ; loop sui cicli ; mov r1,0 ; Numero di cicli di ritardo (0 -> 256) off: mov r0,0 ; Durata del ritardo (0 -> 256) setb p1.2 ; Azione nulla (non produce suono) off1: djnz r0,off1 ; loop di ritardo djnz r1,off ; loop sui cicli di ritardo ; sjmp on ; loop infinito sul suono ; .end