АСВТ 2 семестр ЛР №5

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 09:51, 13 мая 2016.


Знакомство с МК PIC12F675. Работа с битовыми и байтовыми командами

Выполнение работы

Цель работы. Познакомиться с микроконтроллером PIC12F675[1], научиться работать с портами ввода/вывода, разобраться в функционале микроконтроллера.

Исходные данные. Осуществить индикацию нажатия на кнопку или включения звукового динамика с помощью ССИ и светодиодов.

Реализация. Схема реализована с использованием ССИ, кнопок, ключей, светодиодов, звукового динамика. При нажатии на кнопку должны загореться все светодиоды красного цвета, при включении динамика - зеленого. При переключении ключа можно наблюдать аналогичную картину на ССИ.

Рис. 1. Схема в Proteus
Рис. 2. Светодиоды в случае включенного динамика
Рис. 3. Светодиоды в случае нажатой кнопки
Рис. 4. ССИ в случае нажатой кнопки

Листинг на Ассемблере.

#include <p12f675.inc>
processor 12F675
GPIO_last_state equ 0x5c;
GPIO_current_state equ 0x5e;
number equ 0x5f;
RP0 equ 5;
GP0 equ 0;
GP1 equ 1;
GP2 equ 2;
GP3 equ 3;
GP4 equ 4;
GP5 equ 5;
GIE equ 7;
GPIE equ 3;
GPIF equ 0;

org 0x0000
	goto	init;

isr	org 0x0004;
	movf GPIO, 1;
	movf GPIO, 0;
	movwf GPIO_current_state;
	xorwf GPIO_last_state, 0;
	bsf STATUS, RP0;
	andwf TRISIO, 0;
	bcf STATUS, RP0;
	movwf GPIO_last_state;
	btfsc GPIO_last_state, GP0;
		goto GP0_state_changed;
	btfsc GPIO_last_state, GP5;
		goto GP5_state_changed;
return_from_int
	movf GPIO_current_state, 0;
	movwf GPIO_last_state;
	bcf INTCON, GPIF;
	retfie;
org	0x00ff;
init
	bsf STATUS, RP0;
	bsf TRISIO, GP0; set GP0 in  
	bcf TRISIO, GP1; set GP1 out
	bcf TRISIO, GP2; set GP2 out
	bcf TRISIO, GP4; set GP4 out
	bsf TRISIO, GP5; set GP5 in
	bsf IOC, GP0; set GP0 IOC
	bsf IOC, GP5; set GP5 IOC
	movlw 0;
	movwf ANSEL;
	bcf STATUS, RP0;
	bsf T1CON, TMR1ON
	movlw 0xFF;
	movwf CMCON;
	bsf INTCON, GIE; enable all unmasked interrupts
	bsf INTCON, GPIE; enable IOC
	clrf number;
	movf GPIO, 0;
	movwf GPIO_last_state;
	goto $;
	
