<?xml version="1.0" encoding="UTF-8"?>        <rss version="2.0"
             xmlns:atom="http://www.w3.org/2005/Atom"
             xmlns:dc="http://purl.org/dc/elements/1.1/"
             xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
             xmlns:admin="http://webns.net/mvcb/"
             xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
             xmlns:content="http://purl.org/rss/1.0/modules/content/">
        <channel>
            <title>
									Программирование микроконтроллеров - Форум Радиодеда				            </title>
            <link>https://radioded.ru/forum/programmirovanie/</link>
            <description>Форум о микроконтроллерах и электронике: обсуждение схем и проектов, помощь начинающим</description>
            <language>ru-RU</language>
            <lastBuildDate>Tue, 14 Jul 2026 13:01:46 +0000</lastBuildDate>
            <generator>wpForo</generator>
            <ttl>60</ttl>
							                    <item>
                        <title>Примеры работы с Xmega</title>
                        <link>https://radioded.ru/forum/programmirovanie/%d0%bf%d1%80%d0%b8%d0%bc%d0%b5%d1%80%d1%8b-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d1%8b-%d1%81-xmega/</link>
                        <pubDate>Tue, 23 Aug 2011 09:11:19 +0000</pubDate>
                        <description><![CDATA[Примеры работы на микропроцессорах AVR ( в основном Xmega) с открытыми кодами программ.]]></description>
                        <content:encoded><![CDATA[Примеры работы на микропроцессорах AVR ( в основном Xmega) с открытыми кодами программ. <br> <a href="http://www.mpcontrol.ru/index.php?option=com_content&amp;view=article&amp;id=53&amp;Itemid=36">http://www.mpcontrol.ru/index.php?option=com_content&amp;view=article&amp;id=53&amp;Itemid=36</a>]]></content:encoded>
						                            <category domain="https://radioded.ru/forum/programmirovanie/">Программирование микроконтроллеров</category>                        <dc:creator>zumanah</dc:creator>
                        <guid isPermaLink="true">https://radioded.ru/forum/programmirovanie/%d0%bf%d1%80%d0%b8%d0%bc%d0%b5%d1%80%d1%8b-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d1%8b-%d1%81-xmega/</guid>
                    </item>
				                    <item>
                        <title>Расчет контрольной суммы</title>
                        <link>https://radioded.ru/forum/programmirovanie/%d1%80%d0%b0%d1%81%d1%87%d0%b5%d1%82-%d0%ba%d0%be%d0%bd%d1%82%d1%80%d0%be%d0%bb%d1%8c%d0%bd%d0%be%d0%b9-%d1%81%d1%83%d0%bc%d0%bc%d1%8b/</link>
                        <pubDate>Sun, 22 Aug 2010 14:46:39 +0000</pubDate>
                        <description><![CDATA[Очень пригодилось при анализе данных на целостность при передаче по радиоканалу (можно и в других целях использовать), может еще кому пригодится. unsigned char calc_crc (unsigned char *mas) ...]]></description>
                        <content:encoded><![CDATA[Очень пригодилось при анализе данных на целостность при передаче по радиоканалу (можно и в других целях использовать), может еще кому пригодится. <br><CODE>unsigned char calc_crc (unsigned char *mas) 
{ 
unsigned char i,data,crc,fb,st_byt; 
st_byt=0; 
crc=0; 
do{ 
data=mas; 
for (i=0;i&lt;8;i++)// счетчик битов в байте 
{ 
fb =crc  ^ data; 
fb&amp;=1; 
crc &gt;&gt;= 1; 
data &gt;&gt; =1; 
if (fb == 1)crc^=0x8c;// полином, мля 
} 
st_byt++; 
}while  (st_byt != 8);// счетчик байтов в массиве 
return crc; 
}</CODE>]]></content:encoded>
						                            <category domain="https://radioded.ru/forum/programmirovanie/">Программирование микроконтроллеров</category>                        <dc:creator>Bingo</dc:creator>
                        <guid isPermaLink="true">https://radioded.ru/forum/programmirovanie/%d1%80%d0%b0%d1%81%d1%87%d0%b5%d1%82-%d0%ba%d0%be%d0%bd%d1%82%d1%80%d0%be%d0%bb%d1%8c%d0%bd%d0%be%d0%b9-%d1%81%d1%83%d0%bc%d0%bc%d1%8b/</guid>
                    </item>
				                    <item>
                        <title>Работа с протоколом PS/2 (клавиатура)</title>
                        <link>https://radioded.ru/forum/programmirovanie/%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0-%d1%81-%d0%bf%d1%80%d0%be%d1%82%d0%be%d0%ba%d0%be%d0%bb%d0%be%d0%bc-ps-2-%d0%ba%d0%bb%d0%b0%d0%b2%d0%b8%d0%b0%d1%82%d1%83%d1%80%d0%b0/</link>
                        <pubDate>Tue, 01 Dec 2009 22:11:01 +0000</pubDate>
                        <description><![CDATA[Недавно делал проект по защите информации &quot;RC4 шифрование радиоканала&quot;.Пришлось работать с интерфейсом PS/2 т.к. ввод пароля на передающем устройстве осуществлялась именно с неё. Выход Clock...]]></description>
                        <content:encoded><![CDATA[Недавно делал проект по защите информации "RC4 шифрование радиоканала".<br>Пришлось работать с интерфейсом PS/2 т.к. ввод пароля на передающем устройстве осуществлялась именно с неё. Выход Clock подключается к ножке INT1 (микроконтроллера ATmega48), а выход Data к PINC.0.<br><br>Документацию на протокол PS/2 можно посмотреть здесь: <a href="http://radioded.ru/content/view/53/49/">http://radioded.ru/content/view/53/49/</a>.<br><br>А вот часть исходника:
<CODE>#include &lt;avr/io.h&gt;
#define F_CPU 8000000
#include &lt;util/delay.h&gt;
#include &lt;avr/interrupt.h&gt;
#include &lt;avr/sleep.h&gt; 

//...
 
char flag=11, parity=0;
unsigned int keyboard_data;
unsigned char button, previous_button;

ISR(INT1_vect){	    // обработчик прерывания
  
  if ( flag &gt; 0){
    if ((PINC &amp; (0x01)) == (0x01)){
      keyboard_data |= 0x8000;
      if (flag &gt; 2) parity ^= 0x01;
    }
    keyboard_data = keyboard_data &gt;&gt; 1;
    flag--;
  }
	
  if (flag == 0){
    keyboard_data = keyboard_data &gt;&gt; 4;
    parity ^= 0x01;
    if ( ((keyboard_data &amp; 0x0001) == 0) &amp;&amp; (((keyboard_data &amp; 0x0200) &gt;&gt; 9) == parity) &amp;&amp; ((keyboard_data &amp; 0x0400) != 0) ){
      button = (unsigned char) ((keyboard_data &gt;&gt; 1) &amp; 0x00FF);
      switch (button) {
        case 0x1C : button='A'; break;
        case 0x32 : button='B'; break;
        case 0x21 : button='C'; break;
        case 0x23 : button='D'; break;
        case 0x24 : button='E'; break;
        case 0x2B : button='F'; break;
        case 0x34 : button='G'; break;
        case 0x33 : button='H'; break;
        case 0x43 : button='I'; break;
        case 0x3B : button='J'; break;
        case 0x42 : button='K'; break;
        case 0x4B : button='L'; break;
        case 0x3A : button='M'; break;
        case 0x31 : button='N'; break;
        case 0x44 : button='O'; break;
        case 0x4D : button='P'; break;
        case 0x15 : button='Q'; break;
        case 0x2D : button='R'; break;
        case 0x1B : button='S'; break;
        case 0x2C : button='T'; break;
        case 0x3C : button='U'; break;
        case 0x2A : button='V'; break;
        case 0x1D : button='W'; break;
        case 0x22 : button='X'; break;
        case 0x35 : button='Y'; break;
        case 0x1A : button='Z'; break;
        case 0x45 : button='0'; break;
        case 0x16 : button='1'; break;
        case 0x1E : button='2'; break;
        case 0x26 : button='3'; break;
        case 0x25 : button='4'; break;
        case 0x2E : button='5'; break;
        case 0x36 : button='6'; break;
        case 0x3D : button='7'; break;
        case 0x3E : button='8'; break;
        case 0x46 : button='9'; break;
        case 0x29 : button=' '; break;                      // space!!!
        case 0x76 : clearlcd(); home(); break;
        case 0xF0 : button ='#'; break; 			// break code
        case 0x5A : button = '!'; break;			// enter
        default : button='?'; break;
    }
		
    if ((button!= previous_button)&amp;&amp;(button != '#')){
	    PORTD ^= (1&lt;&lt;1);
	    previous_button = button;               // обработка нажатой клавиши
    } 

	  
	}
	flag=11;
	parity=0;
  }
}
 

int main(void){
  EICRA |=(1&lt;&lt;ISC11)|(0&lt;&lt;ISC10);			// прерывания по нарастающему фронту
  EIMSK |= (1&lt;&lt;INT1);
  DDRD = 0b00000010; 					// LED
  sei();
}</CODE>]]></content:encoded>
						                            <category domain="https://radioded.ru/forum/programmirovanie/">Программирование микроконтроллеров</category>                        <dc:creator>Radioded</dc:creator>
                        <guid isPermaLink="true">https://radioded.ru/forum/programmirovanie/%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0-%d1%81-%d0%bf%d1%80%d0%be%d1%82%d0%be%d0%ba%d0%be%d0%bb%d0%be%d0%bc-ps-2-%d0%ba%d0%bb%d0%b0%d0%b2%d0%b8%d0%b0%d1%82%d1%83%d1%80%d0%b0/</guid>
                    </item>
				                    <item>
                        <title>Умножение, деление, BCD-преобразование</title>
                        <link>https://radioded.ru/forum/programmirovanie/%d1%83%d0%bc%d0%bd%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b4%d0%b5%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-bcd-%d0%bf%d1%80%d0%b5%d0%be%d0%b1%d1%80%d0%b0%d0%b7%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5/</link>
                        <pubDate>Wed, 28 Oct 2009 16:45:32 +0000</pubDate>
                        <description><![CDATA[Здравствуйте. Думаю, программы умножения, деления очень больших чисел, а также преобразование двоичного кода в двоично-десятичный для AVR пригодятся начинающим ассемблерщикам. Преобразование...]]></description>
                        <content:encoded><![CDATA[Здравствуйте. Думаю, программы умножения, деления очень больших чисел, а также преобразование двоичного кода в двоично-десятичный для AVR пригодятся начинающим ассемблерщикам. Преобразование bin_bcd взято отсюда<br><a href="http://electronix.ru/forum/index.php?s=&amp;showtopic=10934&amp;view=findpost&amp;p=324208">http://electronix.ru/forum/index.php?s=&amp;showtopic=10934&amp;view=findpost&amp;p=324208</a><br>Отдельное спасибо <B>umup</B> за красивый алгоритм преобразования в двоично-десятичный код.<br>Извините, пишу как умею.
<div class="wpforo-attached-file"><a class="wpforo-default-attachment go2wpf-inline-attach" href="//radioded.ru/wp-content/uploads/wpforo/attachments/18/349=38-MULT_DIV_BIN_BCD.rar"><i class="fas fa-paperclip"></i> MULT_DIV_BIN_BCD.rar</a></div>]]></content:encoded>
						                            <category domain="https://radioded.ru/forum/programmirovanie/">Программирование микроконтроллеров</category>                        <dc:creator>akl</dc:creator>
                        <guid isPermaLink="true">https://radioded.ru/forum/programmirovanie/%d1%83%d0%bc%d0%bd%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b4%d0%b5%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-bcd-%d0%bf%d1%80%d0%b5%d0%be%d0%b1%d1%80%d0%b0%d0%b7%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5/</guid>
                    </item>
				                    <item>
                        <title>Управление TIC8148</title>
                        <link>https://radioded.ru/forum/programmirovanie/%d1%83%d0%bf%d1%80%d0%b0%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-tic8148/</link>
                        <pubDate>Thu, 02 Apr 2009 16:55:40 +0000</pubDate>
                        <description><![CDATA[Здравствуйте.У AMPIRE есть неплохие LCD индикаторы серии TICxxxx с контроллером ML1001. Достоинства:-управление всего по трем проводам-низкое потребление-возможность работы от 3В-низкая цена...]]></description>
                        <content:encoded><![CDATA[Здравствуйте.<br>У AMPIRE есть неплохие LCD индикаторы серии TICxxxx с контроллером ML1001. Достоинства:<br>-управление всего по трем проводам<br>-низкое потребление<br>-возможность работы от 3В<br>-низкая цена<br>-доступность<br>Если подсоединить индикатор TIC8148 в соответствии<br>с рисунком к AT90S8515(ATmega8515), который прошит программой  из приложения, то индикатор должен показывать последовательно 0,1,2...9,спецсимволы во всех знакоместах.<br>Может кому пригодится.<div class="wpforo-attached-file"><a class="wpforo-default-attachment go2wpf-inline-attach" href="//radioded.ru/wp-content/uploads/wpforo/attachments/18/98=17-TIC8148_1.rar"><i class="fas fa-paperclip"></i> TIC8148_1.rar</a></div>]]></content:encoded>
						                            <category domain="https://radioded.ru/forum/programmirovanie/">Программирование микроконтроллеров</category>                        <dc:creator>akl</dc:creator>
                        <guid isPermaLink="true">https://radioded.ru/forum/programmirovanie/%d1%83%d0%bf%d1%80%d0%b0%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-tic8148/</guid>
                    </item>
				                    <item>
                        <title>Работа с MMC/SD картой памяти.</title>
                        <link>https://radioded.ru/forum/programmirovanie/%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0-%d1%81-mmc-sd-%d0%ba%d0%b0%d1%80%d1%82%d0%be%d0%b9-%d0%bf%d0%b0%d0%bc%d1%8f%d1%82%d0%b8/</link>
                        <pubDate>Sat, 28 Mar 2009 17:12:37 +0000</pubDate>
                        <description><![CDATA[Когда-то подключал карточку памяти к МК ATmega32, с файловой системой не стал заморачиваться, спокойно можно писать побайтно, а читать блочно. На компе надо будет ставить WinHEX чтобы работа...]]></description>
                        <content:encoded><![CDATA[Когда-то подключал карточку памяти к МК ATmega32, с файловой системой не стал заморачиваться, спокойно можно писать побайтно, а читать блочно. На компе надо будет ставить WinHEX чтобы работать без файловой системы, там можно считать или записать каждый байт.<br>Вот сам исходник:
<CODE>/* 	
	MMC/SD application - SPI mode
	ATMega32
	LCD 16*2

*/

//_____ INCLUDES _________________________________________

#include &lt;avr/io.h&gt;
#define F_CPU 1000000
#include &lt;util/delay.h&gt;
#include &lt;avr/interrupt.h&gt;
#include &lt;string.h&gt;
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;lcd.h&gt;

#define MMC_CS_1 		PORTB |=0b00001000						
#define MMC_CS_0 		PORTB &amp;=0b11110111
#define OK 0x01
#define FAIL 0x02

//#define cbi(reg, bit) (reg&amp;=~(1&lt;&lt;bit))
//#define sbi(reg, bit) (reg|= (1&lt;&lt;bit))

/** MMC/SD card SPI mode commands **/
/*
#define CMD0  0x40    // software reset
#define CMD1  0x41    // brings card out of idle state
#define CMD9  0x49    // ask card to send card speficic data (CSD)
#define CMD10 0x4A    // ask card to send card identification (CID)
#define CMD12 0x4C    // stop transmission on multiple block read
#define CMD13 0x4D    // ask the card to send it's status register
#define CMD16 0x50    // sets the block length used by the memory card
#define CMD17 0x51    // read single block
#define CMD18 0x52    // read multiple block
#define CMD24 0x58    // writes a single block
#define CMD25 0x59    // writes multiple blocks
#define CMD27 0x5B    // change the bits in CSD
#define CMD28 0x5C    // sets the write protection bit
#define CMD29 0x5D    // clears the write protection bit
#define CMD30 0x5E    // checks the write protection bit
#define CMD32 0x60    // Sets the address of the first sector of the erase group
#define CMD33 0x61    // Sets the address of the last sector of the erase group
#define CMD34 0x62    // removes a sector from the selected group
#define CMD35 0x63    // Sets the address of the first group
#define CMD36 0x64    // Sets the address of the last erase group
#define CMD37 0x65    // removes a group from the selected section
#define CMD38 0x66    // erase all selected groups
#define CMD42 0x6A    // locks a block
#define CMD58 0x7A    // reads the OCR register
#define CMD59 0x7B    // turns CRC off
*/

char buffer;
unsigned int i;
char mmc_block;
char number;

char hello[]="   Hello!";
char cmd0_ok[] = "CMD0 OK";
char cmd0_fail[] = "CMD0 FAIL!!!";
char cmd1_ok[] = "CMD1 OK";
char cmd1_fail[] = "CMD1 FAIL!!!";
char mmc_init_ok[] = "MMC init OK";
char mmc_error[]= "Error";
char mmc_write_error[] = "Write Error";
char mmc_read_error[] = "Read Error";

unsigned char temp=0;
unsigned int i=0;

ISR(INT0_vect){
	GICR &amp;= ~(1&lt;&lt;INT0);
	
	_delay_ms(15);
	if ((PIND &amp; 0b00000100) == 0){		// OK
	
		PORTD ^=(1&lt;&lt;7); 			// toggle Led
		
	}
	
	_delay_ms(30);
	GICR |= (1&lt;&lt;INT0);

}

void spi_init(void){

	DDRB = 0b10111111;																		// all outputs, MISO - input
	SPCR = (0&lt;&lt;SPIE)|(1&lt;&lt;SPE)|(1&lt;&lt;MSTR)|(0&lt;&lt;CPOL)|(0&lt;&lt;CPHA)|(0&lt;&lt;SPR1)|(1&lt;&lt;SPR0);		// master OSC/8

}


unsigned char spi_transmit(unsigned char data){

	SPDR = data;
	while(!(SPSR &amp; (1&lt;&lt;SPIF)));							// wait until transmitting
	return SPDR;
}

unsigned char mmc_command( unsigned char befF, unsigned int AdrH, unsigned int AdrL, unsigned char befH){

	spi_transmit(0xFF);
	spi_transmit(befF);
	spi_transmit((AdrH &amp; 0xFF00)&gt;&gt;8);
	spi_transmit(AdrH &amp; 0x00FF);
	spi_transmit((AdrL &amp; 0xFF00)&gt;&gt;8);
	spi_transmit(AdrL &amp; 0x00FF);
	spi_transmit(befH);
	spi_transmit(0xFF);
	
	return spi_transmit(0xFF);
}

unsigned char mmc_init(void){

	MMC_CS_1;
	_delay_ms(5);

	for(i=0; i&lt;10; i++) {
	  temp = spi_transmit(0xFF);
	  _delay_us(10);
	}

	MMC_CS_0;
	_delay_ms(5);
	
	if (mmc_command(0x40, 0, 0, 0x95) == 0x01){				// CMD0
	  clearlcd();
	  _delay_ms(10);
	  showstr(cmd0_ok);
	} else{
	  clearlcd();
	  _delay_ms(10);
	  showstr(cmd0_fail);
	  return 0;
	}
	

	while(mmc_command(0x41,0,0,0xFF) != 0x00) _delay_ms(10);	// CMD1
	
	clearlcd();
	_delay_ms(10);
	showstr(cmd1_ok);
	
	//if (Command(0x50,0,512,0xFF) !=0) showstr(mmc_error);		// CMD16 - set block length

	return OK;
}


void mmc_write(void){

	if (mmc_command(0x58,0,0,0xFF) !=0){	// CMD24 - write a single block
		
	  clearlcd();
	  showstr(mmc_write_error);
	
	}
	
	spi_transmit(0xFF);
	spi_transmit(0xFF);
	spi_transmit(0xFE); 
	
	for (i=0; i&lt;512; i++) spi_transmit(i &amp; 0xFF);
	
	spi_transmit(0xFF);
	spi_transmit(0xFF);
	temp = spi_transmit(0xFF);
	
	if ( (temp &amp; 0b00011111) != 0b00000101){
		
	  clearlcd();
	  showstr(mmc_write_error);
		
	}
	
	while(spi_transmit(0xFF) != 0xFF);

}

void mmc_read(void){

	if ((mmc_command(0x51,0,0,0xFF)) != 0){ 
		
	  clearlcd();
	  showstr(mmc_read_error);
	
	}
	
	while (spi_transmit(0xFF) != 0xFE);
	
	for(i=0; i &lt; 512; i++) mmc_block<i> = spi_transmit(0xFF);              // Передача байта данных

	spi_transmit(0xFF);														// CRC16
	spi_transmit(0xFF);


}

void delay_ms(unsigned int t){
	unsigned int i;
	for (i=0; i&lt;t; i++) _delay_ms(1);
}

int main (void) {

	
	lcdinit();
	spi_init();
	
	DDRD = 0b10000000; 			// inputs and PD7 - output
	PORTD |=(1&lt;&lt;2);
	PORTB = 0b00001000;
	
	MCUCR = 0b00001010;			// Falling edge
	GICR |= (1&lt;&lt;INT0);

	clearlcd();
	showstr(hello);

	delay_ms(400);

	if (mmc_init() == OK){
	
	_delay_ms(100);
	clearlcd();
	_delay_ms(10);
	showstr(mmc_init_ok);
	
	}
	
	SPCR = (0&lt;&lt;SPIE)|(1&lt;&lt;SPE)|(1&lt;&lt;MSTR)|(0&lt;&lt;CPOL)|(0&lt;&lt;CPHA)|(0&lt;&lt;SPR1)|(0&lt;&lt;SPR0);		// CK/2
	SPSR = (1&lt;&lt;SPI2X);
	
	clearlcd();
	
	delay_ms(600);
	mmc_write();

	delay_ms(100);
	mmc_read();
	delay_ms(600);
	
	for (i=0; i&lt;512; i++){
	
		clearlcd();
		_delay_ms(10);
		lcddata(mmc_block<i>);
		delay_ms(300);
	}


	while(1);
	
}</CODE><div class="wpforo-attached-file"><a class="wpforo-default-attachment go2wpf-inline-attach" href="//radioded.ru/wp-content/uploads/wpforo/attachments/1/89=15-mmc.rar"><i class="fas fa-paperclip"></i> mmc.rar</a></div>]]></content:encoded>
						                            <category domain="https://radioded.ru/forum/programmirovanie/">Программирование микроконтроллеров</category>                        <dc:creator>Radioded</dc:creator>
                        <guid isPermaLink="true">https://radioded.ru/forum/programmirovanie/%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0-%d1%81-mmc-sd-%d0%ba%d0%b0%d1%80%d1%82%d0%be%d0%b9-%d0%bf%d0%b0%d0%bc%d1%8f%d1%82%d0%b8/</guid>
                    </item>
				                    <item>
                        <title>Библиотека для работы с дисплеем 16*2 на Си под WinAVR</title>
                        <link>https://radioded.ru/forum/programmirovanie/%d0%b1%d0%b8%d0%b1%d0%bb%d0%b8%d0%be%d1%82%d0%b5%d0%ba%d0%b0-%d0%b4%d0%bb%d1%8f-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d1%8b-%d1%81-%d0%b4%d0%b8%d1%81%d0%bf%d0%bb%d0%b5%d0%b5%d0%bc-162-%d0%bd%d0%b0-%d1%81/</link>
                        <pubDate>Sun, 04 Jan 2009 02:49:54 +0000</pubDate>
                        <description><![CDATA[Начнём-с, для затравки библиотека функций для работы с дисплеем 16x2 на контроллере HD44780. Изначально код писался под WinAVR.Вот сам код, или качайте прикреплённый файл lcd.h:#define cbi(r...]]></description>
                        <content:encoded><![CDATA[Начнём-с, для затравки библиотека функций для работы с дисплеем 16x2 на контроллере HD44780. Изначально код писался под WinAVR.<br>Вот сам код, или качайте прикреплённый файл <B>lcd.h</B>:<br><CODE>#define cbi(reg, bit) (reg&amp;=~(1&lt;&lt;bit))
#define sbi(reg, bit) (reg|= (1&lt;&lt;bit))

#define LCDPORT PORTC
#define LCDDDR DDRC
#define RS 0
#define E 1


#define RS_0 cbi(LCDPORT,RS)
#define RS_1 sbi(LCDPORT,RS)
#define E_0 cbi(LCDPORT,E)
#define E_1 sbi(LCDPORT,E)

void clearlcd(void);
void lcddata(unsigned char temp);
void lcdcmd(unsigned char temp);
void showstr(unsigned char *s);
void shiftleft(void);
void shiftright(void);
void home(void);

const unsigned char lcdaddr = {0X80, 0XC0, 0X94, 0XD4};

void setlcdposition(unsigned char row, unsigned char col){

	lcdcmd(lcdaddr + col);
	
}

void lcdcmd(unsigned char temp){
	
	LCDPORT = (temp &amp; 0xF0);
	RS_0;		// command
	E_1;
	_delay_us(2);
	E_0;

	LCDPORT = ((temp &amp; 0x0F) &lt;&lt; 4);
	RS_0;		// command
	E_1;
	_delay_us(2);
	E_0;
	
	_delay_ms(1);
}

void lcddata(unsigned char temp){
	
	LCDPORT = (temp &amp; 0xF0);
	RS_1;		// data
	E_1;
	_delay_us(2);
	E_0;
	
	LCDPORT = ((temp &amp; 0x0F) &lt;&lt; 4);
	RS_1;		// data
	E_1;
	_delay_us(2);
	E_0;
	
	_delay_us(50);
}

void lcdinit(void){

	PORTC = 0x00;
	DDRC = 0b11110011; 	// output
	_delay_ms(60);

	lcdcmd(0x30);		
	_delay_ms(5);
	
	lcdcmd(0x30);		
	_delay_us(200);

	lcdcmd(0x30);		
	_delay_us(200);
	
	lcdcmd(0x02);		// 4bit mode

	lcdcmd(0x02);		// 4bit mode

	lcdcmd(0x28); 		// 4 bit, 2 lines, 5*7 font
	
	lcdcmd(0x0C);		// cursor OFF, display ON

	lcdcmd(0x06);		// -&gt; inc
	
	clearlcd();
}

void clearlcd(void){
	lcdcmd(0x01); 	// clear LCD
	_delay_ms(3);	// max 1.53mS
}

void home(void){
	lcdcmd(0x02); 	
	_delay_ms(3);	// max 1.53mS
}

void secondline(void){

	lcdcmd(0xC0);
	_delay_ms(3);

}
void shiftleft(void){
	lcdcmd(0x04);
}

void shiftright(void){
	lcdcmd(0x06);
}

void showstr(unsigned char *s){
  while(*s != 0) lcddata(*s++);
  _delay_ms(1);
}</CODE>

Пример использования функций из библиотеки:
<CODE><i>
</i>#include &lt;avr/io.h&gt;
#define F_CPU 1000000
#include &lt;util/delay.h&gt;
#include &lt;avr/interrupt.h&gt;
#include &lt;string.h&gt;
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

#include &lt;lcd.h&gt;

char word[]="Hello";
char banner[]="radioded.ru";
int main (void) {

	lcdinit();
	clearlcd();
	showstr(word);
	secondline();
	showstr(banner);

}
</CODE>]]></content:encoded>
						                            <category domain="https://radioded.ru/forum/programmirovanie/">Программирование микроконтроллеров</category>                        <dc:creator>Radioded</dc:creator>
                        <guid isPermaLink="true">https://radioded.ru/forum/programmirovanie/%d0%b1%d0%b8%d0%b1%d0%bb%d0%b8%d0%be%d1%82%d0%b5%d0%ba%d0%b0-%d0%b4%d0%bb%d1%8f-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d1%8b-%d1%81-%d0%b4%d0%b8%d1%81%d0%bf%d0%bb%d0%b5%d0%b5%d0%bc-162-%d0%bd%d0%b0-%d1%81/</guid>
                    </item>
				                    <item>
                        <title>Давайте делиться своими исходниками!</title>
                        <link>https://radioded.ru/forum/programmirovanie/%d0%b4%d0%b0%d0%b2%d0%b0%d0%b9%d1%82%d0%b5-%d0%b4%d0%b5%d0%bb%d0%b8%d1%82%d1%8c%d1%81%d1%8f-%d1%81%d0%b2%d0%be%d0%b8%d0%bc%d0%b8-%d0%b8%d1%81%d1%85%d0%be%d0%b4%d0%bd%d0%b8%d0%ba%d0%b0%d0%bc%d0%b8/</link>
                        <pubDate>Sun, 04 Jan 2009 02:39:20 +0000</pubDate>
                        <description><![CDATA[Уважаемые форумчане, давайте делать благие дела, а именно делиться своими исходниками. Не важно на чем написан код, будь то Си или ассемблер - возможно они кому-то пригодятся. Очень многие р...]]></description>
                        <content:encoded><![CDATA[Уважаемые форумчане, давайте делать благие дела, а именно делиться своими исходниками. Не важно на чем написан код, будь то Си или ассемблер - возможно они кому-то пригодятся. Очень многие радиолюбители будут благодарны. Как говориться, с миру по нитке!]]></content:encoded>
						                            <category domain="https://radioded.ru/forum/programmirovanie/">Программирование микроконтроллеров</category>                        <dc:creator>Radioded</dc:creator>
                        <guid isPermaLink="true">https://radioded.ru/forum/programmirovanie/%d0%b4%d0%b0%d0%b2%d0%b0%d0%b9%d1%82%d0%b5-%d0%b4%d0%b5%d0%bb%d0%b8%d1%82%d1%8c%d1%81%d1%8f-%d1%81%d0%b2%d0%be%d0%b8%d0%bc%d0%b8-%d0%b8%d1%81%d1%85%d0%be%d0%b4%d0%bd%d0%b8%d0%ba%d0%b0%d0%bc%d0%b8/</guid>
                    </item>
							        </channel>
        </rss>
		