Примеры программ и подпрограмм

Здесь представлены программы и подпрограммы, которые Вы можете использовать в своих разработках. Архивы, написанные мною, содержат файл readme.txt, поясняющие работу и использование. Чтобы загрузить, щелкните по имени файла-архива.

НАЗНАЧЕНИЕ АВТОР СЕРИЯ РАЗМЕР ФАЙЛ
Сборник коротких, но нужных подпрограмм разные
disall@mail.ru 
разные меняется subr.zip
I2C в режиме master. Подпрограммы. Русский язык. disall@mail.ru  17C75X 2,65 KB i2c.zip
Набор подпрограмм: I2C шина и SPI, последовательный порт UART, широтно-импульсная модуляция (ШИМ, Pulse Width Modulation, PWM), макросы ожидания установки и смены логических уровней и другое. Английский язык. - 12CXXX 59,3 KB pic12add.zip
DTMF кодер. Английский язык. Stephen James Hardy (T/A SW Tekno) Canberra, Australia hardy@sweng.stortek.com 16C7X 58,4 KB dtmf_cod.zip
Использование LCD индикатора с последовательным интерфейсом. Английский язык. - 16C5X 4,02 KB op16117a.zip
Передача данных по последовательному асинхронному интерфейсу RS-232. Английский язык. Ralph 12C508A 74,4 KB serial10.zip
Очень полезная статья: "Работа с коммуникационными портами (COM и LPT) в программах для Win32". Титов Олег - 82,8 KB statya.rar
Набор модулей - все для работы с COM портами в DOS и Windows во всех режимах, с контролем и управлением всеми линиями (DTS,DTR и т.д.) - - 6,61 KB serial.zip
Модуль для работы с СОМ портом и c примером использованя. Написано под Builder C++, но используется только API, так что можно переделать под что угодно. Соединение простейшее:
GND1 - GND2
TxD1 - RxD2
RxD1 - TxD2
Режим асинхронный.
yuragv@mbox.com.ua - 2,35 KB rs232.rar

 

НЕКОТОРЫЕ ПОЛЕЗНЫЕ ПОДПРОГРАММЫ

Ниже собраны некоторые подпрограммы, которые часто приходится использовать в своих проектах. Может быть будут полезны и Вам?

Задержка с программируемым временем.

Перевод двоичного числа в двоично-десятичное.

Быстрый перевод 2-битного двоичного числа в "распакованное" десятичное.

 


Задержка с программируемым временем.

Задержка для этой подпрограммы задается перед обращением к ней как загрузка числа в регистр cnt1. Общее число циклов определяется по формуле: 256*256*cnt1*7. Для примера, приблизительно 1 секунда при частоте 20 МГц задается загрузкой 11 в cnt1. Примечательно, что в каждом цикле одно и тоже количество выполняемых команд.

Название: delay
Входные данные:
число, пропорциональное задержке в регистре cnt1.
Выходные: задержка.
Используемые регистры: cnt1, cnt2, cnt3.

; Delay 1sec@20MHz: 
; cnt1 = Cycles/256/256/7 = (20000000/4)/256/256/7 = 10.899 = 11 

delay           movlw .11 
                movwf cnt1 
                clrf cnt2 
                clrf cnt3 
dloop           decfsz cnt3,f 
                goto $+2 
                decfsz cnt2,f 
                goto $+2 
                decfsz cnt1,f 
                goto dloop 
                return 

Назад


Перевод двоичного числа в двоично-десятичное.

Для вывода цифр на индикатор (в примере на 4-разрядный) необходимо преобразовать 2-байтное двоичное число в двоично-десятичное (3-бфйтное). Вот подпрограмма, которая может это сделать.

Название: bin2bcd
Входные данные:
двоичное число в регистрах bin1, bin2. При этом bin1 - старший байт.
Выходные: единицы будут в младшей тетраде регистра bcd3, десятки в старшей регистра bcd3,
сотни в младшей тетраде регистра bcd2, тысячи в старшей bcd2,
десятки тысяч будут находиться в младшей тетраде регистра bcd1. 
Используемые регистры: bin1, bin2, bcd1, bcd2, bcd3, ctr.

