a version with fonts of user defined size
this has a 14x10 font for two char 0,1 ie 2 rows 10 columns
fonts now have a header added to define rows/columns first chr and last chr
eg
Code:#asm psect FONT_table,class=CODE,local,delta=2 GLOBAL _FNT _FNT DW 0X0501, 0X207F //1 ROW 5 COL CHR 32-127 DW 0x0000, 0x0000, 0x0000, 0x005F, 0x0000 // 32 ' ' '!' DW 0x0007, 0x0007, 0x0014, 0x3F94, 0x3F94 // 34 '"' '#' DW 0x122A, 0x3FAA, 0x0923, 0x0988, 0x3262 // 36 '$' '%' ...............................
Code:/** Product Revision : PIC10 / PIC12 / PIC16 / PIC18 MCUs - 1.65.2 Device : PIC16F1847 Driver Version : 2.00 * font.c included via ide source files */ #include "mcc_generated_files/mcc.h" void putwreg(char work); void putcmd(char x); void WrChar(char ); void WrStr(const char *); void set_fnt(const char *); extern const char FNT,NUM; uint16_t fnt_addr; char fnt_row,fnt_col,fnt_fc,fnt_lc,POSX,POSY; void main(void) { // initialize the device SYSTEM_Initialize(); set_fnt(&FNT); /* * * initialize Nokia 5110 LCD display * * */ __delay_ms(30); // LCD_RST_SetLow(); // 5110 'reset' pulse __delay_ms(1); LCD_RST_SetHigh(); // 5110 'reset' pulse __delay_ms(1); putcmd(0x20 + 0x01); // function set: extended instructions putcmd(0xc8); // set Vop (contrast), 0..127 putcmd(0x04 + 0x02); // set temperature coefficient, 0..3 putcmd(0x10 + 0x03); // Set bias system, 0..7 putcmd(0x20 + 0x00); // function set: standard instructions putcmd(0x08 + 0x04); // display control: normal mode putcmd(0x80 + 0x20); // set DDRAM X address, 0..83 putcmd(0x40 + 0x02); // set DDRAM Y address, 0..5 POSX=32; POSY=2; WrChar('R'); // write ascii character WrStr("eady"); set_fnt(&NUM); putcmd(0x80 + 0x10); // set DDRAM X address, 0..83 putcmd(0x40 + 0x04); // set DDRAM Y address, 0..5 POSX=16; POSY=5; WrChar('0'); // write ascii character WrChar('1'); // write ascii character while (1) { } } /** End of File */ void set_fnt(const char *F){ uint16_t tmp; fnt_addr=(uint16_t)F&0x1fff; tmp=FLASH_ReadWord(fnt_addr++); fnt_row = (char)tmp; fnt_col = tmp>>8; tmp=FLASH_ReadWord(fnt_addr++); fnt_lc = (char)tmp; fnt_fc = tmp>>8; } void putwreg(char work) // send byte, msb first (15 words) { LCD_CE_LAT = 0; // spi enable on SPI1_Exchange8bit(work); LCD_CE_LAT = 1; // spi enable off } // void WrChar(char d) { // for packed 2.5 word 5x7 font uint16_t tmp, inx = fnt_addr; char fd[32], i = fnt_row, j = 0, k, *pt; if ((d < fnt_fc) || (d > fnt_lc))return; inx += ((d - fnt_fc) * fnt_col*fnt_row) >> 1; while (i--) { k = fnt_col >> 1; if (k == 2)k++; while (k--) { tmp = FLASH_ReadWord(inx++); if (!i) fd[j + 1] = ((char)tmp & 0x7f) ;//<< 1 else fd[j + 1] = ((tmp & 0x7f)<<1)&0xfe; tmp <<= 1; if (!i) fd[j] = (tmp >> 8)& 0x7f; else fd[j] = (tmp >> 7)& 0xfe;; j += 2; } } pt = fd; if ((d & 1)&&(fnt_col == 5))pt++; i = fnt_row; while (i--) { k = fnt_col; putcmd(0x40 +POSY-i); if(!i){ putcmd(0x80 +POSX); } // with font now stored in bufer fd its easy to have large and/or inverted text while (k--) { putwreg(*pt++); } putwreg(0); } POSX+=fnt_col+1; } void putcmd(char x) { LCD_DC_SetLow(); putwreg(x); LCD_DC_SetHigh(); } void WrStr(const char *buff) { { // while (*buff) WrChar(*buff++); // } } #asm psect nums_table,class=CODE,local,delta=2 _NUM DW 0X0A02, 0X3031 //2 ROW 10 COL CHR 0,1 DW 15998, 899 ,8691, 15775 ,16252 // chr 0x30 " 0 " DW 4031, 15486, 14307, 12400, 8095 DW 0, 518, 16383, 0, 0 // chr 0x31 " 1 " DW 64 ,8288 ,16383 ,12352, 8192




Bookmarks