GP0_state_changed
	btfsc GPIO, 0;
		goto return_from_int;
	btfsc number, 0;
		goto GP0_second_click;
	bcf GPIO, GP1;0
	bsf GPIO, GP4;
	nop;
	bcf GPIO, GP4;
	bcf GPIO, GP1;0
	bsf GPIO, GP4;
	nop;
	bcf GPIO, GP4;
	bcf GPIO, GP1;0
	bsf GPIO, GP4;
	nop;
	bcf GPIO, GP4;
	bcf GPIO, GP1;0
	bsf GPIO, GP4;
	nop;
	bcf GPIO, GP4;
	bcf GPIO, GP1;0
	bsf GPIO, GP4;
	nop;
	bcf GPIO, GP4;
	bsf GPIO, GP1;1
	bsf GPIO, GP4;
	nop;
	bcf GPIO, GP4;
	bsf GPIO, GP1;1
	bsf GPIO, GP4;
	nop;
	bcf GPIO, GP4;
	bcf GPIO, GP1;0
	bsf GPIO, GP4;
	bsf GPIO, GP2;
	nop;
	bcf GPIO, GP4;
	bcf GPIO, GP2;
	
	incf number, 1;
	goto return_from_int;
			
	GP0_second_click
		bsf STATUS, RP0;
		bcf TRISIO, GP0;
		bcf STATUS, RP0;
		bsf GPIO, GP0;	
		;show_green
		bsf GPIO, GP1;1
		bsf GPIO, GP4;
		nop;
		bcf GPIO, GP4;
		bcf GPIO, GP1;0
		bsf GPIO, GP4;
		nop;
		bcf GPIO, GP4;
		bsf GPIO, GP1;1
		bsf GPIO, GP4;
		nop;
		bcf GPIO, GP4;
		bcf GPIO, GP1;0
		bsf GPIO, GP4;
		nop;
		bcf GPIO, GP4;
		bsf GPIO, GP1;1
		bsf GPIO, GP4;
		nop;
		bcf GPIO, GP4;
		bcf GPIO, GP1;0
		bsf GPIO, GP4;
		nop;
		bcf GPIO, GP4;
		bsf GPIO, GP1;1
		bsf GPIO, GP4;
		nop;
		bcf GPIO, GP4;
		bcf GPIO, GP1;0
		bsf GPIO, GP4;
		bsf GPIO, GP2;
		nop;
		bcf GPIO, GP4;
		bcf GPIO, GP2;
		
		incf number, 1;
		goto return_from_int;

GP5_state_changed
	btfsc GPIO, 5;
		goto return_from_int;
	btfsc number, 0;
		goto GP5_second_click;
	bcf GPIO, GP1;0
	bsf GPIO, GP4;
	nop;
	bcf GPIO, GP4;
	bsf GPIO, GP1;1
	bsf GPIO, GP4;
	nop;
	bcf GPIO, GP4;
	bcf GPIO, GP1;0
	bsf GPIO, GP4;
	nop;
	bcf GPIO, GP4;
	bsf GPIO, GP1;1
	bsf GPIO, GP4;
	nop;
	bcf GPIO, GP4;
	bsf GPIO, GP1;1
	bsf GPIO, GP4;
	nop;
	bcf GPIO, GP4;
	bcf GPIO, GP1;0
	bsf GPIO, GP4;
	nop;
	bcf GPIO, GP4;
	bsf GPIO, GP1;1
	bsf GPIO, GP4;
	nop;
	bcf GPIO, GP4;
	bsf GPIO, GP1;1
	bsf GPIO, GP4;
	bsf GPIO, GP2;
	nop;
	bcf GPIO, GP4;
	bcf GPIO, GP2;
	
	incf number, 1;
	goto return_from_int;
	
	GP5_second_click
		bsf STATUS, RP0;
		bcf TRISIO, GP0;
		bcf STATUS, RP0;
		bsf GPIO, GP0;		
		;show_red
		bcf GPIO, GP1;0
		bsf GPIO, GP4;
		nop;
		bcf GPIO, GP4;
		bsf GPIO, GP1;1
		bsf GPIO, GP4;
		nop;
		bcf GPIO, GP4;
		bcf GPIO, GP1;0
		bsf GPIO, GP4;
		nop;
		bcf GPIO, GP4;
		bsf GPIO, GP1;1
		bsf GPIO, GP4;
		nop;
		bcf GPIO, GP4;
		bcf GPIO, GP1;0
		bsf GPIO, GP4;
		nop;
		bcf GPIO, GP4;
		bsf GPIO, GP1;1
		bsf GPIO, GP4;
		nop;
		bcf GPIO, GP4;
		bcf GPIO, GP1;0
		bsf GPIO, GP4;
		nop;
		bcf GPIO, GP4;
		bsf GPIO, GP1;1
		bsf GPIO, GP4;
		bsf GPIO, GP2;
		nop;
		bcf GPIO, GP4;
		bcf GPIO, GP2;
		
		incf number, 1;
		goto return_from_int;
		
end;

Примечания