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

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

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

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

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

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

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 12.01.2008, 23:33  
vikpol
Частый гость
 
Регистрация: 12.01.2008
Сообщений: 49
Сказал спасибо: 0
Сказали Спасибо 8 раз(а) в 5 сообщении(ях)
vikpol на пути к лучшему
По умолчанию ЖКИ и CodeVision: 8-ми битный режим

Доброго всем здоровьичка.
Помогите пожалуйста новичку.
Есть проблема - необходимо использовать ЖКИ фирмы "МЭЛТ" типа MT-16S2D-2YLG в 8-ми битном режиме. Программа в CodeVision. Контроллер ATmega32, кварц 4МГц.
Т.к. стандартной библиотеки в CodeVision для 8-ми битного режима нет, приходится все писать ручками на основе примера, выложенного на сайте "МЭЛТ" (http://melt.com.ru/files/file2136.zip).
Получилась следующая программа:

#include ‹mega32.h›
#include ‹delay.h›
//****************************
#define SET_B(x) |= (1‹‹x)
#define CLR_B(x) &= ~(1‹‹x)
#define INV_B(x) ^= (1‹‹x)
//****************************
#define LCD_A0 PORTA.5
#define LCD_E PORTA.6
#define LCD_RW PORTA.7
#define LCD_D PORTC
//******************************
#define Len1 16 //Количество символов в первой строке индикатора
#define Len2 16 //Количество символов в второй строке индикатора
//********************************
const char Text1[Len1]={'M','E','L','T',' ','1','6','S','2',' ',24,25,136,15,10,9};
const char Text2[Len2]={20,37,42,134,135,250,251,252,253,254,255,30,241, 242,240,50};
//**********************************
// Прототипы используемых функций
void port_init(void);
void LCD_zan(void);
void LCDinit(void);
void main(void);
//**********************************
// Инициализация портов
/* PORTx: "0" - на ножке присутствует низкий потенциал
"1" - на ножке присутствует высокий потенциал
DDRx: "0" - ножка является входом
"1" - ножка является выходом */

void port_init(void)
{
// Инициализация Port A
PORTA=0x00;
DDRA=0xF0; // 11110000
// Инициализация Port B
PORTB=0x10;
//DDRB=0xB2;
DDRB=0x92;
// Инициализация Port C
PORTC=0x00;
DDRC=0xFF;
// Инициализация Port D
PORTD=0x00;
DDRD=0xFF;
}
//**********************************
//************************************
// Проверка занятости ЖКИ
void LCD_zan(void)
{
DDRC CLR_B(7); // Делаем бит 7 порта С работающим на вход
while (LCD_D.7 == 1);
DDRC SET_B(7); // Делаем бит 7 порта С работающим на выход
}
//***************************************
void Writechar(byte b, bit cd)
{
//Сначала проверим готовность индикатора
//При необходимости настроить здесь шину данных на ввод
LCD_RW = 1; LCD_A0 = 0; //Чтение флага занятости
delay_us(1); //Это время предустановки адреса (tAS)
LCD_E = 1; delay_us(1); //Это минимально допустимая длительность сигнала E=1 (информация на шину данных индикатором будет выдана раньше, не более чем через 120нс)
while (LCD_D.7 == 1); //Ждать сброса флага занятости
//LCD_zan();
LCD_E = 0; delay_us(1); //Минимально допустимый интервал между сигналами E=1
//При необходимости настроить здесь шину данных на вывод
LCD_RW = 0; LCD_A0 = cd; LCD_D = b;
delay_us(1); //Это время предустановки адреса (tAS)
LCD_E = 1; delay_us(1); //Время предустановки данных попало сюда (tDSW)
LCD_E = 0; delay_us(1); //Минимально допустимый интервал между сигналами E=1
}
//*******************************************
void WriteCmd(byte b)
{
Writechar(b,0);
}
//*********************************************
void WriteData(byte b)
{
Writechar(b,1);
}
//***************************************
void LCDinit(void)
{
LCD_E = 0; delay_ms(50);
//При необходимости настроить здесь шину данных на вывод
LCD_RW = 0; LCD_A0 = 0; LCD_D = 0x30; //Установка типа интерфейса (8 бит)
delay_us(1); //Это время предустановки адреса (tAS)
LCD_E = 1; delay_us(1); //Время предустановки данных попало сюда (tDSW)
LCD_E = 0; delay_us(50); //Пауза между командами
LCD_E = 1; delay_us(1); //Минимально допустимая длительность сигнала E=1
LCD_E = 0; delay_us(50); //Пауза между командами
LCD_E = 1; delay_us(1);
LCD_E = 0; delay_us(1); //Минимально допустимый интервал между сигналами E=1
//Здесь индикатор входит в рабочий режим с установленным типом интерфейса и можно подавать команды как обычно
WriteCmd(0x3A); //Настройка правильного режима ЖКИ
WriteCmd(0x0C); //Включение индикатора, курсор выключен
WriteCmd(0x01); //Очистка индикатора
WriteCmd(0x06); //Установка режима ввода данных: сдвигать курсор вправо
}
//****************************************
void main(void)
{
int i;
port_init();
//******************************************
#asm("cli") // Запрет глобальных прерываний
//********************************************
MCUCR = 0x00;
MCUCSR = 0x00;
GICR = 0x00;
//*******************************************
LCDinit();
WriteCmd(0x80); //Установка курсора в начало первой строки индикатора
for(i =0 ; i ‹ Len1; i++)
{
WriteData(Text1[i]);
}
WriteCmd(0x80+0x40); //Установка курсора в начало второй строки индикатора
for(i = 0; i ‹ Len2; i++)
{
WriteData(Text2[i]);
}
while(1);
}

При компиляции выдает ошибку на строчку

void Writechar(byte b, bit cd)

Как я понял, компилятор не понимает объявление переменных "byte b" и "bit cd"
После замены "byte" на "char" и "bit" на "int" компиляция проходит успешно, но ЖКИ не инициализируется (и уж тем более ничего не отображает).
Подскажите пожалуйста, в чем ошибка.
Буду премного благодарен!
Реклама:
vikpol вне форума  
Непрочитано 13.01.2008, 00:39  
AndreiVV
Гражданин KAZUS.RU
 
Регистрация: 29.06.2006
Сообщений: 638
Сказал спасибо: 37
Сказали Спасибо 56 раз(а) в 41 сообщении(ях)
AndreiVV на пути к лучшему
По умолчанию

у вас зависает на указаном месте
Код:
void Writechar(byte b, bit cd) 
{ 
//Сначала проверим готовность индикатора 
//При необходимости настроить здесь шину данных на ввод 
LCD_RW = 1; LCD_A0 = 0; //Чтение флага занятости 
delay_us(1); //Это время предустановки адреса (tAS) 
LCD_E = 1; delay_us(1); //Это минимально допустимая длительность сигнала E=1 (информация на шину данных индикатором будет выдана раньше, не более чем через 120нс) 


while (LCD_D.7 == 1); //Ждать сброса флага занятости ‹‹-----------------


//LCD_zan(); 
LCD_E = 0; delay_us(1); //Минимально допустимый интервал между сигналами E=1 
//При необходимости настроить здесь шину данных на вывод 
LCD_RW = 0; LCD_A0 = cd; LCD_D = b; 
delay_us(1); //Это время предустановки адреса (tAS) 
LCD_E = 1; delay_us(1); //Время предустановки данных попало сюда (tDSW) 
LCD_E = 0; delay_us(1); //Минимально допустимый интервал между сигналами E=1 
}
если закомментировать то пойдет, ищите почему на 7 бите порта С высокий уровень
AndreiVV вне форума  
Непрочитано 13.01.2008, 01:51  
vikpol
Частый гость
 
Регистрация: 12.01.2008
Сообщений: 49
Сказал спасибо: 0
Сказали Спасибо 8 раз(а) в 5 сообщении(ях)
vikpol на пути к лучшему
По умолчанию

Спасибо, действительно пошел (проверил в протеусе).
Однако не отображается первая буква "М", а во второй строке какието краказябры.
Буду пытаться сам разобраться, но всеже если подскажете, будет замечательно!

-- Прилагается рисунок: --
vikpol вне форума  
Непрочитано 13.01.2008, 02:44  
AndreiVV
Гражданин KAZUS.RU
 
Регистрация: 29.06.2006
Сообщений: 638
Сказал спасибо: 37
Сказали Спасибо 56 раз(а) в 41 сообщении(ях)
AndreiVV на пути к лучшему
По умолчанию

см ниже
AndreiVV вне форума  
Непрочитано 13.01.2008, 03:46  
vikpol
Частый гость
 
Регистрация: 12.01.2008
Сообщений: 49
Сказал спасибо: 0
Сказали Спасибо 8 раз(а) в 5 сообщении(ях)
vikpol на пути к лучшему
По умолчанию

Благодарю за оперативный ответ.
Строка
Delay(›40ns)
означает выдержку времени более 40 наносекунд. Онако в хидере delay.h CodeVisionAVR есть выдержки времени на миллисекунды (delay_ms()) и микросекунды (delay_us()). На наносекунды выдержек нет. Поэтому вместо всех выдержек в наносекундах (Delay(›40ns), Delay(›230ns) и Delay(›270ns)) программы-примера я поставил выдержку в 1 (одну) микросекунду (delay_us(1)).
Ведь это больше минимально необходимого времени.
Теперь попробую набрать эту выдержку ручками (NOP).
Т.к. кварц 4МГц, т.е. один такт выполняется за
1/4000000 (250 наносекунд) то выдержка
Delay(›40ns) - одна команда NOP
Delay(›230ns) - одна команда NOP
Delay(›270ns) - две командэ NOP
vikpol вне форума  
Непрочитано 13.01.2008, 11:46  
AndreiVV
Гражданин KAZUS.RU
 
Регистрация: 29.06.2006
Сообщений: 638
Сказал спасибо: 37
Сказали Спасибо 56 раз(а) в 41 сообщении(ях)
AndreiVV на пути к лучшему
По умолчанию

вчера уже поздно было вот и тормознул, не стал разбирается времени нет если в место проверки занятости поставить задержку на 50us(вроде так по даташиту) то все нормально, а то что у тебя крякозябры так это то что находятся по адресам в знакогенераторе данного жки (модели протеуса)
AndreiVV вне форума  
Непрочитано 13.01.2008, 17:36  
vikpol
Частый гость
 
Регистрация: 12.01.2008
Сообщений: 49
Сказал спасибо: 0
Сказали Спасибо 8 раз(а) в 5 сообщении(ях)
vikpol на пути к лучшему
По умолчанию

Спасибо, действительно все стало нормально.
Сейчас буду проверять живьем.
Но как тогда правильно проверять флаг занятости ЖКИ?
vikpol вне форума  
Непрочитано 13.01.2008, 17:54  
AndreiVV
Гражданин KAZUS.RU
 
Регистрация: 29.06.2006
Сообщений: 638
Сказал спасибо: 37
Сказали Спасибо 56 раз(а) в 41 сообщении(ях)
AndreiVV на пути к лучшему
По умолчанию

Цитата:
Но как тогда правильно проверять флаг занятости ЖКИ?
по даташиту:А0=0, R/w=1, pause,E=1, -›проверяется DB7 индикатора
получается как в исходнике но
1. LCD_D.7 == 1 равно PORTC.7 а проверка значение порта это PINC.7(могу ошибиться тк нет ДШ под рукой)
2. даже если исправить первый пункт при установки начала на 1 строку(WriteCmd(0x80); ) индикатор действительно указывает что занят и зависает на проверке
надо копать дальше
AndreiVV вне форума  
Непрочитано 14.01.2008, 23:08  
vikpol
Частый гость
 
Регистрация: 12.01.2008
Сообщений: 49
Сказал спасибо: 0
Сказали Спасибо 8 раз(а) в 5 сообщении(ях)
vikpol на пути к лучшему
По умолчанию

Блин! Ё-моё! Действительно PINC. Век живи, век слушай умных людей.
Сейчас проверять буду.
Кстати, если не проверять занятость, а просто выдержать время более 40 мкс, тогда при инициализации необходимо после очистки дисплея выдержать время ›1.5 мс (по даташиту ЖКИ), т.е.
Код:
WriteCmd(0x01); //Очистка индикатора 
delay_ms(2);          ‹========
WriteCmd(0x06); //Установка режима ввода данных: сдвигать курсор вправо
После этого вживую индикатор работает - проверил.
Если все нормально заработает с проверкой занятости, выложу исходник с подробным описанием - вдруг кому пригодится
vikpol вне форума  
Непрочитано 15.01.2008, 12:46  
IY
Прохожий
 
Регистрация: 31.01.2007
Сообщений: 4
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
IY на пути к лучшему
По умолчанию

Здраствуйте.. У меня похожая проблема помогите... Идет отображение только времени и тахометра все остальное вылетевшый шрифт как исправить? Схему скачал в нете. Програмер с меня неочень посиму выложил всю прогу.
; кварц = 4,096 МГц
; ЖКИ ИНДИКАТОР 2х16 МТ-16SD-2YLG
; часть подпрограмм взята из инета

LIST P=16F84a

#include ‹p16f84a.inc›

__config _CP_OFF&_WDT_OFF&_PWRTE_ON&_XT_OSC

; Подключение к ЖКИ
; RВ4...R7 - данные
; RВ1 - Е
; RВ2 - R/W
; RВ3 - RS

; Описание используемых переменных
koeff equ D'195'
E EQU 1 ; LCD Enable control line
R_W EQU 2 ; LCD Read/Write control line
RS EQU 3 ; LCD Register Select control line
LCD_DATA EQU PORTB
LCD_CNTL EQU PORTB
LCD_DATA_TRIS EQU PORTB

rab2 equ 0x0C
rab3 equ 0x0D
Char equ 0x0E
temp equ 0x0F
ms5 equ 0x10
ms200 equ 0x11
LSD equ 0x15
MSD equ 0x16

; переменные для преобразов 24 бит числа в двоично десятичное
nratorH equ 0x17
nratorM equ 0x18
nratorL equ 0x19
R0 equ 0x1A
R1 equ 0x1B
R2 equ 0x1C
R3 equ 0x1D
COUNT equ 0x1E
TEMP equ 0x1F

; переменные связ с подпрограммой деления
;nratorH equ 0x17
;nratorM equ 0x18
;nratorL equ 0x19
denomH equ 0x20
denomM equ 0x21
denomL equ 0x22
remainH equ 0x23
remainM equ 0x24
remainL equ 0x25
BCount equ 0x26
shiftH equ 0x27
shiftM equ 0x28
shiftL equ 0x29

; переменные связ со счетом импульсов с датчика
stat equ 0x2A
count_impuls equ 0x2B

; переменные таймера
mksek_5000 equ 0x2C
msek_1000 equ 0x2D
sek equ 0x12
min equ 0x13
hours equ 0x14

;*** Начало программы ***
org 0x00
goto START
START
clrf PORTA ; очищаем портА
clrf PORTB ; очищаем портB
clrf ms5
clrf ms200
clrf sek
clrf min
clrf hours
clrf mksek_5000
clrf msek_1000
clrf stat
clrf count_impuls

bsf STATUS, RP0 ; переходим на страницу 1
movlw b'00000001' ; первый регистр портаA определяем как вход а остальные как выхода
movwf PORTA
movlw b'00000000' ; все регистры портаB определяем как выхода
movwf PORTB

bsf STATUS, RP0
movlw b'10000000' ; 1:2 increment evry 1,953125 mksek, for modulе 64 overload 125 mksek
movwf OPTION_REG

bcf STATUS, RP0 ; переходим на страницу 0
movlw b'00000000' ; запрещаем все прерывания
movwf INTCON

call LCD_Init
call init_text_lcd

;************************************************* **************************************************
beg movlw koeff
movwf TMR0
w_d
check_ms nop
btfss INTCON,T0IF
goto check_ms

movlw koeff
movwf TMR0
bcf INTCON,T0IF
call timer
incf ms5,f
movf ms5,W
xorlw D'2'
btfss STATUS,Z
goto prov
clrf ms5
incf ms200,f
movf ms200,W
xorlw D'200'
btfss STATUS,Z
goto prov

clrf ms200
call update_lcd_tah0

prov btfsc PORTA,0
goto w_d1
goto w_d

w_d1 btfsc PORTA,0
goto w_d1

count_time movlw koeff
movwf TMR0
clrf ms5
clrf ms200

;************** Теперь считаем 50 импульсов и время ***********************************************
MAIN
check_1ms nop
btfss INTCON,T0IF
goto check_1ms

movlw koeff
movwf TMR0
bcf INTCON,T0IF

call timer
incf ms5,f
movf ms5,W
xorlw D'100'
btfss STATUS,Z
goto prov1
clrf ms5
incf ms200,f
movf ms200,W
xorlw D'200'
btfss STATUS,Z
goto prov1

clrf ms200
call update_lcd_tah0
goto beg

prov1 incf denomL,f
btfss STATUS,Z
goto count_tahom
incf denomM,f
btfss STATUS,Z
goto count_tahom
incf denomH,f
btfss STATUS,Z
goto count_tahom
clrf denomL
clrf denomM
clrf denomH

count_tahom btfss stat,1
goto count_tahom1
btfsc PORTA,0
goto MAIN
clrf stat

incf count_impuls,f
movf count_impuls,W
xorlw D'50'
btfss STATUS,Z
goto MAIN
clrf count_impuls
call update_lcd_tah
call update_lcd_timer
clrf denomL
clrf denomM
clrf denomH

goto beg

count_tahom1 btfsc PORTA,0
bsf stat,1
goto MAIN

;************** когда нет оборотов выводим нули на ЖКИ ********************************************
update_lcd_tah0 movlw H'8B'
call send_cmd
clrw
call convert
call send_char
clrw
call convert
call send_char
clrw
call convert
call send_char
clrw
call convert
call send_char
return
;************************************************* **************************************************
BinBCD clrf MSD
movwf LSD
gtenth movlw .10
subwf LSD,W
btfss STATUS,C
goto over
movwf LSD
incf MSD,f
goto gtenth
over retlw 0
;************************************************* **************************************************
convert addwf PCL,f
retlw H'30' ; 0
retlw H'31' ; 1
retlw H'32' ; 2
retlw H'33' ; 3
retlw H'34' ; 4
retlw H'35' ; 5
retlw H'36' ; 6
retlw H'37' ; 7
retlw H'38' ; 8
retlw H'39' ; 9
;********** Подпрограмма инициализации ЖКИ и установка параметров *********************************
LCD_Init call delay20 ; задержка 20 мсек, рекомендовано заводом

bcf LCD_CNTL, E ; запрещаем запись в жки
bcf LCD_CNTL, RS ; выбираем передачу команд
bcf LCD_CNTL, R_W ; выбор режима записи
movlw 0x0f ; маскируем младший полубайт и
andwf LCD_DATA,F ; очищаем старший полубайт (лог умножение между W и LCD_DATA)
movlw H'30' ; b'0010 1010' байт управления по 4-битному интерфейсу
iorwf LCD_DATA,F ; делаем лог сложение и результат выодим на жки

bsf LCD_CNTL, E ; разрешаем запись в жки
bcf LCD_CNTL, E ; запрещаем запись в жки
call delay5 ; задержка 5 мсек, завод требует 40 мксек

bsf LCD_CNTL, E ; разрешаем запись в жки
bcf LCD_CNTL, E ; запрещаем запись в жки
call delay5 ; задержка 5 мсек, завод требует 40 мксек

bsf LCD_CNTL, E ; разрешаем запись в жки
bcf LCD_CNTL, E ; запрещаем запись в жки
call delay5 ; задержка 5 мсек, завод требует 40 мксек

movlw H'28' ; 4 битный режим
call send_cmd

movlw b'00001100' ; h'0C' включение дисплея, выключение курсора
call send_cmd

movlw H'01' ; очищает дисплей и помещает курсор в самую левую позицию
call send_cmd

return
;********** Подпрограммы задержек ************************************************** ****************
delay100 call delay20 ; задержка 100 мс
delay80 call delay20 ; задержка 80 мс
delay60 call delay20 ; задержка 60 мс
delay40 call delay20 ; задержка 40 мс
delay20 call delay5 ; задержка 20 мс
delay15 call delay5 ; задержка 15 мс
delay10 call delay5 ; задержка 10 мс
delay5 movlw d'5' ; задержка 5 мс
movwf rab2 ;
delay1 movlw D'249' ; задержка 1 мc
movwf rab3
d1m nop
decfsz rab3,f ; 4 x 250 = 1 ms
goto d1m
decfsz rab2,f
goto delay1
return
;************************************************* **************************************************
d100mks movlw .25
movwf rab3
dll nop ; 4 x 25 = 100 mkc
decfsz rab3,f
goto dll
return
;************************************************* ******************
;* Send_Cmd - Sends command to LCD *
;* This routine splits the command into the upper and lower *
;* nibbles and sends them to the LCD, upper nibble first. *
;************************************************* ******************
send_cmd movwf Char ; Character to be sent is in W
call Wait_Busy ; Wait for LCD to be ready
movlw 0x0f
andwf LCD_DATA,F ; Clear the upper nibble
movf Char,w
andlw 0xF0 ; Get upper nibble
iorwf LCD_DATA,F ; Send data to LCD
bcf LCD_CNTL,R_W ; Set LCD to write
bcf LCD_CNTL,RS ; Set LCD to command mode
bsf LCD_CNTL,E ; toggle E for LCD
bcf LCD_CNTL,E
movlw 0x0f
andwf LCD_DATA,F ; Clear the upper nibble
swapf Char,W
andlw 0xF0 ; Get lower nibble
iorwf LCD_DATA,F ; Send data to LCD
bsf LCD_CNTL,E ; toggle E for LCD
bcf LCD_CNTL,E
return
;************************************************* *************************************************
;************************************************* ******************
;*SendChar - Sends character to LCD *
;*This routine splits the character into the upper and lower *
;*nibbles and sends them to the LCD, upper nibble first. *
;************************************************* ******************
send_char movwf Char ; Character to be sent is in W
call Wait_Busy ; Wait for LCD to be ready
movlw 0x0f
andwf LCD_DATA,F ; Clear the upper nibble
movf Char,w
andlw 0xF0 ; Get upper nibble
iorwf LCD_DATA,F ; Send data to LCD
bcf LCD_CNTL, R_W ; Set LCD to write
bsf LCD_CNTL, RS ; Set LCD to data mode
bsf LCD_CNTL, E ; toggle E for LCD
bcf LCD_CNTL, E
movlw 0x0f
andwf LCD_DATA,F ; Clear the upper nibble
swapf Char,W
andlw 0xF0 ; Get lower nibble
iorwf LCD_DATA,F ; Send data to LCD
bsf LCD_CNTL, E ; toggle E for LCD
bcf LCD_CNTL, E
return
;************************************************* **************************************************
Wait_Busy bsf STATUS, RP0 ; Select Register page 1
movlw 0xf0 ; Set port to input
iorwf LCD_DATA_TRIS,W ; Only set upper half of port
movwf LCD_DATA_TRIS
bcf STATUS, RP0 ; Select Register page 0
bcf LCD_CNTL, RS ; Set LCD for Command mode
bsf LCD_CNTL, R_W ; Setup to read busy flag

bsf LCD_CNTL, E ; Set E high
movf LCD_DATA, W ; Read upper nibble busy flag, DDRam address
bcf LCD_CNTL, E ; Set E low

andlw 0xF0 ; Mask out lower nibble
movwf temp

bsf LCD_CNTL, E ; Toggle E to get lower nibble
swapf LCD_DATA, w ; Read lower nibble busy flag, DDRam address
bcf LCD_CNTL, E

andlw 0x0F ; Mask out upper nibble
iorwf temp,f ; Combine nibbles, RES in Temp !!!!!!!!!!!!!!!
btfsc temp, 7 ; Check busy flag, high = busy
goto Wait_Busy ; If busy, check again
bcf LCD_CNTL, R_W
bsf STATUS, RP0 ; Select Register page 1
movlw 0x0F
andwf LCD_DATA_TRIS,W
movwf LCD_DATA_TRIS ; Set Port for output
bcf STATUS, RP0 ; Select Register page 0
return
;******* CONVERT 24 BIT BIN TO PACKED BCD ************************************************** *******
B2_BCD BCF STATUS,C
MOVLW 0x18
MOVWF COUNT
CLRF R0
CLRF R1
CLRF R2
CLRF R3
LOOP16 RLF nratorL,F
RLF nratorM,F
RLF nratorH,F
RLF R0,F
RLF R1,F
RLF R2,F
RLF R3,F

DECFSZ COUNT,1
GOTO ADJDEC
RETLW 0

ADJDEC MOVLW R3
MOVWF FSR
CALL ADJBCD

MOVLW R2
MOVWF FSR
CALL ADJBCD

MOVLW R1
MOVWF FSR
CALL ADJBCD

MOVLW R0
MOVWF FSR
CALL ADJBCD

GOTO LOOP16

ADJBCD MOVLW 0x03
ADDWF 0,W
MOVWF TEMP
BTFSC TEMP,3
MOVWF 0
MOVLW 0x30
ADDWF 0,W
MOVWF TEMP
BTFSC TEMP,7
MOVWF 0
RETLW 0
;************************************************* ************************************************
init_text_lcd movlw H'81'
call send_cmd
movlw H'EE' ; о
call send_char
movlw H'E1' ; б
call send_char
movlw H'2F' ; /
call send_char
movlw H'EC' ; м
call send_char
movlw H'E8' ; и
call send_char
movlw H'ED' ; н
call send_char

movlw H'C1'
call send_cmd
movlw H'D2' ; Т
call send_char
movlw H'E0' ; а
call send_char
movlw H'E9' ; й
call send_char
movlw H'EC' ; м
call send_char
movlw H'E5' ; е
call send_char
movlw H'F0' ; р
call send_char
movlw H'20' ; _
call send_char
return
;************************************************* ************************************************
update_lcd_timer movlw H'CA'
call send_cmd

movf hours,W
call BinBCD
movf MSD,W
call convert
call send_char
movf LSD,W
call convert
call send_char

movlw H'3A'
call send_char

movf min,W
call BinBCD
movf MSD,W
call convert
call send_char
movf LSD,W
call convert
call send_char
return
;************************************************* ************************************************
; SUBROUTINE - 24 BIT DIVISION
; numerator: nratorH nratorM nratorL
; denominator: denomH denomM denomL
;
; result: nratorH nratorM nratorL
; remainder: remainH remainM remainL
;
divizn movlw D'24'
movwf BCount
movf nratorH,w
movwf shiftH
movf nratorM,w
movwf shiftM
movf nratorL,w
movwf shiftL
clrf nratorH
clrf nratorM
clrf nratorL
clrf remainH
clrf remainM
clrf remainL
dloop bcf STATUS,C
rlf shiftL,f
rlf shiftM,f
rlf shiftH,f
rlf remainL,f
rlf remainM,f
rlf remainH,f
movf denomH,w
subwf remainH,w
btfss STATUS,Z
goto nochk
;
movf denomM,w
subwf remainM,w
btfss STATUS,Z
goto nochk
;
movf denomL,w
subwf remainL,w
nochk btfss STATUS,C
goto nogo
;
movf denomL,w
subwf remainL,f
btfss STATUS,C
decf remainM,f
movf remainM,w
xorlw 0xff
btfsc STATUS,Z
decf remainH,f
movf denomM,w
subwf remainM,f
btfss STATUS,C
decf remainH,f
movf denomH,w
subwf remainH,f
bsf STATUS,C
nogo rlf nratorL,f
rlf nratorM,f
rlf nratorH,f
decfsz BCount,f
goto dloop
return
;************************************************* **************************************************
update_lcd_tah movlw H'B7'
movwf nratorH
movlw H'1B'
movwf nratorM
movlw H'00'
movwf nratorL

call divizn
call B2_BCD

movlw H'8B'
call send_cmd

;swapf R3,W
;andlw 0x0F
;call convert
;call send_char
;movf R3,W
;andlw 0x0F
;call convert
;call send_char

;swapf R2,W
;andlw 0x0F
;call convert
;call send_char
;movf R2,W
;andlw 0x0F
;call convert
;call send_char

swapf R1,W
andlw 0x0F
btfss STATUS,Z
goto write_3reg_tah
movlw 0x20
call send_char
goto write_2reg_tah

write_3reg_tah swapf R1,W
andlw 0x0F
call convert
call send_char

write_2reg_tah movf R1,W
andlw 0x0F
call convert
call send_char

swapf R0,W
andlw 0x0F
call convert
call send_char
movf R0,W
andlw 0x0F
call convert
call send_char
retlw 0
;************************************************* **************************************************
timer incf mksek_5000,f
movf mksek_5000,W
xorlw D'40'
btfss STATUS,Z
return
clrf mksek_5000
incf msek_1000,f
movf msek_1000,W
xorlw D'200'
btfss STATUS,Z
return
clrf msek_1000
incf sek,f
movf sek,W
xorlw D'60'
btfss STATUS,Z
return
clrf sek
incf min,f
movf min,W
xorlw D'60'
btfss STATUS,Z
return
clrf min
incf hours,f
movf hours,W
xorlw D'24'
btfss STATUS,Z
return
clrf hours
return

end
IY вне форума  
 

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

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Codevision и lcd EKuzmich Микроконтроллеры, АЦП, память и т.д 3 18.06.2008 13:57
Не запускается ЖКИ на KS0066 ЖКИ WH2002L jtlex Микроконтроллеры, АЦП, память и т.д 0 04.04.2008 12:09
CodeVision 1.25.3 Vrungel Proteus, KiCAD и другие ECAD 40 16.03.2007 16:30
4-битный режим LCD при работе с Atmega 128 Hellka Микроконтроллеры, АЦП, память и т.д 1 02.10.2006 14:23
Вопрос по CodeVision EES Микроконтроллеры, АЦП, память и т.д 4 08.12.2005 01:53


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


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