Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[13.58.82.79] |
|
Сообщ.
#1
,
|
|
|
Не могу разобраться почему всегда горит сегмент f, помогите разобраться
;****************************************************** ;*листинг исходной программы ;****************************************************** #include <P16F84.inc> __CONFIG _XT_OSC & _PWRTE_OFF & _WDT_OFF & _CP_OFF TEMPA EQU 0x0C TEMPB EQU 0x0D COUNT1 EQU 0x0E COUNT2 EQU 0x0F COUNT3 EQU 0x10 ;****************************************************** ;*определение меток замены текста ;****************************************************** #DEFINE BA1 PORTA,0 ;динамик BA1 #DEFINE VD2 PORTA,1 ;светодиод VD2 #DEFINE SA1 PORTA,2 ;тумблер SA1 #DEFINE SA2 PORTA,3 ;тумблер SA2 #DEFINE SB1 PORTA,4 ;кнопка SB1 #DEFINE SB2 PORTB,0 ;кнопка SB2 #DEFINE HL1_A PORTB,1 ;индикатор-сегмент A #DEFINE HL1_B PORTB,2 ;индикатор-сегмент B #DEFINE HL1_C PORTB,3 ;индикатор-сегмент C #DEFINE HL1_D PORTB,4 ;индикатор-сегмент D #DEFINE HL1_E PORTB,5 ;индикатор-сегмент D #DEFINE HL1_F PORTB,6 ;индикатор-сегмент E #DEFINE HL1_G PORTB,7 ;индикатор-сегмент F ;****************************************************** ;*исполняемая программа ;****************************************************** ORG 0x000 ;установка начального адреса по ;сбросу GOTO BEGIN ;переход на начало программы ORG 0x005 ;установка начального адреса ;размещения программы BEGIN CALL INIT_PORTS ;вызов подпрограммы ;инициализации портов МК GOTO Main ;***************************************************** ;*программа пользователя ; ;***************************************************** ;основная программа Main m1 CLRF PORTB MOVLW 0x00 CALL CodeTable MOVWF PORTB CALL Pause MOVLW 0x01 CALL CodeTable MOVWF PORTB CALL Pause MOVLW 0x02 CALL CodeTable MOVWF PORTB CALL Pause MOVLW 0x03 CALL CodeTable MOVWF PORTB CALL Pause MOVLW 0x04 CALL CodeTable MOVWF PORTB CALL Pause MOVLW 0x05 CALL CodeTable MOVWF PORTB CALL Pause MOVLW 0x06 CALL CodeTable MOVWF PORTB CALL Pause MOVLW 0x07 CALL CodeTable MOVWF PORTB CALL Pause MOVLW 0x08 CALL CodeTable MOVWF PORTB CALL Pause MOVLW 0x09 CALL CodeTable MOVWF PORTB CALL Pause GOTO m1 ;=============================================================== CodeTable addwf PCL,F; Содержимое счетчика команд PCL = PCL + W RETLW 0x80 ;возврат из подпрограммы с 80 в W RETLW 0xF2 ;возврат из подпрограммы с F2 в W RETLW 0x48 ;возврат из подпрограммы с 48 в W RETLW 0x60 ;возврат из подпрограммы с 60 в W RETLW 0x32 ;возврат из подпрограммы с 32 в W RETLW 0x25 ;возврат из подпрограммы с 25 в W RETLW 0x04 ;возврат из подпрограммы с 04 в W RETLW 0xF0 ;возврат из подпрограммы с F0 в W RETLW 0x00 ;возврат из подпрограммы с 00 в W RETLW 0x20 ;возврат из подпрограммы с 20 в W ;=============================================================== ;Пауза 0.5 секунды Pause MOVLW 0x01 movwf COUNT1 m2 decfsz COUNT1, F goto m2 return INIT_PORTS ;подпрограмма инициализации ;портов MOVLW 0xFF ;установка линий портов MOVWF PORTA ;A и B в единичное MOVWF PORTB ;состояние BSF STATUS,RP0 ;переход на банк 1 MOVLW 0x1C ;настройка линий RA0 и MOVWF TRISA ;RA1 порта A на вывод – ;остальных – на ввод MOVLW 0x01 ;настройка линии RB0 MOVWF TRISB ;порта B на ввод - ;остальных – на вывод BCF STATUS,RP0 ;возврат в банк 0 RETURN end |
Сообщ.
#2
,
|
|
|
Цитата Desam @ Не могу разобраться почему всегда горит сегмент f Потому, что состояние пина RB7 всегда активно (либо нуль, либо 1, неизвестно, какой индикатор) и не меняется со временем, или меняется на неактивное на столь малый промежуток времени, что глаз не успевает оценить гашение светодиода сегмента. |
Сообщ.
#3
,
|
|
|
;****************************************************** ;*листинг исходной программы ;****************************************************** #include <P16F84.inc> __CONFIG _XT_OSC & _PWRTE_OFF & _WDT_OFF & _CP_OFF cblock 0x0c TEMPA TEMPB TEMPC COUNT1 COUNT2 COUNT3 endc ;****************************************************** ;*определение меток замены текста ;****************************************************** #DEFINE BA1 PORTA,0 ;динамик BA1 #DEFINE VD2 PORTA,1 ;светодиод VD2 #DEFINE SA1 PORTA,2 ;тумблер SA1 #DEFINE SA2 PORTA,3 ;тумблер SA2 #DEFINE SB1 PORTA,4 ;кнопка SB1 #DEFINE SB2 PORTB,0 ;кнопка SB2 #DEFINE HL1_A PORTB,1 ;индикатор-сегмент A #DEFINE HL1_B PORTB,2 ;индикатор-сегмент B #DEFINE HL1_C PORTB,3 ;индикатор-сегмент C #DEFINE HL1_D PORTB,4 ;индикатор-сегмент D #DEFINE HL1_E PORTB,5 ;индикатор-сегмент D #DEFINE HL1_F PORTB,6 ;индикатор-сегмент E #DEFINE HL1_G PORTB,7 ;индикатор-сегмент F ;[Блок макросов]=========================================================== bank0 macro ;Включение банка 0 bcf STATUS,RP0 endm bank1 macro ;Включение банка 1 bsf STATUS,RP0 endm ;****************************************************** ;*исполняемая программа ;****************************************************** ORG 0x0000 ;установка начального адреса по ;сбросу GOTO BEGIN ;переход на начало программы ORG 0x0004 ;пригодится, если будешь использовать прерывания retfie ;=============================================================== CodeTable andlw 0x0f addwf PCL,F; Содержимое счетчика команд PCL = PCL + W RETLW 0x7e ;0 RETLW 0x0c ;1 RETLW 0xb6 ;2 RETLW 0x9e ;3 RETLW 0xcc ;4 RETLW 0xda ;5 RETLW 0xfa ;6 RETLW 0x0e ;7 RETLW 0xfe ;8 RETLW 0xde ;9 RETLW 0xee ;A RETLW 0xf8 ;b RETLW 0x72 ;C RETLW 0xbc ;d RETLW 0xf2 ;E RETLW 0xe2 ;F ;=============================================================== BEGIN CALL INIT_PORTS ;вызов подпрограммы ;инициализации портов МК movlw 0x00 movwf TEMPA GOTO Main ;***************************************************** ;*программа пользователя ; ;***************************************************** ;основная программа Main: movf TEMPA, w CALL CodeTable MOVWF PORTB CALL Pause incf TEMPA, f call Beep GOTO Main Beep: movlw .300 movwf TEMPC BEEP_TONE: movlw 0xff movwf TEMPB bcf BA1 DELAY_0: decfsz TEMPB, f goto DELAY_0 movlw 0xff movwf TEMPB bsf BA1 DELAY_1: decfsz TEMPB, f goto DELAY_1 decfsz TEMPC, f goto BEEP_TONE return ;Ждём нажатия кнопки SB2 Pause: btfsc PORTB,0 goto Pause Pause1: btfss PORTB,0 goto Pause1 return INIT_PORTS ;подпрограмма инициализации ;портов MOVLW 0xFF ;установка линий портов MOVWF PORTA ;A и B в единичное MOVWF PORTB ;состояние bank1 ;переход на банк 1 MOVLW 0x1C ;настройка линий RA0 и MOVWF TRISA ;RA1 порта A на вывод -[attach=#0][/attach] ;остальных - на ввод MOVLW 0x01 ;настройка линии RB0 MOVWF TRISB ;порта B на ввод - ;остальных - на вывод bank0 ;возврат в банк 0 RETURN end |
Сообщ.
#4
,
|
|
|
;****************************************************** ;*листинг исходной программы ;****************************************************** #include <P16F84.inc> __CONFIG _XT_OSC & _PWRTE_OFF & _WDT_OFF & _CP_OFF cblock 0x0c TEMPA TEMPB TEMPC COUNT1 COUNT2 COUNT3 endc ;****************************************************** ;*определение меток замены текста ;****************************************************** #DEFINE BA1 PORTA,0 ;динамик BA1 #DEFINE VD2 PORTA,1 ;светодиод VD2 #DEFINE SA1 PORTA,2 ;тумблер SA1 #DEFINE SA2 PORTA,3 ;тумблер SA2 #DEFINE SB1 PORTA,4 ;кнопка SB1 #DEFINE SB2 PORTB,0 ;кнопка SB2 #DEFINE HL1_A PORTB,1 ;индикатор-сегмент A #DEFINE HL1_B PORTB,2 ;индикатор-сегмент B #DEFINE HL1_C PORTB,3 ;индикатор-сегмент C #DEFINE HL1_D PORTB,4 ;индикатор-сегмент D #DEFINE HL1_E PORTB,5 ;индикатор-сегмент D #DEFINE HL1_F PORTB,6 ;индикатор-сегмент E #DEFINE HL1_G PORTB,7 ;индикатор-сегмент F ;[Блок макросов]=========================================================== bank0 macro ;Включение банка 0 bcf STATUS,RP0 endm bank1 macro ;Включение банка 1 bsf STATUS,RP0 endm ;****************************************************** ;*исполняемая программа ;****************************************************** ORG 0x0000 ;установка начального адреса по ;сбросу GOTO BEGIN ;переход на начало программы ORG 0x0004 ;пригодится, если будешь использовать прерывания retfie ;=============================================================== CodeTable andlw 0x0f addwf PCL,F; Содержимое счетчика команд PCL = PCL + W RETLW 0x7e ;0 RETLW 0x0c ;1 RETLW 0xb6 ;2 RETLW 0x9e ;3 RETLW 0xcc ;4 RETLW 0xda ;5 RETLW 0xfa ;6 RETLW 0x0e ;7 RETLW 0xfe ;8 RETLW 0xde ;9 RETLW 0xee ;A RETLW 0xf8 ;b RETLW 0x72 ;C RETLW 0xbc ;d RETLW 0xf2 ;E RETLW 0xe2 ;F ;=============================================================== BEGIN CALL INIT_PORTS ;вызов подпрограммы ;инициализации портов МК movlw 0x00 movwf TEMPA GOTO Main ;***************************************************** ;*программа пользователя ; ;***************************************************** ;основная программа Main: movf TEMPA, w CALL CodeTable MOVWF PORTB CALL Pause incf TEMPA, f call Beep GOTO Main Beep: movlw .300 movwf TEMPC BEEP_TONE: movlw 0xff movwf TEMPB bcf BA1 DELAY_0: decfsz TEMPB, f goto DELAY_0 movlw 0xff movwf TEMPB bsf BA1 DELAY_1: decfsz TEMPB, f goto DELAY_1 decfsz TEMPC, f goto BEEP_TONE return ;Ждём нажатия кнопки SB2 Pause: btfsc PORTB,0 goto Pause Pause1: btfss PORTB,0 goto Pause1 return INIT_PORTS ;подпрограмма инициализации ;портов MOVLW 0xFF ;установка линий портов MOVWF PORTA ;A и B в единичное MOVWF PORTB ;состояние bank1 ;переход на банк 1 MOVLW 0x1C ;настройка линий RA0 и MOVWF TRISA ;RA1 порта A на вывод -[attach=#0][/attach] ;остальных - на ввод MOVLW 0x01 ;настройка линии RB0 MOVWF TRISB ;порта B на ввод - ;остальных - на вывод bank0 ;возврат в банк 0 RETURN end |
Сообщ.
#5
,
|
|
|
Прикреплённый файл7SEGMENT.rar (13,72 Кбайт, скачиваний: 117)
|
Сообщ.
#6
,
|
|
|
Я додумал ВАШ проект и вот что получилось:
1. Если удерживая SB1 включить питание девайс перейдет в тестовый режим, сигнализируя об этом высвечиванием сиввола "t" на индикаторе и троекратным попискиванием. Выход из этого режима SB2 2. Тумблерами SA1 и SA2 задают режим работы 0, 1, 2, и 3 в двоичном коде. Режимы соответствуют частоте моргания светодиода VD2 3. Нажатие на SB2 приводит к циклическому перебору на индикаторе чисел от 0 до F, сопровождая каждое нажатие писком динамика З.Ы. Никогда на ломайте рук или ног! Времени свободного много, а толку мало! Проект в аттаче. Исходник, Протеус модель и HEX Прикреплённый файл7SEGMENT.rar (14,36 Кбайт, скачиваний: 129) |