list P=PIC16F628A #include __CONFIG 3F58h #define DHT22 #define digit3 errorlevel-302 errorlevel-207 #define Data_ PORTA,5 ; pin 4 Вход данных с датчика #define Shina_D PORTA,4 ; pin 3 Коммутация шины данных датчика #define IND_3 PORTA,0 ; pin 17 вых. на катоды #define IND_2 PORTA,7 ; pin 16 выход на катоды #define IND_1 PORTA,6 ; pin 15 выход #define bank_0 STATUS,RP0 #define bank_1 STATUS,RP0 #define _Z STATUS,Z #define _C STATUS,C #define PRER INTCON,GIE ; RA4 и RA5 - вход датчика ;ячейки ОЗУ cblock 0x22 vlaj_2_10 ; Временный регистр для преобр. значения влажности T_H_2_10 ; Временный рег. для преобр. целой части температуры T_L_2_10 ; Временный рег. для преобр. десятой части температуры led_vlaj_H ; Регистр десятков для инликации влажности led_vlaj_L ; Регистр единиц для инликации влажности led_vlaj_0L ; Регистр десятых для инликации влажности led_T_H ; Регистр десятков для инликации температуры led_T_L ; Регистр единиц для инликации температуры led_T_0L ; Регистр десятых для инликации температуры SRAVN_T ; Регистр сравнения температ. Reg_vkl ust_T_H ust_T_L ust_T_0L V_10 ; Регистр целой части влажности V_01 ; Регистр десютой части влажности T_10 ; Регистр целой части температуры T_01 ; Регистр десятой части температуры Contr_summa ; Регистр контрольной суммы Reg_1 ; Регистр задержки Reg_2 ; Регистр задержки Reg_3 ; Регистр задержки Reg_4 ; Регистр задержки count_ind ; Счетчик разрядов индикации count_2_10 count_data count_read W_temp S_temp endc ; вывод с открытым стоком RA4 (подтянут к +5 v через ; резистор 5,1 к) соединен со входом RA5 такое соединение ; обеспечивает возможностьне переключать направление ; работы портов во время обмена с датчиком. ;жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж org 0 GOTO START org 4 RETFIE ;жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж Indicat ; Динамическая индикация clrf PORTB ; Устанавливаем на всех выводах portb логические нули incf count_ind,f ; инкриминируем счётчик movlw 3 ; Три еденицы -маска andwf count_ind,w ; Обнуляем пять старших бит регистра count, результат помешается в аккумулятор addwf PCL,f ; Увеличиваем на значение аккумулятора, счётчика инструкций nop goto T_0L ; Переходим на индикацию десятков температуры goto T_L ; Переходим на индикацию едениц температуры goto T_H ; Переходим на индикацию десятых долей температуры T_L movfw led_vlaj_L call Table ; Загружаем данные из таблицы в аккумулятор movwf PORTB ; Переписываем данные из аккумулятора в portb bcf IND_3 ; Устанавливаем логич. 0 bsf IND_2 bsf IND_1 goto pr_exit T_0L movfw led_vlaj_0L call Table movwf PORTB bsf IND_3 bcf IND_2 bsf IND_1 goto pr_exit T_H ifndef digit3 movlw b'01110110' endif ifdef digit3 movfw led_vlaj_H call Table endif movwf PORTB bsf IND_3 bsf IND_2 bcf IND_1 goto pr_exit pr_exit RETURN ;жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж START clrf INTCON ; Запрет всех прерываний. bsf bank_1 ; Доступ к банку 1 clrf TRISB ; Весь порт на выдачу movlw b'00100000' ; Выходы PORTA настраиваем movwf TRISA ; на выдачу, кроме RA5 bcf VRCON,VREN ; Выключить источник опорного напряжения movlw b'10000010' ; Выключаем подтягивающие регистры, подключаем movwf OPTION_REG ; предделитель к таймеру TMR0, устанавливаем ; коэффициент деления предделителя равным 16. bcf bank_0 ; Доступ к банку 0 movlw B'00000111' movwf CMCON ; Компараторы выкл. ; Обнулим регистры movlw 0x22 movwf FSR clrf INDF incf FSR,f movlw 0x40 subwf FSR,w btfss _Z goto $-5 ;жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж Main call delay_1s call delay_1s clrf Contr_summa clrf T_01 clrf T_10 clrf V_01 clrf V_10 movlw .40 movwf count_data ; Активируем датчик bcf Shina_D ; прижимаем шину к земле Точка "А" movlw .118 ; ____________________ movwf Reg_1 ; Пауза 25 мксек movlw .33 ; movwf Reg_2 ; decfsz Reg_1,F ; goto $-1 ; call Indicat ; decfsz Reg_2,F ; goto $-3 ; ____________________ bsf Shina_D ; отпускаем шину (точка Б) movlw .15 ; пауза call Delay_1 ; ждем 60 us (примерно точка В) btfsc Data_ ; если на нем по прежнему 1 goto Main ; значит датчик не ответил. movlw .20 ; пауза call Delay_1 ; ждем 80 us (примерно точка Д) btfss Data_ goto Main btfsc Data_ goto $-1 ; Считываем сорок бит информации Read_data btfss Data_ ; - начала бита данных. goto $-1 movlw .8 ; Появился фронт импульса передачи бита (точка И) call Delay_1 ; поэтому ждем 32 мксек bcf _C ; Сбрасываем флаг переноса btfss Data_ ; проверяем состояние шины goto shift ; На шине "0" - едем на сдвиг регистров btfsc Data_ ; На шине еще "1" - ждем goto $-1 ; пока она кончится bsf _C ; Датчик прд "1" заносим ее в "С" shift rlf Contr_summa,f ; Вдвигаем БИТ в регистры rlf T_01,f rlf T_10,f rlf V_01,f rlf V_10,f decfsz count_data,f goto Read_data goto bin_10 ; идем на преобразование ;жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж ; Подпрограмма преобразования для 7-ми сегментного индикатора ; "1" - соответствует горящему сегменту, т. к. индикатор с общим КАТОДОМ Table addwf PCL,f ; fhgedcba retlw b'00111111' ;Цифра "0" retlw b'00000110' ;Цифра "1" retlw b'01011011' ;Цифра "2" retlw b'01001111' ;Цифра "3" retlw b'01100110' ;Цифра "4" retlw b'01101101' ;Цифра "5" retlw b'01111101' ;Цифра "6" retlw b'00000111' ;Цифра "7" retlw b'01111111' ;Цифра "8" retlw b'01101111' ;Цифра "9" retlw b'01110111' ;Цифра "А" retlw b'01111100' ;Цифра "B" retlw b'00111001' ;Цифра "C" retlw b'01011110' ;Цифра "D" retlw b'01111001' ;Цифра "E" retlw b'01110001' ;Цифра "F" retlw b'00000000' ;Пустое место (код 10h) retlw b'01000000' ;Тире ;жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж Delay_1 movwf Reg_4 nop decfsz Reg_4,f goto $-2 RETURN ;------------------------------------------------------------ ifndef DHT22 ; Преобразование 1но байтного в двоично-десятичное bin_10 movlw .8 movwf count_2_10 clrf led_vlaj_H clrf led_vlaj_L clrf led_vlaj_0L preobraz rlf V_10,f ; Сдвигаем регистры 8 раз. rlf led_vlaj_0L,f rlf led_vlaj_L,f rlf led_vlaj_H,f decfsz count_2_10,f goto adjdec goto Raspred adjdec movlw 0x33 addwf led_vlaj_H,f addwf led_vlaj_L,f addwf led_vlaj_0L,f movlw 0x03 btfss led_vlaj_H,3 subwf led_vlaj_H,f btfss led_vlaj_L,3 subwf led_vlaj_L,f btfss led_vlaj_0L,3 subwf led_vlaj_0L,f movlw 0x30 btfss led_vlaj_H,7 subwf led_vlaj_H,f btfss led_vlaj_L,7 subwf led_vlaj_L,f btfss led_vlaj_0L,7 subwf led_vlaj_0L,f goto preobraz ; После преобразования сотни процентов влажности будет в регистре led_vlaj_L ; Десятки процентов будут в старшей тетраде led_vlaj_0L, ; Еденицы процентов - младшая тетрада led_vlaj_0L Raspred movfw led_vlaj_L movwf led_vlaj_H swapf led_vlaj_0L,w andlw b'00001111' movwf led_vlaj_L movlw b'00001111' andwf led_vlaj_0L,f ;call delay_1s bcf PORTA,0 goto Main endif ;------------------------------------------------------------- ifdef DHT22 bin_10 call div10 ifdef digit3 movf V_10,w ; movwf led_vlaj_H endif movf vlaj_2_10,w ; movwf V_01 clrf V_10 call div10 movf V_10,w ; movwf led_vlaj_0L movf vlaj_2_10,w movwf led_vlaj_L bcf PORTA,0 goto Main ;----------------div10--------------------------------------- ; in V_10,V_10, result vlaj_2_10, residual V_10 div10 clrf vlaj_2_10 movlw .7 movwf count_2_10 rlf V_01,f rlf V_10,f roll rlf V_01,f rlf V_10,f movlw 0x0A subwf V_10,w btfss STATUS,C goto r1 movlw 0x0A subwf V_10,f bsf STATUS,C rlf vlaj_2_10; result goto r2 r1 bcf STATUS,C rlf vlaj_2_10; result r2 decfsz count_2_10,f goto roll return ;------------------------------------------------------------- endif ;жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж delay_1s movlw .254 movwf Reg_1 movlw .17 movwf Reg_2 movlw .6 movwf Reg_3 decfsz Reg_1,F goto $-1 call Indicat decfsz Reg_2,F goto $-4 decfsz Reg_3,F goto $-6 RETURN ;ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ end