Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 17.11.2017, 12:29  
vavilon79
Прохожий
 
Регистрация: 30.10.2017
Сообщений: 7
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
vavilon79 на пути к лучшему
По умолчанию pic16f628a+lcd1601

Добрый день. Уважаемые знатоки подскажите в чем может быть проблема. Подключаю к м-к PIC16F628A LCD1601 (экран синий, контроллер не известный). Инициализацию выполняю по LCD_HD44780. Инициализация дисплея проходит если несколько раз нажать на кнопку RESET (определяю по тому что горят все 16 квадратиков, но не пойму почему горят первые 8 квадратов полностью, а вторые 8 только на половину), изначально инициализация не проходит (определяю по свечению только первых 8 квадратиков, которые горят полностью).
Но если инициализация проходит (это я только предполагаю, как проверить наверняка не знаю), то почему не высвечивается символы на экране.
Схема:
Нажмите, чтобы открыть спойлер

main.asm
Нажмите, чтобы открыть спойлер
Код:
	LIST	    p=PIC16F628A
	#include    ‹P16F628A.INC›
	
	#include    "my_init.inc"
	#include    "my_macro.inc"
	
	__CONFIG _FOSC_XT & _WDTE_OFF & _PWRTE_OFF & _MCLRE_ON & _BOREN_OFF & _LVP_OFF & _CPD_OFF & _CP_OFF
	;__CONFIG 3F61H
; **************************************************  ***************************
;   Основная программа
	    
	    org	0
; **************************************************  ***************************
  	    movlw   .7		; 00000111
	    movwf   CMCON	; Отключаем компораторы
	    
	    call    LCD_Init		; инициализация дисплея
	    call    PressSET		; Press SET
START:	    
	    ;LCD_Clear
	    goto	START
	    #include	"my_sub.inc"
	    end


my_init.inc
Нажмите, чтобы открыть спойлер

Код:
; инициализируем переменные для подключения LCD экрана
#define	LCD_RS	PORTA,RA1
#define	LCD_RW	PORTA,RA2
#define	LCD_E	PORTA,RA3
#define	LCD_D4	PORTB,RB0
#define	LCD_D5	PORTB,RB1
#define	LCD_D6	PORTB,RB2
#define	LCD_D7	PORTB,RB3

; инициализируем переменные для подключения кнопок
;#define	BUTTON_SET	PORTA,RA1
;#define	BUTTON_PLUS	PORTA,RA2
;#define	BUTTON_MINUS	PORTA,RA3
;#define	BUTTON_ON_LIGHT	PORTB,RB0
;#define	TRIS_BUT_SET	TRISA,RA1
;#define	TRIS_BUT_PLUS	TRISA,RA2
;#define	TRIS_BUT_MINUS	TRISA,RA3
;#define	TRIS_BUT_ON_LIGHT	TRISB,RB0

; 1-Wire устройство
;#define	DQ	PORTA,RA0
;#define	TRIS_DQ	TRISA,RA0

; Определяем константы и заносим их в память 0 Банк
	CBLOCK H'20'
	    Reg_1		    ; переменная для задержки времени			20h
	    Reg_2		    ; переменная для задержки времени			21h
	    Reg_3		    ; переменная для задержки времени			22h
	    Reg_4		    ; переменная для задержки времени			23h
	    Reg_5		    ; переменная для задержки времени			24h
	    Delay		    ; переменная для задержки времени			25h
	    TMP1		    ; переменная для временного хранения данных		26h
	    TMP2		    ; переменная для временного хранения данных		27h
	    TMP3		    ; переменная для временного хранения данных		28h
	    TMP4
        ENDC
	; flagProg = b'xxxxxxxy' y - разрешение проверки флага занятости BF, y=0 не проверяем, y=1 проверяем флаг занятости
	
	; область памяти регистров 70h - 7Fh видна во всех банках памяти контролера
	CBLOCK H'70'
	    W_TEMP		    ; переменнта для прерываний временный аккамулятор	70h
	    STATUS_TEMP		    ; переменнта для прерываний временный STATUS	71h
	    PCLATH_TEMP		    ; переменнта для прерываний временный PCLATH	72h
	    FSR_osn		    ; переменнта для прерываний временный FSR_osn	73h
            FSR_prer		    ; переменнта для прерываний временный FSR_prer	74h
	    _status_prog_	    ; переменная для статуса работы программы		75h
        ENDC


my_macro.inc
Нажмите, чтобы открыть спойлер

Код:
	    errorlevel -302	    ; Отключаем предуприждение для данного макроса при компелировании
	    
BANK0	    MACRO		    ; Макрос для выбора RAM BANK 0
	    bcf	    STATUS,RP0
	    bcf     STATUS,RP1
	    ENDM

BANK1	    MACRO		    ; Макрос для выбора RAM BANK 1
	    bsf     STATUS,RP0
	    bcf     STATUS,RP1
	    ENDM

BANK2	    MACRO		    ; Макрос для выбора RAM BANK 2
	    bcf     STATUS,RP0
	    bsf     STATUS,RP1
	    ENDM

BANK3	    MACRO		    ; Макрос для выбора RAM BANK 3
	    bsf     STATUS,RP0
	    bsf     STATUS,RP1
	    ENDM

Clear_PORT  MACRO
	    bcf	    LCD_RS
	    bcf	    LCD_RW
	    bcf	    LCD_E
	    bcf	    LCD_D4
	    bcf	    LCD_D5
	    bcf	    LCD_D6
	    bcf	    LCD_D7
	    ENDM

Strob_LCD   MACRO		    ; Макрос для строба LCD
	    bcf	    LCD_E	    ; E=0
	    nop
	    bsf     LCD_E	    ; E=1
            nop
	    nop			    ; › 450 nS
	    bcf     LCD_E	    ; E=0
	    nop
	    ENDM
	    
LCD_IN      MACRO		    ; Макрос для вывода на LCD информацию
	    BANK1
	    bcf	    LCD_RS
	    bcf	    LCD_RW
	    bcf	    LCD_E
	    bcf	    LCD_D4
	    bcf	    LCD_D5
	    bcf	    LCD_D6
	    bcf	    LCD_D7
	    BANK0
	    Clear_PORT
	    ENDM

; При выполнении MPU программы с проверкой флага занятости BF (DB7), необходимо 1/2fosc (частоты)
; необходимо для выполнения следующей инструкции по падающему краю сигнала “E” после того, 
; как флаг занятости (DB7) переходит в “Low”.
; время выполнения 10 * nop
LCD_OUT     MACRO		    ; Макрос для получения с LCD информации
	    bsf	    LCD_RW	    ; RW=1
	    BANK1
	    bsf	    LCD_D4
	    bsf	    LCD_D5
	    bsf	    LCD_D6
	    bsf	    LCD_D7
	    BANK0
	    nop
	    ENDM

LCD_Clear   MACRO		    ; Макрос для выбора очистки LCD
	    movlw   b'00000001'
	    call    LCDcom
	    movlw   .2		    ; устанавливаем задержку в 1650 микросекунд или 1,65 мили секунд
	    call    delay_65mS
	    ENDM
	    
LCD_Home    MACRO		    ; Макрос для перевода курсора в начало строки LCD
	    movlw   b'00000001'
	    call    LCDcom
	    movlw   .165	    ; устанавливаем задержку в 1650 микросекунд или 1,65 мили секунд
	    call    Delay_N10mkS
	    ENDM


my_sub.inc
Нажмите, чтобы открыть спойлер

Код:
; процедура инициализации десплея LCD
LCD_Init:
	    LCD_IN			; устанавливаем PIC порт подключения к LCD на передачу информации от PIC к LCD
	    
	    ; первая команда инициализации
	    ; устанавливаем 8 bit интерфейс b'0011'
	    ;bcf	    LCD_RS		; RS	= 0
	    ;bcf	    LCD_RW		; RW	= 0
	    
	    ;bcf	    LCD_D4		; D4	= 0
	    ;bcf	    LCD_D5		; D5	= 0
	    bsf	    LCD_D6		; D6	= 1
	    bsf	    LCD_D7		; D7	= 1
	    ;call    delay_50mS		; Задержка 50 ms
	    Strob_LCD
	    
	    ; вторая команда инициализации
	    ; устанавливаем 8 bit интерфейс b'0011'
	    ;call    delay_4600mkS	; Задержка 4,6 ms
	    Strob_LCD
	    
	    ; третья команда инициализации
	    ; устанавливаем 8 bit интерфейс b'0011'
	    call    delay_100mkS	; Задержка 100 mks
	    Strob_LCD
	    
	    ; ***********   инициализация окончена,
	    ; ***********   настраиваем дисплей
	    ;call    Basy_LCD		; ожидание готовности LCD
	    
	    ; При включении дисплея, он настраивается следующим образом:
	    ;	1. Очистка дисплея
	    ;	2. Набор функций:
	    ;	    - DL=1; 8 bit
	    ;	    - N =0; 1 строчный дисплей
	    ;	    - F =0; шрифт символа 5х8
	    ;	3. Дисплей вкл/откл:
	    ;	    - D =0; отображение выключено
	    ;	    - C =0; курсор выключен
	    ;	    - B =0; мигание курсора выключено
	    ;	4. Установка режима ввода данных
	    ;	    - I/D=1; при вводе позиция курсора увеличивается на 1
	    ;	    - S  =0; без сдвига экрана
	    
	    
	    
	    ; c этого момента байт посылается в 2 этапа, старший бит (тетрада), потом младший бит (тетрада)
	    ; устанавливаем Function Set
	    ; утанавливаем 4 битную шину передачи данных, линии дисплея, шрифт - 001DNF**
	    ; D=0 это 4 bit, D=1 это 8 bit
	    ; N=0 это 1 линия дисплея, N=1 это 2 линии дисплея
	    ; F=0 это 5х7 шрифт, F=1 это 5х10 шрифт
	    movlw   b'00101000'
            call    LCDcom
	    
	    ; устанавливаем смещение курсора или дисплея 	- 0001 SR**
	    ; S=0 смещается курсор, S=1 смещается дисплей
	    ; R=0 смещение в лево, R=1 смещение в право
	    ;movlw  b'00010100'
            ;call   LCDcom
	    
	    ; утанавливаем дисплей и курсор вкл/откл, также мигание курсора	- 00001DCB
	    ; D=1 дисплей включен, D=0 дисплей выключен,
	    ; C=1 курсор включен, C=0 курсор выключен,
	    ; B=1 курсор мигает, B=0 курсор не мигает
	    movlw   b'00001100'
            call    LCDcom
	    
	    ; это самая последняя команда Entry mode set
	    ; Устанавливаем направление движения	- 000001DS
	    ; D=1 перемещение курсора в право	    D=0 перемещение курсора в лево
	    ; S=1 разрешение сдвига экрана	    S=0 запрет сдвига экрана
            movlw   b'00000110'
            call    LCDcom		; сдвиг курсора вправо
	    
	    ; очистка дисплея
            ;LCD_Clear
	;call    led_on
	    return

; процедура отправки байта команды (LCDcom) или данных (LCDdata) на LCD
; входные данные	W
; тип входных данных	1 байт b'xxxxxxxx'
LCDcom:	    bcf	    LCD_RS		; RS=0 команда
            goto    LCDdat1
LCDdata:    bsf	    LCD_RS		; RS=1 данные
LCDdat1	    bcf	    LCD_RW		; RW=0 послать в LCD
	    ; необходимо занести в аккаулятор 0011 хххх
	    ; где хххх это старшая тетрада байта
	    movwf   TMP1		; сохроняем аккамулятор, т.к. там хранится данные или команда 1 байт
	    movlw   b'11110000'	; указываем что хотим получить старшую тетраду
	    andlw   TMP1		; заносим в аккамулятор старшую тетраду, младшая = 0
	    movwf   TMP2		; переносим аккамулятор в регистр старшая тетрада=TMP1, младшая = 0
	    swapf   TMP2,1		; меняем младшая тетрада=TMP1,  старшая тетрада= 0, сохроняем в регистре
	    movlw   b'00110000'	; готовим к типу 0011 хххх
	    iorwf   TMP2,0		; приводим к типу 0011 хххх и заносим в аккамулятор
	    call    Send_4bit_LCD	; посылаем старшую тетраду
	    
	    ; необходимо занести в аккаулятор 0011 хххх
	    ; где хххх это младшая тетрада байта
	    movlw   b'00001111'	; указываем что хотим получить младшую тетраду
	    andlw   TMP1		; заносим в аккамулятор младшую тетраду, старшая = 0
	    movwf   TMP2		; переносим аккамулятор в регистр старшая тетрада = 0, младшая=TMP1
	    movlw   b'00110000'	; готовим к типу 0011 хххх
	    iorwf   TMP2,0		; приводим к типу 0011 хххх и заносим в аккамулятор
	    call    Send_4bit_LCD	; посылаем старшую тетраду
	    
	    call    delay_100mkS
	    
	    
	    return
	    
	    
	    ; переводим микроконтроллер на прием от LCD
	    ;LCD_OUT
	    ; когда дисплей занят на ноге D7 LCD логическая 1
	    ; если на этой ноге ноль, то дисплей свободен
	    ;btfss   LCD_D7
	    ;return
	    ;bsf	    PORTB,4
	    ; получаем старшую тетраду байта
	    ;bsf     LCD_E		; E=1
            ;nop				; › 450 nS
	    ;bcf     LCD_E
	    ; получаем младшую тетраду байта
	    ;nop
	    ;bsf     LCD_E		; E=1
            ;nop				; › 450 nS
	    ;bcf     LCD_E
	    ;LCD_IN
	    ;nop
	    return

; процедура отправки 4 бит на LCD
; входящий параметр W
; тип данных 4 бит b'xxxx'
Send_4bit_LCD:
	    movwf	TMP3
	    ; производим обнуление шины порта микроконтролера
	    bcf		LCD_D4
	    bcf		LCD_D5
	    bcf		LCD_D6
	    bcf		LCD_D7
	    
	    ; если определенный бит должен быть = 1, то устанавливаем его, иначе пропускаем
	    btfsc	TMP3,0		; проверяем 0 бит != 0
	    bsf		LCD_D4		; устанавливаем D4 в 1 если 0 бит != 0
	    
	    btfsc	TMP3,1		; проверяем 1 бит != 0
	    bsf		LCD_D5		; устанавливаем D5 в 1 если 1 бит != 0
	    
	    btfsc	TMP3,2		; проверяем 2 бит != 0
	    bsf		LCD_D6		; устанавливаем D6 в 1 если 2 бит != 0
	    
	    btfsc	TMP3,3		; проверяем 3 бит != 0
	    bsf		LCD_D7		; устанавливаем D7 в 1 если 3 бит != 0
	    
	    call	LCD_strob	; стробируем что окончена посылка
	    return

LCD_strob:  
	    bcf	    LCD_E		; E=0
	    nop
	    bsf     LCD_E		; E=1
            nop
	    nop				; › 450 nS
	    bcf     LCD_E		; E=0, после ожидание должно быть больше 37 микро секунд
	    ;movlw   .100		; ждем 100mks
	    ;call    delay_255mkS
	    nop
	    return

;=================================================  ==============================
;		    Модуль готовности LCD
;=================================================  ==============================
Basy_LCD:
	    ; переходим в режим приема от LCD
	    bcf	    LCD_E
	    BANK1
	    ;bsf	    TRIS_D4
	    ;bsf	    TRIS_D5
	    ;bsf	    TRIS_D6
	    ;bsf	    TRIS_D7
	    BANK0
	    bcf	    LCD_RS
	    bsf	    LCD_RW
	    bsf	    LCD_E
	    btfsc   LCD_D7
	    ;goto    Basy_LCD
	    bcf	    LCD_E
	    bcf	    LCD_RW
	    
	    ; переходим в режим передачи на LCD
	    BANK1
	    ;bcf	    TRIS_D4
	    ;bcf	    TRIS_D5
	    ;bcf	    TRIS_D6
	    ;bcf	    TRIS_D7
	    BANK0
	    
	    return
	    
; выводим на экран слово Press SET
PressSET:
	    movlw	b'01010000'	    ; 'P'
	    call	LCDdata
	    movlw	b'01110010'	    ; 'r'
	    call	LCDdata
	    movlw	b'01100101'	    ; 'e'
	    call	LCDdata
	    movlw	b'01110011'	    ; 's'
	    call	LCDdata
	    movlw	b'01110011'	    ; 's'
	    call	LCDdata
	    movlw	b'00100000'	    ; ' '
	    call	LCDdata
	    movlw	b'01010011'	    ; 'S'
	    call	LCDdata
	    movlw	b'01000101'	    ; 'E'
	    call	LCDdata
	    ;movlw	b'01010100'	    ; 'T'
	    ;call	LCDdata
	    return

