2014-11-06 1 views
1

LCD 디스플레이 용 C 코드를 실행하는 arduino를 얻으려고합니다. C 코드를 컴파일하고 전송하고 실행하면 문제가 없으며 일부 LED가 깜박입니다. 모든 와이어도 괜찮습니다. LCD 디스플레이 용 '원시'Arduino 라이브러리를 사용할 때 모든 것이 잘 작동하므로 찾을 수없는 코드 오류 여야합니다. (LCD (Embedded C)와 통신하는 방법

. 4 데이터 선 모드 제어를 통해 LCD 및 데이터 핀은 같은 포트에있는 다음

코드입니다 :.

//CPU-Clock Frequency 
#define F_CPU 16000000UL 
#include <avr/io.h> 
#include <util/delay.h> 

// Definitions: 

#define LED_PIN PB5 //PB5 = Arduino Pin 13 (with LED) 

#define COMPARE_REG OCR0A 
#define TIMER_PIN OC0A 
#define TIMER_CONTROL_REGISTER TCCR0A 

#define LCD_PORT PORTD 
#define LCD_PORTDIR DDRD 
//controlpins: 
#define RS_PIN PD0 
#define RW_PIN PD1 
#define ENABLE_PIN PD2 
//datapins: 
#define DB_7 PD7 
#define DB_6 PD6 
#define DB_5 PD5 
#define DB_4 PD4 

//Defined command parameters 
#define CLEAR 0x01 

// Methods 
void sleep(uint16_t sleepTime){ 
for(;sleepTime>0;sleepTime--){ _delay_ms(1);} 
} 
void lcd_enable(){ 
LCD_PORT |= (1<<ENABLE_PIN); 
//TODO: wait for busy? 
sleep(5); 
LCD_PORT &= !(1<<ENABLE_PIN); 
sleep(5); 
} 

void lcd_pushOut(unsigned int data){ 
LCD_PORT &= (0x0F); 
LCD_PORT |= (data & 0xF0); 
lcd_enable(); 
LCD_PORT &= (0x0F); 
LCD_PORT |= (data & 0x0F) << 4; 
lcd_enable(); 
} 

void lcd_command(unsigned int command){ 
unsigned short int tmp = (LCD_PORT & 0x0F); //speichere alte Steuerleitungen 
LCD_PORT &= !(1<<RS_PIN); 
lcd_pushOut(command); 
LCD_PORT |= (1<<RS_PIN); 
LCD_PORT |= tmp; //setze Steuerleitungen zurück 
} 

void lcd_init(){ 
sleep(15); //wait for LCD init 
LCD_PORTDIR = 0xFF; //make port of LCD output. 
LCD_PORT &= !(1<<RW_PIN); //write, dont read. 
LCD_PORT |= (3<<4); //write '3' to port. 
LCD_PORT &= !(1<<RS_PIN); //we give commands, not data! 
lcd_enable(); 
sleep(1); 
lcd_enable(); //write '3' to port 2nd time. 
LCD_PORT &= 0x0F; //behalte steuersignale bei, setze daten'port' zurück. 
LCD_PORT |= (2<<4); //write '2' to port. 
lcd_enable(); 
//from now on LCD is in 4 bit mode. 
lcd_pushOut(0x28); // 4 bit, 5x7 pix, 2 line mode 
lcd_pushOut(0x06); //cursor rückt weiter, display scrollt 
lcd_pushOut(0x0F); //display ein, cursor aus, blinken aus 
lcd_pushOut(0x80); //we will write to DDRAM 
lcd_pushOut(0x01); //clear display 
//begin test writing zeroes. 

LCD_PORT |= (1<<RS_PIN); //give data, not commands! 
} 

void timer_init(){ 
//DDRA |= (1<<TIMER_PIN); //make timerpin output. 
TIMER_CONTROL_REGISTER = 0b10000000; //set timerpin high @bottom, on compare match clear. (0x80) 
COMPARE_REG = 256/2; // dutycycle= 50% 
} 

void setTimerPower(unsigned int percent){ //set PWM Output (high) in % 
COMPARE_REG = (percent/100) * 256; 
} 

int main (void) 
{ 
//INIT 
lcd_init(); 
//timer_init(); 
while(1){ 
lcd_command(CLEAR); 
} 
//now ready to write! let's write 3 zeroes! 
lcd_pushOut('0'); 
lcd_pushOut('0'); 
lcd_pushOut('0'); 
/* 
sleep(5000); 
char c = '0'; 
while (1) { 
lcd_clear(); 
lcd_pushOut(c++); 
sleep(969); // 3x lcd_enable + 1 ms bearbeitungszeit? ... ziemlich großzügig 
if(c > 0x7A) //entspricht c > 'z' 
c='0'; 
} 
*/ 
return 0; 
} 

편집은 : 대부분의 시간, LCD 그냥 모든 첫 번째 줄에 걸쳐 검은 사각형을 만든다 .

+0

링크가 아닌 질문에 코드를 포함해야합니다. – skrrgwasme

답변

4

모든 인스턴스는입니다.은 (는) ~(1<<BIT_NUMBER)으로 변환해야합니다. boolean NOT이며 본질적으로 수행 중입니다! (true) 결과적으로 0이됩니다. (86)에 문제를 보여주는

예 :

int main(int argc, char* argv[]) 
{ 
    printf("%8.8X %8.8X\n", !(1<<2), ~(1<<2)); 
    return 0; 
} 

그리고 출력은 다음과 같습니다

00000000 FFFFFFFB 

변화와 최소한 더 앞서 있습니다. 또한 어떤 컨트롤러가 LCD에 있는지 더 자세히 알려 주어야합니다.

+1

나를 구해 줬어! 커서는 여전히 존재하지만, 지금 쓰고 작동합니다! (커서 thingy 그냥 생각할 수있는 사소한 오류가 될 것입니다!) –