Сервопривод

оживление LCD

вернуться на главную

Сервопривод: программирование

#include "iom16.h"


void lcd_wait(void)
{
char x=1;

  DDRB &= ~0xF; //3..0 data lines for input
  PORTB &= ~0x10; // RS = 0 (command register)
  PORTB |= 0x20;  // RW = 1 (read)
  do{
    PORTB |= 0x40;  // E = 1 (enable)
    PORTB |= 0x40;  // E = 1 (enable) delay for correct read
    if(~PINB & 0x8)
     x = 0;//if no busy
    PORTB &= ~0x40;  // E = 0 
    PORTB |= 0x40;  // E = 1 (enable)
    PORTB &= ~0x40;  // E = 0 
   }while(x);
  PORTB &= ~0x20;  // RW = 0 (write)
  DDRB |= 0xF; //3..0 data lines for output
}

void lcd_command(unsigned char command)
{
  lcd_wait();
  
  PORTB = (PORTB & 0xF0) | (command>>4 & 0xf); //Hi nibble
  PORTB |= 0x40;  // E = 1 (enable)
  PORTB &= ~0x40;  // E = 0 
  PORTB = (PORTB & 0xF0) | (command & 0xf); //Lo nibble
  PORTB |= 0x40;  // E = 1 (enable)
  PORTB &= ~0x40;  // E = 0 
}

void lcd_data(unsigned char data)
{
  lcd_wait();

  PORTB = (PORTB & 0xF0) | (data>>4 & 0xf); //Hi nibble
  PORTB |= 0x10; // RS = 1 (data register)
  PORTB |= 0x40;  // E = 1 (enable)
  PORTB &= ~0x40;  // E = 0 
  PORTB = (PORTB & 0xF0) | (data & 0xf); //Lo nibble
  PORTB |= 0x40;  // E = 1 (enable)
  PORTB &= ~0x40;  // E = 0 
}


void main(void)
{
//int c=0x3456;
char str1[]="Hello, World!";
unsigned char i;

  DDRB |= 0x70; //RS, RW, E

  DDRA |= 1; //A0 output

  lcd_command(0x28); //4bit/2lines/5x7
  
//  lcd_command(0xf); //display On/cursor On/cursor BlinkOn
  lcd_command(0xc); //display On/cursor Off/cursor BlinkOff
  lcd_command(0x01); //clears display
 // lcd_data('a');
  
  for(i=0; str1[i] !=0; i++)
    lcd_data(str1[i]);

  for(;;)
  {
    PORTA |= 1; //A0 ->1
    PORTA &= 0xFE; //A0 ->0
  }

}

Как ни странно, фурычит! Остаётся удивляться, какие прочные бывают дисплеи : )

servo

Сервопривод: программирование

вернуться на главную



Сайт создан в системе uCoz