;
;******** п/п задержки **********
delay_50mS:
	    movlw       .238
            movwf       Reg_1
            movlw       .65
            movwf       Reg_2
            decfsz      Reg_1,F
            goto        $-1
            decfsz      Reg_2,F
            goto        $-3
            nop
	    return
	    
delay_4600mkS:
	    movlw       .248
            movwf       Reg_1
            movlw       .6
            movwf       Reg_2
            decfsz      Reg_1,F
            goto        $-1
            decfsz      Reg_2,F
            goto        $-3
            nop
	    return
	    
delay_100mkS:
	    movlw       .33
            movwf       Reg_1
            decfsz      Reg_1,F
            goto        $-1
	    return
;********************************


Думал что время задержек не хватает(везде в мануалах к LCD пишут не меньше указанного). Время выставлял и по 250 мили сек. Где то на просторах форума прочитал что компараторы мешают, отключил, результат не поменялся. LCD подключал к ARDUINO все работает как нужно. Понимаю что проблема с инициализацией, но не знаю куда копать.
Миниатюры:
Нажмите на изображение для увеличения
Название: схема.jpg
Просмотров: 0
Размер:	294.5 Кб
ID:	121551  
Реклама:
vavilon79 вне форума  
Непрочитано 17.11.2017, 14:46  
j-Roger
Гражданин KAZUS.RU
 
Регистрация: 17.06.2008
Адрес: Украина
Сообщений: 664
Сказал спасибо: 360
Сказали Спасибо 743 раз(а) в 353 сообщении(ях)
j-Roger на пути к лучшему
По умолчанию Re: pic16f628a+lcd1601

PIC16F628A
Возможно, стОит проверить своевременную настройку портов на
ввод/вывод (все, что связано с регистрами TRIS)
j-Roger вне форума  
Непрочитано 17.11.2017, 14:48  
vavilon79
Прохожий
 
Регистрация: 30.10.2017
Сообщений: 7
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
vavilon79 на пути к лучшему
По умолчанию Re: pic16f628a+lcd1601

Если множество раз (больше 20) нажать на кнопку RESET двойным кликом, т.е. быстро, то экран становится пустым (квадратики пропадают, но он светится, как будто произошла очистка экрана)
vavilon79 вне форума  
Непрочитано 17.11.2017, 14:49  
vavilon79
Прохожий
 
Регистрация: 30.10.2017
Сообщений: 7
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
vavilon79 на пути к лучшему
По умолчанию Re: pic16f628a+lcd1601

Сообщение от j-Roger Посмотреть сообщение
PIC16F628A
Возможно, стОит проверить своевременную настройку портов на
ввод/вывод (все, что связано с регистрами TRIS)
вроде как проверял порты, но еще раз пересмотрю. Спасибо.
vavilon79 вне форума  
Непрочитано 17.11.2017, 15:32  
OakRidge
Почётный гражданин KAZUS.RU
 
Аватар для OakRidge
 
Регистрация: 16.05.2015
Адрес: Болгария
Сообщений: 1,460
Сказал спасибо: 286
Сказали Спасибо 1,125 раз(а) в 540 сообщении(ях)
OakRidge на пути к лучшему
По умолчанию Re: pic16f628a+lcd1601

Такое вобще нельзя писать
Clear_PORT MACRO
bcf LCD_RS
bcf LCD_RW
bcf LCD_E
bcf LCD_D4
bcf LCD_D5
bcf LCD_D6
bcf LCD_D7

Надо
Clear_PORT MACRO
bcf LCD_RS
Delay_uS(5)
bcf LCD_RW
Delay_uS(5)
bcf LCD_E
Delay_uS(5)
bcf LCD_D4
Delay_uS(5)
bcf LCD_D5
Delay_uS(5)
bcf LCD_D6
Delay_uS(5)
bcf LCD_D7

Такое тоже
Strob_LCD MACRO ; Макрос для строба LCD
bcf LCD_E ; E=0
nop
bsf LCD_E ; E=1
nop

