Возникла проблема с выводом строки из флешь и eeprom в printf.
Пример. Создаем строки во флешь и eeprom.
__flash char StrResetEEProm[] = " RST USER RECORD";
char __eeprom ee_NumD[12] = {'N','0','0','0','0','0','0','0','0','0','1',0};
После передаем их на дисплей с помощью printf("%s",StrResetEEProm); и printf("%s",ee_NumD); .А в итоге процессор зависает на printf("%s",StrResetEEProm);.
Вот весь проект.
CODE
#define ENABLE_BIT_DEFINITIONS
#include <ioavr.h>
#include <intrinsics.h>
#include <stdio.h>
//**********************************************
#define ClkFreq 14745600 // частота кварцевого резонатора или частота на которой работает контроллер.
#define _1us (unsigned long int)((ClkFreq / 1000000) / 1.25) // 1.25 погрешность на вызов функции для 1us.
#define _1ms (unsigned long int)(ClkFreq / 1000)
//**********************************************
#define LCDCLEAR {LCD_SendCommand(0x01); delay_ms(1); LCD_SendCommand(0x02); delay_ms(1); LCD_SendCommand(0x80); delay_ms(1);} //Очистка экрана LCD
#define LCD1LINE {LCD_SendCommand(0x80); delay_ms(1);} //Вывод символов на 1-ю строку LCD
#define LCD2LINE {LCD_SendCommand(0xC0); delay_ms(1);} //Вывод символов на 2-ю строку LCD
#define ST1LINE 0x80 //Признак вовыда символов на 1-ю строку LCD
#define ST2LINE 0xC0 //Признак вовыда символов на 2-ю строку LCD
#define RUS 0 //Признак вывода на русском языке
void delay_ms(unsigned int d); // задержка мС
void delay_us(unsigned int d); // задержка мкС
void Pik(void); //Функция выдачи звука
unsigned char WinToDisp(unsigned char c); //Функция перекодировки символов +
int putchar(int c); //Функция вывода символа +
void LCD_SetData(unsigned char data); //Функция выдачи данных в порт LCD +
void LCD_Delay(void); //Функция формирования задержки +
void LCD_SendCommand(unsigned char data); //Функция выдачи команды управления LCD +
void LCD_SendData(unsigned char data); //Функция выдачи данных LCD +
void LCD_Init(void); //Функция инициализации LCD +
void LCD_SetPos(unsigned char x, unsigned char y); //Функция установки номера строки и позиции вывода символа на LCD +
void LCD_SendChar(unsigned char data); //Функция вывода символа на LCD
void LCD_SendString(char *str); //Функция вывода строки на LCD
void repair(void);
void Print_flash (unsigned char x, char __flash *data); // печать в printf из флешь
unsigned char __flash WinTable[] =
{
'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц',
'Ч', 'Ш', 'Щ', 'Ь', 'Ы', 'Ъ', 'Э', 'Ю', 'Я', 'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о',
'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ь', 'ы', 'ъ', 'э', 'ю', 'я'
};
//Дисплей
unsigned char __flash DispTable[] =
{
0x41, 0xA0, 0x42, 0xA1, 0xE0, 0x45, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0x4B, 0xA7, 0x4D, 0x48, 0x4F, 0xA8, 0x50, 0x43, 0x54,
0xA9, 0xAA, 0x58, 0xE1, 0xAB, 0xAC, 0xE2, 0x62, 0xAE, 0xAD, 0xAF, 0xB0, 0xB1, 0x61, 0xB2, 0xB3, 0xB4, 0xE3, 0x65, 0xB5,
0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0x6F, 0xBE, 0x70, 0x63, 0xBF, 0x79, 0xE4, 0x78, 0xE5, 0xC0, 0xC1, 0xE6,
0xC4, 0xC3, 0xC2, 0xC5, 0xC6, 0xC7
};
__flash char StrResetEEProm[] = " RST USER RECORD";
/////////////////////////////////eeprom
char __eeprom ee_NumD[12] = {'N','0','0','0','0','0','0','0','0','0','1',0};
unsigned char text[20] = {0};
void main( void )
{
DDRD = 0x00;
LCD_Init(); // инициализация дисплея
LCDCLEAR LCD_SetPos(0, 0); //Очистка экрана LCD
printf("%s",StrResetEEProm);
repair();
while(1){
}
}
unsigned char WinToDisp(unsigned char c) //Функция перекодировки символов
{
unsigned char i;
for (i = 0; i < sizeof(WinTable); i++)
if (c == WinTable[i])
return (DispTable[i]);
return ©;
}
int putchar(int c)
{
LCD_SendChar(WinToDisp©);
return c;
}
void LCD_SetData(unsigned char data) //Функция выдачи данных в порт LCD
{
if ((data & 0x80) != 0)
PORTA |= (1<<7);
else
PORTA &= ~(1<<7);
if ((data & 0x40) != 0)
PORTA |= (1<<6);
else
PORTA &= ~(1<<6);
if ((data & 0x20) != 0)
PORTA |= (1<<5);
else
PORTA &= ~(1<<5);
if ((data & 0x10) != 0)
PORTA |= (1<<4);
else
PORTA &= ~(1<<4);
if ((data & 0x08) != 0)
PORTA |= (1<<3);
else
PORTA &= ~(1<<3);
if ((data & 0x04) != 0)
PORTA |= (1<<2);
else
PORTA &= ~(1<<2);
if ((data & 0x02) != 0)
PORTA |= (1<<1);
else
PORTA &= ~(1<<1);
if ((data & 0x01) != 0)
PORTA |= (1<<0);
else
PORTA &= ~(1<<0);
}
void LCD_Delay(void) // Функция формирования задержки
{
delay_us(500);
}
void LCD_SendCommand(unsigned char data)
{
PORTB &= ~(1<<4);
LCD_SetData(data);
PORTB |= (1<<0);
LCD_Delay();
PORTB &= ~(1<<0);
}
void LCD_SendData(unsigned char data)
{
PORTB |= (1<<4);
LCD_SetData(data);
PORTB |= (1<<0);
LCD_Delay();
PORTB &= ~(1<<0);
}
void LCD_Init(void)
{
DDRA = 0xFF;
DDRB |= (1 << 0)|(1 << 1)|(1 << 4);
LCD_SendCommand(0x38);
delay_ms(1); //Задержка
LCD_SendCommand(0x38);
delay_ms(1); //Задержка
LCD_SendCommand(0x0C);
delay_ms(1); //Задержка
LCD_SendCommand(0x01);
delay_ms(1); //Задержка
LCD_SendCommand(0x06);
delay_ms(1); //Задержка
LCD_SendCommand(0x02);
delay_ms(1); //Задержка
}
void LCD_SetPos(unsigned char x, unsigned char y)
{
switch (y)
{
case 0:
LCD_SendCommand(0x80 + x);
delay_ms(1);
break;
case 1:
LCD_SendCommand(0xC0 + x);
delay_ms(1);
break;
}
}
void LCD_SendChar(unsigned char data)
{
LCD_SendData(data);
}
void LCD_SendString(char *str)
{
unsigned char i = 0;
while (str[i] != 0)
{
LCD_SendChar(str[i]);
i++;
}
}
void delay_ms(unsigned int d)
{
while(--d)__delay_cycles(_1ms);
}
void delay_us(unsigned int d)
{
while(--d)__delay_cycles(_1us);
}
void Pik(void){ //Функция выдачи звука
DDRB |= (1 << 6); // порт на вывод
for( unsigned char i = 0; i < 100; i++){
PORTB |= (1<<6);
delay_us(100);
PORTB &= ~(1<<6);
delay_us(100);
}
PORTB &= ~(1<<6);
}
void repair(void){
}
void Print_flash (unsigned char x, char __flash *data){ // печать в printf из флешь
for (unsigned char i = 0; data [i] != 0;)
{
text [x++] = data [i++];
}
}
#include <ioavr.h>
#include <intrinsics.h>
#include <stdio.h>
//**********************************************
#define ClkFreq 14745600 // частота кварцевого резонатора или частота на которой работает контроллер.
#define _1us (unsigned long int)((ClkFreq / 1000000) / 1.25) // 1.25 погрешность на вызов функции для 1us.
#define _1ms (unsigned long int)(ClkFreq / 1000)
//**********************************************
#define LCDCLEAR {LCD_SendCommand(0x01); delay_ms(1); LCD_SendCommand(0x02); delay_ms(1); LCD_SendCommand(0x80); delay_ms(1);} //Очистка экрана LCD
#define LCD1LINE {LCD_SendCommand(0x80); delay_ms(1);} //Вывод символов на 1-ю строку LCD
#define LCD2LINE {LCD_SendCommand(0xC0); delay_ms(1);} //Вывод символов на 2-ю строку LCD
#define ST1LINE 0x80 //Признак вовыда символов на 1-ю строку LCD
#define ST2LINE 0xC0 //Признак вовыда символов на 2-ю строку LCD
#define RUS 0 //Признак вывода на русском языке
void delay_ms(unsigned int d); // задержка мС
void delay_us(unsigned int d); // задержка мкС
void Pik(void); //Функция выдачи звука
unsigned char WinToDisp(unsigned char c); //Функция перекодировки символов +
int putchar(int c); //Функция вывода символа +
void LCD_SetData(unsigned char data); //Функция выдачи данных в порт LCD +
void LCD_Delay(void); //Функция формирования задержки +
void LCD_SendCommand(unsigned char data); //Функция выдачи команды управления LCD +
void LCD_SendData(unsigned char data); //Функция выдачи данных LCD +
void LCD_Init(void); //Функция инициализации LCD +
void LCD_SetPos(unsigned char x, unsigned char y); //Функция установки номера строки и позиции вывода символа на LCD +
void LCD_SendChar(unsigned char data); //Функция вывода символа на LCD
void LCD_SendString(char *str); //Функция вывода строки на LCD
void repair(void);
void Print_flash (unsigned char x, char __flash *data); // печать в printf из флешь
unsigned char __flash WinTable[] =
{
'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц',
'Ч', 'Ш', 'Щ', 'Ь', 'Ы', 'Ъ', 'Э', 'Ю', 'Я', 'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о',
'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ь', 'ы', 'ъ', 'э', 'ю', 'я'
};
//Дисплей
unsigned char __flash DispTable[] =
{
0x41, 0xA0, 0x42, 0xA1, 0xE0, 0x45, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0x4B, 0xA7, 0x4D, 0x48, 0x4F, 0xA8, 0x50, 0x43, 0x54,
0xA9, 0xAA, 0x58, 0xE1, 0xAB, 0xAC, 0xE2, 0x62, 0xAE, 0xAD, 0xAF, 0xB0, 0xB1, 0x61, 0xB2, 0xB3, 0xB4, 0xE3, 0x65, 0xB5,
0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0x6F, 0xBE, 0x70, 0x63, 0xBF, 0x79, 0xE4, 0x78, 0xE5, 0xC0, 0xC1, 0xE6,
0xC4, 0xC3, 0xC2, 0xC5, 0xC6, 0xC7
};
__flash char StrResetEEProm[] = " RST USER RECORD";
/////////////////////////////////eeprom
char __eeprom ee_NumD[12] = {'N','0','0','0','0','0','0','0','0','0','1',0};
unsigned char text[20] = {0};
void main( void )
{
DDRD = 0x00;
LCD_Init(); // инициализация дисплея
LCDCLEAR LCD_SetPos(0, 0); //Очистка экрана LCD
printf("%s",StrResetEEProm);
repair();
while(1){
}
}
unsigned char WinToDisp(unsigned char c) //Функция перекодировки символов
{
unsigned char i;
for (i = 0; i < sizeof(WinTable); i++)
if (c == WinTable[i])
return (DispTable[i]);
return ©;
}
int putchar(int c)
{
LCD_SendChar(WinToDisp©);
return c;
}
void LCD_SetData(unsigned char data) //Функция выдачи данных в порт LCD
{
if ((data & 0x80) != 0)
PORTA |= (1<<7);
else
PORTA &= ~(1<<7);
if ((data & 0x40) != 0)
PORTA |= (1<<6);
else
PORTA &= ~(1<<6);
if ((data & 0x20) != 0)
PORTA |= (1<<5);
else
PORTA &= ~(1<<5);
if ((data & 0x10) != 0)
PORTA |= (1<<4);
else
PORTA &= ~(1<<4);
if ((data & 0x08) != 0)
PORTA |= (1<<3);
else
PORTA &= ~(1<<3);
if ((data & 0x04) != 0)
PORTA |= (1<<2);
else
PORTA &= ~(1<<2);
if ((data & 0x02) != 0)
PORTA |= (1<<1);
else
PORTA &= ~(1<<1);
if ((data & 0x01) != 0)
PORTA |= (1<<0);
else
PORTA &= ~(1<<0);
}
void LCD_Delay(void) // Функция формирования задержки
{
delay_us(500);
}
void LCD_SendCommand(unsigned char data)
{
PORTB &= ~(1<<4);
LCD_SetData(data);
PORTB |= (1<<0);
LCD_Delay();
PORTB &= ~(1<<0);
}
void LCD_SendData(unsigned char data)
{
PORTB |= (1<<4);
LCD_SetData(data);
PORTB |= (1<<0);
LCD_Delay();
PORTB &= ~(1<<0);
}
void LCD_Init(void)
{
DDRA = 0xFF;
DDRB |= (1 << 0)|(1 << 1)|(1 << 4);
LCD_SendCommand(0x38);
delay_ms(1); //Задержка
LCD_SendCommand(0x38);
delay_ms(1); //Задержка
LCD_SendCommand(0x0C);
delay_ms(1); //Задержка
LCD_SendCommand(0x01);
delay_ms(1); //Задержка
LCD_SendCommand(0x06);
delay_ms(1); //Задержка
LCD_SendCommand(0x02);
delay_ms(1); //Задержка
}
void LCD_SetPos(unsigned char x, unsigned char y)
{
switch (y)
{
case 0:
LCD_SendCommand(0x80 + x);
delay_ms(1);
break;
case 1:
LCD_SendCommand(0xC0 + x);
delay_ms(1);
break;
}
}
void LCD_SendChar(unsigned char data)
{
LCD_SendData(data);
}
void LCD_SendString(char *str)
{
unsigned char i = 0;
while (str[i] != 0)
{
LCD_SendChar(str[i]);
i++;
}
}
void delay_ms(unsigned int d)
{
while(--d)__delay_cycles(_1ms);
}
void delay_us(unsigned int d)
{
while(--d)__delay_cycles(_1us);
}
void Pik(void){ //Функция выдачи звука
DDRB |= (1 << 6); // порт на вывод
for( unsigned char i = 0; i < 100; i++){
PORTB |= (1<<6);
delay_us(100);
PORTB &= ~(1<<6);
delay_us(100);
}
PORTB &= ~(1<<6);
}
void repair(void){
}
void Print_flash (unsigned char x, char __flash *data){ // печать в printf из флешь
for (unsigned char i = 0; data [i] != 0;)
{
text [x++] = data [i++];
}
}