bin2bcd         movlw .16 
                movwf ctr 
                clrf bcd1 
                clrf bcd2 
                clrf bcd3 
                goto start 

adjdec          movlw 0x33 
                addwf bcd1,f 
                addwf bcd2,f 
                addwf bcd3,f 

                movlw 0x03 
                btfss bcd1,3 
                subwf bcd1,f 
                btfss bcd2,3 
                subwf bcd2,f 
                btfss bcd3,3 
                subwf bcd3,f 

                movlw 0x30 
                btfss bcd1,7 
                subwf bcd1,f 
                btfss bcd2,7 
                subwf bcd2,f 
                btfss bcd3,7 
                subwf bcd3,f 

start           rlf bin2,f 
                rlf bin1,f 
                rlf bcd3,f 
                rlf bcd2,f 
                rlf bcd1,f 
                decfsz ctr,f 
                goto adjdec 
                return 

Назад


Быстрый перевод 2-битного двоичного числа в "распакованное" десятичное. 

Еще одна быстрая программа перевода, автор John Payson. Добавлением к каждому байту результата числа 30h можно получить число в ASCII формате.

; Binary-to-BCD. Written by John Payson. 

; Enter with 16-bit binary number in NumH:NumL. 
; Exits with BCD equivalent in TenK:Thou:Hund:Tens:Ones. 

               org $0010 ;Start of user files for 16c84 
NumH:          ds 1 
NumL:          ds 1 
TenK:          ds 1 
Thou:          ds 1 
Hund:          ds 1 
Tens:          ds 1 
Ones:          ds 1 

Convert:                          ; Takes number in NumH:NumL 
                                  ; Returns decimal in 
                                  ; TenK:Thou:Hund:Tens:Ones 
               swapf NumH,w 
               andlw $0F          ;*** PERSONALLY, I'D REPLACE THESE 2 
               addlw $F0          ;*** LINES WITH "IORLW 11110000B" -AW 
               movwf Thou 
               addwf Thou,f 
               addlw $E2 
               movwf Hund 
               addlw $32 
               movwf Ones 

               movf NumH,w 
               andlw $0F 
               addwf Hund,f 
               addwf Hund,f 
               addwf Ones,f 
               addlw $E9 
               movwf Tens 
               addwf Tens,f 
               addwf Tens,f 

               swapf NumL,w 
               andlw $0F 
               addwf Tens,f 
               addwf Ones,f 
               
               rlf Tens,f 
               rlf Ones,f 
               comf Ones,f 
               rlf Ones,f 
               
               movf NumL,w 
               andlw $0F 
               addwf Ones,f 
               rlf Thou,f 
               
               movlw $07 
               movwf TenK 
               
; At this point, the
; original number is equal to 
; TenK*10000+Thou*1000+Hund*100+Tens*10+Ones 
; if those entities are regarded as two's compliment 
; binary. To be precise, all of them are negative 
; except TenK. Now the number needs to be normal- 
; ized, but this can all be done with simple byte 
; arithmetic. 

               movlw $0A                ; Ten 
Lb1: 
               addwf Ones,f 
               decf Tens,f 
               btfss 3,0 
               goto Lb1 
Lb2: 
               addwf Tens,f 
               decf Hund,f 
               btfss 3,0 
               goto Lb2 
Lb3: 
               addwf Hund,f 
               decf Thou,f 
               btfss 3,0 
               goto Lb3 
Lb4: 
               addwf Thou,f 
               decf TenK,f 
               btfss 3,0 
               goto Lb4 

               retlw 0 


Для тех, кто хочет получить более подробную информацию о представленных моих программах, а также задать некоторые вопросы, обращайтесь ко мне по электронной почте. Буду рад вам ответить.

Hosted by uCoz