1 ноп 1 мкс. Может не хватить саму ножку пика передернуть. Другой вопрос отработает ли ЖКИ такой короткий импульс.
OakRidge вне форума  
Непрочитано 17.11.2017, 17:06  
vavilon79
Прохожий
 
Регистрация: 30.10.2017
Сообщений: 7
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
vavilon79 на пути к лучшему
По умолчанию Re: pic16f628a+lcd1601

Сообщение от OakRidge Посмотреть сообщение
1 ноп 1 мкс. Может не хватить саму ножку пика передернуть. Другой вопрос отработает ли ЖКИ такой короткий импульс.
Объясните пожалуйста почему нужна задержка 5 тактов после каждой команды в макросе. Со стробом тоже не понял даташит говорит что для строба достаточно больше 450 наноСек у меня 2 микроСек
vavilon79 вне форума  
Непрочитано 17.11.2017, 18:35  
OakRidge
Почётный гражданин KAZUS.RU
 
Аватар для OakRidge
 
Регистрация: 16.05.2015
Адрес: Болгария
Сообщений: 1,460
Сказал спасибо: 286
Сказали Спасибо 1,125 раз(а) в 540 сообщении(ях)
OakRidge на пути к лучшему
По умолчанию Re: pic16f628a+lcd1601

Положим PORTA = b00000000
инструкция bsf PORTA.0 читает весь порт, 8 бит в рабочий регистр, устанавливает бит 0 регистра в 1 и записывает 8 бит 00000001 в выходной регистр PORTA.
Седующая инструкция bsf PORTA.1 работает аналогично.
НО ! Если выход PORTA.0 не успел установится в 1 он прочитается как 0, тоесть PORTA = b00000000. В результате получим не PORTA = b00000011 а PORTA = b00000010
Задержа установления ножки зависит от емкости нагрузки, от тока нагрузки тоже, не так сильно разумеется. Раз ошпарился, потому ставлю 5мкс. Не так уж много, а спокойнее.
OakRidge вне форума  
Непрочитано 18.11.2017, 14:49  
vavilon79
Прохожий
 
Регистрация: 30.10.2017
Сообщений: 7
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
vavilon79 на пути к лучшему
По умолчанию Re: pic16f628a+lcd1601

В макрос добавил задержку 5 мкС после каждого поднятия/опускания питания
Clear_PORT MACRO
bcf LCD_RS
call delay_5
bcf LCD_RW
call delay_5
bcf LCD_E
call delay_5

такую же добавил задержку в процедуру где подымается или опускается порт по bcf или bsf. Также добавил задержку в 2 секунды после отключения компараторов с самом начале программы

ситуация не поменялась. Линии прозвонил на случай плохой пайки и отсутствия сигнала.
Подскажите не знаю что делать.
vavilon79 вне форума  
Непрочитано 18.11.2017, 15:17  
otest
Почётный гражданин KAZUS.RU
 
Регистрация: 29.01.2005
Адрес: Воронеж
Сообщений: 1,384
Сказал спасибо: 24
Сказали Спасибо 243 раз(а) в 182 сообщении(ях)
otest на пути к лучшему
По умолчанию Re: pic16f628a+lcd1601

movwf TMP3
; производим обнуление шины порта микроконтролера
bcf LCD_D4
bcf LCD_D5
bcf LCD_D6
bcf LCD_D7

; если определенный бит должен быть = 1, то устанавливаем его, иначе пропускаем
btfsc TMP3,0 ; проверяем 0 бит != 0
bsf LCD_D4 ; устанавливаем D4 в 1 если 0 бит != 0

btfsc TMP3,1 ; проверяем 1 бит != 0
bsf LCD_D5 ; устанавливаем D5 в 1 если 1 бит != 0

btfsc TMP3,2 ; проверяем 2 бит != 0
bsf LCD_D6 ; устанавливаем D6 в 1 если 2 бит != 0

btfsc TMP3,3 ; проверяем 3 бит != 0
bsf LCD_D7 ; устанавливаем D7 в 1 если 3 бит != 0

call LCD_strob ; стробируем что окончена посылка
return

Зачем это? Сразу ТМР3 в порт отправляй.
otest вне форума  
Непрочитано 18.11.2017, 15:51  
OakRidge
Почётный гражданин KAZUS.RU
 
Аватар для OakRidge
 
Регистрация: 16.05.2015
Адрес: Болгария
Сообщений: 1,460
Сказал спасибо: 286
Сказали Спасибо 1,125 раз(а) в 540 сообщении(ях)
OakRidge на пути к лучшему
По умолчанию Re: pic16f628a+lcd1601

Сообщение от vavilon79 Посмотреть сообщение
Подскажите не знаю что делать.
Перейти на более скоростные и емкие контроллеры.
Если ПИК из младшего семейства пусть будет чтото из серии 16F1xxxx. Цена практически та же, однако память и скорость в разы болше.
Попробовать писать на языке уровнем выше чем ассемблер. Спора нет, ассемблер самый скоростной и экономный по потребелению памяти комманд. Однако самый медленный в отношении писания программ и отладки. Языки как Си, Бейсик, Паскаль жрут вдвое больше памяти, однако имеют одно бесспорное преимущество
БИБЛИОТЕКИ Все сделано професионалами и нет нужды мучатся писать самому.
Примерная программа на Бейсике для PIC16F887. Много хлама, сам пик старье. 18FxxK22 лучше

program Lcd

' Lcd module connections
dim LCD_RS as sbit at RB4_bit
LCD_EN as sbit at RB5_bit
LCD_D4 as sbit at RB0_bit
LCD_D5 as sbit at RB1_bit
LCD_D6 as sbit at RB2_bit
LCD_D7 as sbit at RB3_bit

LCD_RS_Direction as sbit at TRISB4_bit
LCD_EN_Direction as sbit at TRISB5_bit
LCD_D4_Direction as sbit at TRISB0_bit
LCD_D5_Direction as sbit at TRISB1_bit
LCD_D6_Direction as sbit at TRISB2_bit
LCD_D7_Direction as sbit at TRISB3_bit
' End Lcd module connections

dim txt1 as char[16]
txt2 as char[9]
txt3 as char[8]
txt4 as char[7]
i as byte ' Loop variable

sub procedure Move_Delay() ' Function used for text moving
Delay_ms(500) ' You can change the moving speed here
end sub

main:
TRISB = 0
PORTB = 0xFF
TRISB = 0xFF
ANSEL = 0 ' Configure AN pins as digital I/O
ANSELH = 0

txt1 = "mikroElektronika"
txt2 = "EasyPIC6"
txt3 = "Lcd4bit"
txt4 = "example"

Lcd_Init() ' Initialize Lcd
Lcd_Cmd(_LCD_CLEAR) ' Clear display
Lcd_Cmd(_LCD_CURSOR_OFF) ' Cursor off
Lcd_Out(1,6,txt3) ' Write text in first row
Lcd_Out(2,6,txt4) ' Write text in second row
Delay_ms(2000)
Lcd_Cmd(_LCD_CLEAR) ' Clear display

Lcd_Out(1,1,txt1) ' Write text in first row
Lcd_Out(2,5,txt2) ' Write text in second row
Delay_ms(500)

' Moving text
for i=0 to 3 ' Move text to the right 4 times
Lcd_Cmd(_LCD_SHIFT_RIGHT)
Move_Delay()
next i

while TRUE ' Endless loop
for i=0 to 7 ' Move text to the left 8 times
Lcd_Cmd(_LCD_SHIFT_LEFT)
Move_Delay()
next i

for i=0 to 7 ' Move text to the right 8 times
Lcd_Cmd(_LCD_SHIFT_RIGHT)
Move_Delay()
next i
wend
end.

Пока так. Каждому свое
Удачи !
OakRidge вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевод PIC16F628A в SLEEP. vavan1983 PIC 7 18.01.2015 22:11
Как прикрутить LCD 16x2 к pic16f628a? sky132 Микроконтроллеры, АЦП, память и т.д 7 22.08.2012 13:35
Не работает терморегулятор на PIC16F628A Baza666 Proteus 33 13.11.2011 22:05
PIC16F628A retas Микроконтроллеры, АЦП, память и т.д 2 26.04.2009 15:50
pic16f628A на 250кГц Muzicant Микроконтроллеры, АЦП, память и т.д 1 07.10.2006 00:14


Часовой пояс GMT +4, время: 02:05.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot