функция Текста для LCD 122x32

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

функция Текста для LCD 122x32

Сообщение grek » 14 дек 2010, 14:34

Пытаюсь перенести из winawr прогу для работы с LCD 122x32,примером служит sample из proteus sed 1520. Почти все функции перенес,не как не получается с текстом.Не как не могу разобраться почему не получается.Может кто подскажет в чем дело,где кроются мои ошибки? Или возможно кто то уж переносил.
Программа написана на codevision для LCD 16x2 и хочу переделать под графический дисплей.

Код: Выделить всё
lcd_text_intern(5, 4 ,FONT_FIVE_DOT,"0",0);
//lcd_text_String("PRIVET");
//lcd_glyph( 10,10, 30, 30, &icon1_bmp,0);
lcd_update_all();// вывод на LCD
delay_ms(1000);// задержка
lcd_erase();// очистка LCD


Код: Выделить всё
//-------------------------------------------------------------------------------------- 
void lcd_text_intern(unsigned int left, unsigned int top, unsigned int font, flash const char *str, unsigned int inprogmem)
{
       unsigned int x;
       unsigned int glyph;// ñïåöèàëüíûé íàáîðíûé çíàê õðàíÿùèéñÿ â ïàìÿòè,â öèôðîâîì âèäå
       unsigned int width;// øèðèíà
       unsigned int height, defaultheight;// âûñîòà, âûñîòà ïî óìîë÷àíèþ 
       unsigned int store_width;// õðàíèìàÿ øèðèíà
       unsigned int *glyph_ptr;// óêàçàòåëü íà ñïåöèàëüíûé íàáîð
       unsigned int *width_table_ptr;
       unsigned int *glyph_table_ptr;
       unsigned int glyph_beg, glyph_end;
       unsigned int fixedwidth;
       
       x = left;// êîîðäèíàòà ëåâîãî íà÷àëà ñðîêè     
       defaultheight = peekb ( &(unsigned int)(fonts[font].glyph_height) );// áåðåì çíà÷åíèÿ âûñîòû äîëæíî áûòü   "8"
       store_width = peekb ( &((unsigned int)fonts[font].store_width) );// áåðåì çíà÷åíèÿ øèðèíû   "2"
       width_table_ptr = (unsigned int*) pgm_read_word  ( &(fonts[font].width_table) );//
       glyph_table_ptr = (unsigned int*) pgm_read_word ( &(fonts[font].glyph_table) );
       glyph_beg  = peekb( &((unsigned int)fonts[font].glyph_beg) );//    çíà÷åíèå " "
       glyph_end  = peekb( &((unsigned int)fonts[font].glyph_end) );//   çíà÷åíèå "~ "
       fixedwidth = peekb( &((unsigned int)fonts[font].fixed_width) );// çíà÷åíèå "0" 
       
       
       
       
       if (inprogmem)
           {
           glyph = pgm_read_byte((unsigned int )str);
           }
           else
           {
           glyph = (unsigned int)*str;
           }
             
       while(glyph != 0x00) // while(*str != 0x00)
        {             
              if((glyph < glyph_beg) || (glyph > glyph_end))
             
             {
             glyph =  peekb( &((unsigned int)fonts[font].glyph_def) );
             }
             
              glyph -= glyph_beg;
              if(fixedwidth == 0)
            // width=fonts[font].width_table[glyph];   
            {
             width=peekb((unsigned int)width_table_ptr+glyph);
             }
              else
             {
             width = fixedwidth;
             }
              height = defaultheight;
              //glyph_ptr = fonts[font].glyph_table + ((unsigned int)glyph * (unsigned int)store_width * (unsigned int)height);
              glyph_ptr = glyph_table_ptr + ((unsigned int)glyph * (unsigned int)store_width * (unsigned int)height);
             
              if(x > 121)
             {x = 121;}
     
              if((x + width) > 121+1)
             {width = 121 - x + 1;}
     
              if(top > 31)
             {top = 31;}
     
              if((top + height) > 31+1)
            { height = 31 - top + 1;}
     
              lcd_glyph(x,top,width,height,glyph_ptr,store_width); 

              x += width;       
              str++;           
              if (inprogmem)
             {glyph = pgm_read_byte((unsigned int)str);}                 
              else
             {
             glyph = (unsigned int)*str;}     
        }
}



Код: Выделить всё

#define PROGMEM                 __flash
#define PSTR(x)                 x
#define pgm_read_byte(x)       (*((uint8_t __flash *)(x)))
#define pgm_read_word(x)       (*((uint16_t __flash *)(x)))



Код: Выделить всё
static PROGMEM unsigned char five_dot_glyph_table [] =
{
/* '0' charwidth: 5 */
   0x11,    /*  [     ]  */
   0x60,    /*  [ **  ]  */
   0x90,    /*  [*  * ]  */
   0x90,    /*  [*  * ]  */
   0x90,    /*  [*  * ]  */
   0x60,    /*  [ **  ]  */
   0x00,    /*  [     ]  */

   
   /* '1' charwidth: 3 */
   0x22,    /*  [   ]  */
   0x40,    /*  [ * ]  */
   0xC0,    /*  [** ]  */
   0x40,    /*  [ * ]  */
   0x40,    /*  [ * ]  */
   0x40,    /*  [ * ]  */
   0x00    /*  [   ]  */
};
#endif 
     
static PROGMEM unsigned char five_dot_width_table []= 
{
5, /* '0' */
3 /* '1' */
};



Код: Выделить всё
struct FONT_DEF
{
  const unsigned char store_width;                  /* glyph storage width in bytes */
  const unsigned char glyph_height;            /* glyph height for storage */
  const unsigned char PROGMEM *glyph_table;         /* font table start address in memory */
  const unsigned char fixed_width;                  /* fixed width of glyphs. If zero */
                                               /* then use the width table. */
  const unsigned char PROGMEM *width_table;           /* variable width table start adress */
  const unsigned char glyph_beg;             /* start ascii offset in table */
  const  unsigned char glyph_end;             /* end ascii offset in table */
  const unsigned char glyph_def;             /* code for undefined glyph code */
}fonts [FONT_COUNT]=
{
  #ifdef EN_FIVE_DOT
   {
   1,  7, five_dot_glyph_table, 0, five_dot_width_table,' ','~','.'
   },
  #endif
    #ifdef EN_SIX_DOT
   {2,  8, six_dot_glyph_table, 0, six_dot_width_table,' ','~','.'}
#endif
};




Код: Выделить всё
void lcd_glyph(unsigned int left, unsigned int top, unsigned int width, unsigned int height,unsigned int *glyph_ptr, unsigned int store_width)
{
       unsigned int bit_pos;
       unsigned int byte_offset;
       unsigned int y_bits;
       unsigned int remaining_bits;
       unsigned int mask;
       unsigned int char_mask;
       unsigned int x;
       unsigned int *glyph_scan;
       unsigned int glyph_offset;

       bit_pos = top & 0x07;       
       glyph_offset = 0;           
       char_mask = 0x80;           

       for (x = left; x < (left + width); x++)
        {
            byte_offset = top >> 3;           
              y_bits = height;       
              remaining_bits = 8 - bit_pos;   
              mask = l_mask_array[bit_pos];   
              glyph_scan = glyph_ptr + glyph_offset;                                   
              while((y_bits) && (byte_offset < 4)) 
                   {                       
                     
                     if(pgm_read_byte((unsigned int)glyph_scan) & char_mask)
                    {
                    l_display_array[byte_offset][x] |= mask;   
                    }
                     else
                    {
                    l_display_array[byte_offset][x] &= ~mask;   
                     }
                     if(l_mask_array[0] & 0x80)
                    {
                    mask >>= 1;
                    }
                     else
                    {mask <<= 1;}
           
                     y_bits--;
                     remaining_bits--;
                     if(remaining_bits == 0)
                          {                             
                            remaining_bits = 8;
                            byte_offset++;
                            mask = l_mask_array[0];
                          }                     
                     glyph_scan += store_width;
                   }         
              char_mask >>= 1;
              if(char_mask == 0)               
                   {
                       char_mask = 0x80;
                     glyph_offset++;
                   }
        } 
}

вот вроде все данные,надеюсь что ничего не забыл.Выводит на экран какую то ерунду.Исполузую codevision 1.24.8d professional
grek
 
Сообщения: 159
Зарегистрирован: 16 сен 2009, 15:41
Откуда: Арзамас

Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 40