Могли бы вы SubDia взглянуть на код и дать некоторые разьяснения?
Вот код:
/*****************************************************
This program was produced by the
CodeWizardAVR V2.04.4a Advanced
Automatic Program Generator
© Copyright 1998-2009 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :
Version :
Date : 06.07.2011
Author : PaRaGoN
Company : Administrator
Comments:
Chip type : ATmega16
Program type : Application
AVR Core Clock frequency: 40,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega16.h>
#include <delay.h>
#define byte char
#define bit int
void Pset(byte x, byte y, bit c) {//Записать одну точку в индикатор (координата 0,0 в левом верхнем углу индикатора)
byte c8;//Временное хранение считаного из индикатора байта
byte m8;//Маска нужного бита в байте
if ((x>60)||(y>15)) return;//Выход за пределы индикатора
WriteCode(0xB8|(y>>3));//Установить нужную страницу индикатора
WriteCode(x);//Установить адрес нужного байта
c8=ReadData();//Фиктивное чтение
c8=ReadData();//Чтение нужного байта из индикатора
m8=1<<(y&0x07);//Вычислить маску нужного бита в байте
if (c==1) //Зажигать точку?
c8|=m8//Установить нужный бит в байте
else //Или гасить точку?
c8&=~m8;//Сбросить нужный бит в байте
WriteCode(x);//Снова установить адрес нужного байта
WriteData(c8);//Записать изменённый байт обратно в индикатор
}
void WriteCode(byte b) { WriteByte(b,0); }
void WriteData(byte b) { WriteByte(b,1); }
byte ReadData(void) { return ReadByte(1); }//Прочитать байт данных из индикатора
//Процедура выдачи байта в индикатор
void WriteByte(byte b, bit cd) {
WaitReady(); //Ждать готовности индикатора
//При необходимости настроить здесь шину данных на вывод
PORTB.1=0; PORTB.3=cd; //Выдача байта в индикатор как данных или команды
PORTA=b; //Выдать байт на шину данных индикатора
delay_ms(1); //Это время предустановки адреса (tAW)***** >40ns
PORTB.2=1; delay_ms(1); //***>160ns //Длительность сигнала E=1 (время предустановки данных попало сюда (tDS))
PORTB.2=0; Delay(>(2000ns-40ns-160ns)); //Минимально допустимый интервал между сигналами E=1
}
void WaitReady(void) {//Ждать готовности индикатора, опрашивая байт статуса
//При необходимости настроить здесь шину данных на ввод
PORTB.1=1; PORTB.3=0; //Чтение флага занятости
delay_ms(1); //Это время предустановки адреса (tAW) ***>40ns
PORTB.2=1; delay_ms(1); //***>300ns //Минимально допустимая длительность сигнала E=1 (время доступа (tACC) попало сюда)
while(PORTA.7==1); //Ждать сброса флага занятости
PORTB.2=0; Delay(>(2000ns-40ns-300ns)); //Минимально допустимый интервал между сигналами E=1
}
byte ReadByte(bit cd) {
byte b;
WaitReady(); //Ждать готовности индикатора
PORTB.1=1; PORTB.3=cd; //Будем читать байт как команду или данные
delay_ms(1); //Это время предустановки адреса (tAW) ***>40ns
PORTB.2=1; //Выдать строб в индикатор
delay_ms(1); //***>300ns //Минимально допустимая длительность сигнала E=1 (время доступа (tACC) попало сюда)
b=PORTA; //Прочитать данные с шины индикатора (они на ней уже минимум 120нс)
PORTB.2=0; //Сбросить сигнал E
Delay(>(2000ns-40ns-300ns)); //Минимально допустимый интервал между сигналами E=1
return b; //Вернуть прочитанный байт
}
//Данные изображения, побитые по строкам и байты будут на индикаторе вертикально.
//Это просто последовательность байт для записи в индикатор начиная с верхней страницы.
//Полностью соответствуют картинке распределения ОЗУ в документации на модуль.
const byte Logo61[2][61]=//61x16 pixel, каждые 8 вертикальных точек собраны в байт
{
{ 0xF8,0xFC,0xFE,0xFB,0xEF,0x7F,0x1F,0x0F,0x0F,0x3F,
0x1F,0x0F,0xBE,0x0C,0x18,0xE0,0x00,0x00,0x08,0x88,
0xE8,0xE8,0xE8,0x08,0x88,0xE8,0xE8,0xE8,0x08,0x08,
0xC8,0xE8,0xE8,0x68,0x68,0x68,0x68,0xE8,0xC8,0xC8,
0x88,0x08,0x08,0x08,0x08,0x88,0xC8,0xE8,0xE8,0xE8,
0x68,0x68,0x68,0x68,0xE8,0xE8,0xE8,0x68,0x68,0x68,
0x68
},
{ 0x0F,0x18,0x27,0x4F,0x43,0x80,0x80,0x80,0x80,0x80,
0x80,0x40,0x40,0xE8,0xFC,0xFF,0x7C,0x1E,0x0F,0x07,
0xFF,0xFF,0xFF,0x1F,0x0F,0xFF,0xFF,0xFF,0x00,0x20,
0x70,0x70,0xE6,0xCE,0xCE,0xCE,0xCE,0xE4,0x71,0x3F,
0xFF,0xF0,0xF8,0x7C,0x3F,0x0F,0x07,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,
0x00
}
};
//******************************
void status_read()
{
PORTB.1=1; // status read
PORTB.3=0;
delay_ms(1);
PORTB.2=1;
delay_ms(1);
while(PORTA.7==1);
PORTB.2=0;
delay_ms(1);
PORTB.2=1;
delay_ms(1);
PORTB.2=0;
delay_ms(1);
}
void glcd_init() // верно
{
// LCD module initialization
PORTB.2=0;
PORTB.0=0; // 1 res
delay_us(15);
PORTB.0=1; // 2 res
delay_ms(2);
PORTB.0=0;
PORTB.1=0; // 3 reset
PORTB.3=0;
PORTA=0b11100010;
PORTB.1=0; // 4 (end)
PORTB.3=0;
PORTA=0b11001110;
PORTB.1=0; // 5 static drive on/off
PORTB.3=0;
PORTA=0b10100100;
PORTB.1=0; // 6 duty select
PORTB.3=0;
PORTA=0b10101000;
PORTB.1=0; // верхнюю строку на 0 (dis start line)
PORTB.3=0;
PORTA=0b11000000;
PORTB.1=0; //NonInvert scan RAM
PORTB.3=0;
PORTA=0b10100000;
PORTB.1=0; // 7 display on/off
PORTB.3=0;
PORTA=0b10101111;
}
void main(void)
{
byte p;//Номер текущей страницы индикатора
byte c;//Позиция по горизонтали выводимого байта
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;
// Port B initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=1 State6=1 State5=1 State4=1 State3=1 State2=1 State1=1 State0=1
PORTB=0xFF;
DDRB=0xFF;
// Port C initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=1 State6=1 State5=1 State4=1 State3=1 State2=1 State1=1 State0=1
PORTC=0xFF;
DDRC=0xFF;
// Port D initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=1 State6=1 State5=1 State4=1 State3=1 State2=1 State1=1 State0=1
PORTD=0xFF;
DDRD=0xFF;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
PORTB=0;
//============ запуск lcd(инициализация)
glcd_init();
//=============== end of iallisation
for(p=0; p<2; p++) {//Цикл по всем 2-м страницам индикатора
WriteCode(p|0xB8);//Установка текущей страницы для обоих кристаллов индикатора
WriteCode(0x00);//Установка текущего адреса для записи данных в 0
for(c=0; c<61; c++) {//Цикл вывода
WriteData(Logo61[p][c]);//Вывод очередного байта в индикатор
}
}
}
1 Мне не понятно это:
WriteCode(0xB8|(y>>3));//Установить нужную страницу индикатора
WriteCode(x);//Установить адрес нужного байта
0xB8|(y>>3)-что это, и что за икс во второй строчке??? Что значит написать код-write code&&&&
2Почему-то компилятор выдает тут ошибку:
if (c==1) //Зажигать точку?
c8|=m8//Установить нужный бит в байте
else //Или гасить точку? -говорит missing ';'
c8&=~m8;//Сбросить нужный бит в байте
3 И не понятно, какой код здесь нужен- "Delay(>(2000ns-40ns-300ns));" Как этот делай осуществить(мне сказали что можно наносекунды заменить на микросекунды, но дело не в этом, а в >(2000ns-40ns-300ns))???