⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 casovac.asm

📁 timer for you, mcu 8051
💻 ASM
字号:
; ovladanie casovaca
; programator Jan Kadak
$NOMOD51  
$include (89C2051.MCU)
;------------------------------------------------------------------
; Konfiguracia pinov, konstanty,definicia...	 
;------------------------------------------------------------------	
; Konfiguracia pinov 
;------------------------------------------------------------------
;
bodka_bit		bit	p3.1	; blikajuca ledka
;
des_min_bit		bit	p1.0
jed_min_bit		bit	p1.1
des_sec_bit		bit	p1.2
jed_sec_bit		bit	p1.3
;
;------------------------------------------------------------------
; KONSTANTY 
;------------------------------------------------------------------ 
;
; ------------------------------------------------------------------------------   
; DEFINICIA BYTE/BITOV V INTERNEJ RAM
;------------------------------------------------------------------       
;------------------------------------------------------------------  
dseg			     ; datovy segment
;BITY
				org 20h  ; v ram od 32dec
key_flag		bit 	0    ; stlacena klavesa klavesa
;
;---------------------------------------------
;BYTE   		(bitovo adresovatelne)	           		
				org 24h      ; v ram od 36dec    
;           					
				org 30h     ; v ram od adr 48dec, adresovatelne po bajtoch
key_press:		ds 1    ; cislo klavesy 
minuty:			ds 1
sekundy:		ds 1
min_bcd:		ds 1	;ulozene minuty v BCD kode, horne styri bity su desiatky minut, spodne su jednotky 
sec_bcd:		ds 1	; ulozene sekundy v BCD, plati to iste ako pri minutach
;                      
;------------------------------------------------------------------
cseg     ; programovy segment
	org 0h
        	sjmp start	
        org 00Bh		
		ajmp prerus_0
	org 013h
		reti
        org 01Bh
   	        ajmp prerus_1
;------------------------------------------------------------------
		org 30h
start:			mov	sp,#90
	mov	th1,#high 45536                 ; pri 24MHz asi 100Hz
	mov	tl1,#low 45536	
	mov	th0,#high 25536                 ; pri 24MHz asi 50Hz
	mov	tl0,#low 25536	
	mov	tmod,#00010001b			; casovac 1 mod1; casovac 0 mod1	
	mov	tcon,#01010000b		;    
	;mov 	ip,#00001100b      	 ; int1  + c/c 1 vyssej urovne  
	mov	28,#4			; pocitadlo > klavesnica
	mov 	27,#50			; pomoc pre prerusenie od casovaca 0 pre dosiahnutie 1 sekundy 				
	mov	key_press,#0		; ziadne tlacidlo
	;
	mov  minuty,#0	; zacneme od nuly
	mov  sekundy,#0
	;
	mov	ie, #10001010b	; zapneme prerusenie
;        
; ------------------------------------------------------------------------------
;------------------------------------------------------------------
;Hlavna slucka
;------------------------------------------------------------------ 
main:		;mov a, sekundy	
		acall porovnaj		; inkrement casu
		sjmp main
;------------------------------------------------------------------
;Podprogamy pre ovladanie
;------------------------------------------------------------------
;-------------------------------------------------------------------
; prerata aktual cas na BCD
porovnaj:		mov a, sekundy
		cjne a, #60, porovnaj_end
		mov sekundy,#0
		inc minuty
		mov a, minuty
		cjne a, #60, porovnaj_end
		mov sekundy, #0
		mov minuty, #0
porovnaj_end:		 ret
;------------------------------------------------------------------
;-------------------------------------------------------------------
; prerata aktual cas na BCD
prerataj_cas_BCD:	mov a, sekundy
		mov b, #10
		div ab
		mov sec_bcd, b		; zvysok do ram [jednotky]
		anl a, #00001111b		; desiatky  Acc, vynulujeme horne stzri bity
		swap a			; prehodime
		orl sec_bcd, a
		 mov a, minuty
		mov b, #10
		div ab
		mov min_bcd, b		; zvysok do ram [jednotky]
		anl a, #00001111b		; desiatky  Acc, vynulujeme horne stzri bity
		swap a			; prehodime
		orl min_bcd, a
		 ret
;------------------------------------------------------------------
; oneskorenie pre zobrazovanie na LED displeji
zobraz:			mov r4,#50     ; oneskorenie 30*50=1500*1us=1,5ms - svieti segmentovka
zp1:		mov r3,#30
zp2:		djnz r3,zp2
		djnz r4,zp1 
		 ret
;------------------------------------------------------------------
;------------------------------------------------------------------
;obsluha prerusenia pre casovac 0 (pouziva sa pre inkrement sekund)
;------------------------------------------------------------------ 
prerus_0:      	; inkrementacia premennych
		;push acc
		djnz 27, obnova_0
		mov 	27,#50
		inc sekundy
obnova_0:		mov	th0,#high 32203                 ; pri 24MHz asi 60Hz
		mov	tl0,#low 32203		
		 ;pop acc
		reti
;------------------------------------------------------------------
;obsluha prerusenia pre casovac0 (obsluha pre klavesnicu)
;------------------------------------------------------------------ 
prerus_1:		push acc
;
		acall prerataj_cas_BCD
displej:	;multliplex rezim, zacneme sekundami
led_4:			mov a, sec_bcd
		swap a	; vymenime bity
		orl a, #00001111b
		mov p1, a	
		clr jed_sec_bit		; aktivuj segmentovku
		acall zobraz
		setb jed_sec_bit
led_3:			mov a, sec_bcd
		orl a, #00001111b
		mov p1, a
		clr des_sec_bit
		acall zobraz
		setb des_sec_bit
led_2:			mov a, min_bcd
		swap a	; prehodime bity
		orl a, #00001111b
		mov p1, a
		clr bodka_bit		; ukaze aj bodku
		clr jed_min_bit
		acall zobraz
		setb jed_min_bit
		setb bodka_bit
led_1:			mov a, min_bcd
		orl a, #00001111b
		mov p1, a
		clr des_min_bit
		acall zobraz
		setb des_min_bit
obnova:			mov	th1,#high 45536                 ; pri 24MHz asi 100Hz
		mov	tl1,#low 45536		
		 pop acc
		 reti
;-------------------------------------------------------------------------------- 
;
;-------------------------------------------------------------------------------- 
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -