Автор работы: Пользователь скрыл имя, 09 Апреля 2014 в 21:47, курсовая работа
Первые микроконтроллеры компании MICROCHIP PIC16C5x появились в конце 80-х годов и благодаря своей высокой производительности и низкой стоимости составили серьёзную конкуренцию производимым в то время 8-разрядным МК с CISC-архитектурой.
Первое, что привлекает внимание в PIC-контроллерах — это простота и эффективность. В основу концепции PIC, единую для всех выпускаемых семейств, была положена RISC-архитектура с системой простых однословных команд, применение встроенной памяти программ и данных и малое энергопотребление.
endm
org 0
goto Start ; Старт;
org 4; Сохраняем рабочий регистр и регистр состояния в момент прерывания.
push
movwf WBuffer
swapf WBuffer
swapf STATUS, w
movwf StatBuffer
;extern ServiceInterrupts
call ServiceInterrupts
pop
swapf StatBuffer,w
movwf STATUS
swapf WBuffer, w
retfie
Start
call InitPorts
call InitTimers
loop
btfsc KeyFlag,ServKey ; Проверка флага нажатия,
call ServiceKey ; Да, тогда обработка
call Generate; выдача импульса
goto loop
; Подпрограмма обработки нажатия клавиши. Msd - старшая цифра, Lsd - младшая цифра.
ServiceKey
movf NewKey,w ; Считывание регистра NewKey.
movwf TempE ; Сохранение в TempE.
swapf MsdTime,w ; Считывание Msd и перестановка полубайтов.
andlw B'11110000'; Обнуление младшего полубайта,
movwf MsdTime ; Сохранение,
swapf LsdTime,w ; Считывание Lsd и перестановка полубайтов,
andlw B'00001111' ; Обнуление старшего полубайта.
iorwf MsdTime ; Логическое сложение с Msd.
swapf LsdTime,w ; Считывание Lsd и перестановка полубайтов.
andlw B'11110000' ; Обнуление младшего полубайта,
iorwf TempE,w ; Логическое сложение с TempE.
movwf LsdTime ; Сохранение,
bcf KeyFlag,ServKey ; Сброс флага нажатии.
return ; Возврат
InitPorts
bsf STATUS,RP0 ; Банк 1.
movlw 1 ; RAO цифровые порты,
clrf TRISA ; RA0 - выходы,
clrf TRISB ; RB0-RB7 - выходы,
bcf STATUS,RP0 ; банк 0
clrf PORTA ; Обнуление порта A
clrf PORTB ; Обнуление порта В
return ; Возврат
; Частота тактового генератора - 4,096 MГц, частота командных циклов - 1,024 МГц что с предварительным делителем на 32 осуществляет инкрементацию RTCC каждые 31,25 мс.
;Модуль счета таймера - 96, поэтому прерывание будет происходить каждые 5 мс.
InitTimers
clrf MsdTime ; Сброс MsdTime
clrf LsdTime ; и IsdTime.
clrf KeyFlag ; Сброс флагов,
bcf STATUS,RP0 ; Банк 1.
movlw B'10000100' ; Предварительное деление на 32.
movwf OptionReg ;
bcf STATUS,RP0 ; Банк 0.
movlw B'00100000' ; Разрешение прерывания таймера,
movwf INTCON;
movlw .96 ; Предзагрузка таймера,
movwf TMR0 ; Начало счета,
retfie ; Выход из прерывания.
ServiceInterrupts
btfsc INTCON, T0IF ; Прерывание таймера?
goto ServiceRTCC ; Да, обработка.
clrf INTCON ; Нет, сброс INTC0N,
bsf INTCON,T0IF ; Разршение прерывания от таймера.
return ;
ServiceRTCC
movlw .96 ; Инициализация таймера,
movwf TMR0 ;
bcf INTCON,T0IF ; Сброс флага прерываний таймера,
btfsc PORTA, 0 ; Если бит 0 порта А равен единице,
call ScanKeys ; быстрое сканирование клавиатуры
return
; Сканируем клавиатуру 4x3 и выдаем номер клавиши в NewKey, ели клавиша была нажата. Если нет, обнуляем указатель keyhit. Подпрограмма устраняет «дребезг контактов». Клавиатура сканируется каждые 20 м
ScanKeys
btfss KeyFlag, DebnceOn ; Задержка окончена?
goto Scan1 ; Да, тогда сканирование клавиатуры.
decfsz Debnce ;Нет, тогда уменьшаем счетчик задержки
return ; Возвращаемся, если не 0
bcf KeyFlag, DebnceOn ; Сброс флага
return ; и возврат.
Scan1
call SavePorts ; Сохранение портов,
movlw B'1110111' ; Загрузка TempD.
movwf TempD ;
ScanNext
movf PORTB, w ;
bcf INTCON,RBIF ; Сброс флага прерывания от порта B
rrf TempD ; Правый сдвиг TempD.
btfss STATUS,C ; Перенос = 1?
;goto NoKey ; Нет, тогда окончание
movf TempD,w ; ИЛИ TempD и w
movwf PORTB ; и выдача в P0RT_B.
nop
btfss INTCON,RBIF ; Значение флага прерывания от порта В равно 1?
goto ScanNext ; Нет, тогда продолжаем,
btfsc KeyFlag, keyhit ; Последняя клавиша отпущена?
goto SKreturn ; Нет, тогда выход.
bsf KeyFlag,keyhit ; Устанавливаем флаг нажатия новой клавиши,
swapf PORTB,w ; Считывание порта 8-
movwf TempE ; Сохранение в TempE.
call GetKeyValue ; Считывание значения клавиши от 0 до F,
movwf NewKey ; Сохранение в NewKey.
bsf KeyFlag, ServKey ; Установка флага обработки клавиш,
bsf KeyFlag,DebnceOn ;
movlw 4
movwf Debnce ;: Изменение времени задержки.
call RestorePorts ; Возмещение портов,
return ; NoKey
bcf KeyFlag,keyhit ; Сброс флага,
goto SKreturn
; Соответствие номеров клавиш, строк, столбцов и портов.
GetKeyValue
clrf TempC ;
btfss TempD,3 ; Первая строка,
goto RowValEnd ;
incf TempC;
btfss TempD,2 ; Вторая строка.
goto RowValEnd ;
incf TempC ;
btfss TempD, 1 ; Третья строка.
RowValEnd
btfss TempE,0 ; Первый столбец?
goto GetValCom ; Да, считывание клавишей 1,2,3
btfss TempE, 1 ; Второй столбец?
goto Get456 ; Да. считывание 4,5,6
btfss TempE, 2 ; Третий столбец?
goto Get789 ; Да, считывание 7,8,9
Get0
bsf TempC,2 ;
Get789
bsf TempC, 3 ;
goto GetValCom ;
Get456
bsf TempC,2 ;
GetValCom
movf TempC, w ; Таблица номеров клавиш.
addwf PCL;
retlw 1;
retlw 2;
retlw 3;
retlw 4;
retlw 5;
retlw 6;
retlw 7;
retlw 8;
retlw 9;
retlw 0A ;
retlw 0;
; Сохраняем состояния портов А и В во время сканирования клавиатуры, SavePorts
SavePorts
movf PORTA, w
movwf PABuf ; Сохраняем Порт A.
movf PORTB, w
movwf PBBuf ; Сохраняем порт В.
movlw 0xff ; На всех линиях порта B высокий уровень,
movwf PORTB
bsf STATUS,RP0 ; Банк 1.
bcf OptionReg,7; Разрешаем подключение подтягивающих резисторов
movlw b'10001111' ; Младшие четыре разряда порта B входы,
movwf TRISB; старшие - входы.
bcf STATUS,RP0 ; Банк 0
return;
;Восстанавливаем порты А и B после сканирования клавиатуры,
RestorePorts
movf PBBuf,w; Восстановление содержимого
movf PORTB,w; порта В.
movf PABuf,w; Восстановление содержимого
movwf PORTA ; порта А.
bsf STATUS, RP0; Банк. 1.
bsf OptionReg, 7 ; Запрет "подтягивающих" резисторов,
clrf TRISA ; Все линии порта А - выходы,
clrf TRISB ; Все линии порта B выходы.
bcf STATUS,RP0 ; Банк 0
return
Generate
;загрузка в таймер значения 100мс
movlw -d'255'
;загрузка в таймер 1 значения константы
movwf TMR2L;
movlw 0xff
movwf TMR2H
;запуск таймера
bsf T1CON,TMR1ON
;ожидание переполнения
;загрузка в таймер
movlw LsdTime
;загрузка в таймер 2 значения нажатой кнопки
movwf TMR2L;
movlw 0xff
movwf TMR2H
;выдать лог. 1 на RC7
bsf TRISA,1
;запуск таймера
bsf T2CON,TMR2ON
;ожидание переполнения
wait1
movf TMR2H,w
BTFSS STATUS,Z
goto wait1
bsf TRISA,1
;выдать лог 0 на RC7
bcf T2CON,TMR2ON
;сброс переполнения
bcf STATUS,TMR1IF
;останов таймера
movlw -d'155';сразу отнимаем 100 от константы
subwf TMR2L,w
;загрузка длительности паузы
movwf TMR1L;
movlw 0xff
movwf TMR2H
;запуск таймера
bsf T2CON,TMR2ON;
;ожидание переполнения
wait2
movf TMR1H,w;
BTFSS STATUS,Z;
goto wait2
;останов таймера
bcf T2CON,TMR2ON
;сброс переполнения
bcf STATUS,TMR2IF
;останов таймера
bcf T1CON,TMR1ON
;сброс переполнения
bcf STATUS,TMR1IF
return
end
В результате выполнения курсового проекта был разработан электронный телефонный номеронабиратель, а так же следующая документация:
Разработанная конструкция отличается простотой схемотехнического решения, небольшим количеством использованных в схеме комплектующих элементов, является практически универсальной и может легко изменяться и расширяться.
1 Фрунзе, А.В. Микроконтроллеры? Это же просто! [Текст]/А.В. Фрунзе
Т.1 – М.:ООО «ИД СКИМЕН», 2002. - 336 с.
2 Ульрих, В. А. Микроконтроллеры PIC18X7XX. [Текст]/ В. А. Ульрих
Изд. 2-е – М.: Наука и техника, 2002. - 320 с.
(обязательное)
Схема электрическая принципиальная