Цитата(SashaGubov @ Aug 24 2007, 16:21)

Вот и назрел тупой вопрос.
Привожу код побитового SPI? много, но все очень понятно.
файл simple.c
#include <mega32.h>
#include <delay.h>
#include "lcd_function.h"
int main(void)
{
PORTB=0x5D;
DDRB=0xFF;
// backlight PWM generation
// use timer 2 in fast PWM mode for this
PORTD = 0<<7; // clear port before enable
DDRD = 1<<7; // will be used for OC2, must be output
TCCR2 = 1<<3 | 1<<6 | 1<<5 | 1<<0;
TCNT2=0x00;
OCR2=85;
delay_ms(1);
lcd_init();
while (1)
{
}
return(0);
}
файл lcd_function.h
#include <mega32.h>
#include <delay.h>
#define cmd 1
#define dat 0
#define LCD_CS PORTB.0
#define LCD_RESET PORTB.1
#define LCD_RS PORTB.2
#define LCD_DAT PORTB.5
#define LCD_SCK PORTB.7
char i=0;
char datcom=0;
int word=0;
int INIT1[12]={0xFDFD,0xFDFD,0xEF00,0xEE04,0x1B04,0xFEFE,0xFEFE,0xEF90,0x4A04,0x7F3F
,0xEE04,0x4306};
int INIT2[20]={0xEF90,0x0983,0x0800,0x0BAF,0x0A00,0x0500,0x0600,0x0700,0xEF00,0xEE0C
,0xEF90,0x0080,0xEFB0,0x4902,0xEF00,0x7F01,0xE181,0xE202,0xE276,0xE183};
int INIT3[1]={0x8001};
void lcd_write(char,int word);
//инициализация дисплея
void lcd_init()
{
for(i=0; i<12; i++) lcd_write(cmd, INIT1[i]); //Первый массив данных
delay_ms(7);
for(i=0; i<20; i++) lcd_write(cmd, INIT2[i]); //Второй массив данных
delay_ms(50);
for(i=0; i<1; i++) lcd_write(cmd, INIT3[i]); //Третий массив данных
delay_ms(5);
}
//Запись байта
void lcd_write(char datcom, int word)
{
if(datcom & 1) LCD_RS=1; else LCD_RS=0;
LCD_CS=0;
LCD_SCK=0;if (word & 32768) LCD_DAT=1;else LCD_DAT=0;LCD_SCK=1;
LCD_SCK=0;if (word & 16384) LCD_DAT=1;else LCD_DAT=0;LCD_SCK=1;
LCD_SCK=0;if (word & 8192) LCD_DAT=1;else LCD_DAT=0;LCD_SCK=1;
LCD_SCK=0;if (word & 4096) LCD_DAT=1;else LCD_DAT=0;LCD_SCK=1;
LCD_SCK=0;if (word & 2048) LCD_DAT=1;else LCD_DAT=0;LCD_SCK=1;
LCD_SCK=0;if (word & 1024) LCD_DAT=1;else LCD_DAT=0;LCD_SCK=1;
LCD_SCK=0;if (word & 512) LCD_DAT=1;else LCD_DAT=0;LCD_SCK=1;
LCD_SCK=0;if (word & 256) LCD_DAT=1;else LCD_DAT=0;LCD_SCK=1;
LCD_SCK=0;if (word & 128) LCD_DAT=1;else LCD_DAT=0;LCD_SCK=1;
LCD_SCK=0;if (word & 64) LCD_DAT=1;else LCD_DAT=0;LCD_SCK=1;
LCD_SCK=0;if (word & 32) LCD_DAT=1;else LCD_DAT=0;LCD_SCK=1;
LCD_SCK=0;if (word & 16) LCD_DAT=1;else LCD_DAT=0;LCD_SCK=1;
LCD_SCK=0;if (word & 8) LCD_DAT=1;else LCD_DAT=0;LCD_SCK=1;
LCD_SCK=0;if (word & 4) LCD_DAT=1;else LCD_DAT=0;LCD_SCK=1;
LCD_SCK=0;if (word & 2) LCD_DAT=1;else LCD_DAT=0;LCD_SCK=1;
LCD_SCK=0;if (word & 1) LCD_DAT=1;else LCD_DAT=0;LCD_SCK=1;
LCD_CS=1;
}
Проверял в VMLAB, все скачки подходят под числа, никаких сдвигов, все ноги (вроде RESET) в нужном лог. уровне. Причем всё сверял с немцами. различается лишь что я посылаю int, а в рабочем примере char, и у немцев идет небольшая пауза между передаче двух char-ов (пр. их - 0xFD,0xFD, мой 0xFDFD), но кристалл в это время все равно не выбран так что ни на что влиять не должно.
Я вообще в непонятках. Как я понимаю после того что я привел выше на дисплее должен появиться мусор. Однако черный экран.
Заранее огромной спасибо за помощь.