JJ máte pravdu, je lepší se rovnou učit programovat tak, aby se kod dal používat co neuniverzálněji, navíc přístup do předem daného pole je zřejmě rychlejší než pokaždé přepisovat proměnné...
Takže zpátky k původnímu, všechny uvedené úpravy co jste poradil se povedly, přidal jsem všechny základní znaky od mezery(32) po malé z
Výsledek sem dávám pro případ, že by si chtěl někdo displej pořídit a něco zkusit naprogramovat jako já.
Kód: Vybrat vše
#include <spi.h>
#include <string.h>
#include <stdlib.h>
#include <htc.h>
#include <p18f14k22.h>
#define _XTAL_FREQ 64000000 //Used by the compiler for the delay_ms(x) macro
// PIC Configuration bits
#define SDI PORTCbits.RC7
#define SCK PORTBbits.RB6
#define CS PORTBbits.RB7
#define DC PORTBbits.RB5
#define RST PORTCbits.RC6
//config bits that are part-specific for the PIC18F14K22
__CONFIG(1, FOSC_IRC & PLLEN_OFF & FCMEN_OFF);
__CONFIG(2, PWRTEN_OFF & BOREN_OFF & WDTEN_OFF);
__CONFIG(3, HFOFST_OFF & MCLRE_OFF);
__CONFIG(4, STVREN_ON & LVP_OFF & DEBUG_OFF);
__CONFIG(5, CP0_OFF & CP1_OFF & CPB_OFF & CPD_OFF);
__CONFIG(6, WRT0_OFF & WRT1_OFF & WRTC_OFF & WRTB_OFF & WRTD_OFF);
__CONFIG(7, EBTR0_OFF & EBTR1_OFF & EBTRB_OFF);
const unsigned char asci[91][5] =
{
{0x00, 0x00, 0x00, 0x00, 0x00}, // Code for char
{0x00, 0x00, 0x5F, 0x00, 0x00}, // Code for char !
{0x00, 0x03, 0x00, 0x03, 0x00}, // Code for char "
{0x14, 0x7F, 0x14, 0x7F, 0x14}, // Code for char #
{0x24, 0x2A, 0x7F, 0x2A, 0x12}, // Code for char $
{0x23, 0x13, 0x08, 0x64, 0x62}, // Code for char %
{0x36, 0x49, 0x55, 0x22, 0x50}, // Code for char &
{0x00, 0x05, 0x03, 0x00, 0x00}, // Code for char '
{0x00, 0x1C, 0x22, 0x41, 0x00}, // Code for char (
{0x00, 0x41, 0x22, 0x1C, 0x00}, // Code for char }
{0x14, 0x08, 0x3E, 0x08, 0x14}, // Code for char *
{0x08, 0x08, 0x3E, 0x08, 0x08}, // Code for char +
{0x00, 0xA0, 0x60, 0x00, 0x00}, // Code for char ,
{0x08, 0x08, 0x08, 0x08, 0x08}, // Code for char -
{0x00, 0x60, 0x60, 0x00, 0x00}, // Code for char .
{0x20, 0x10, 0x08, 0x04, 0x02}, // Code for char /
{0x3E, 0x51, 0x49, 0x45, 0x3E}, // Code for char 0
{0x00, 0x42, 0x7F, 0x40, 0x00}, // Code for char 1
{0x42, 0x61, 0x51, 0x49, 0x46}, // Code for char 2
{0x21, 0x41, 0x45, 0x4B, 0x31}, // Code for char 3
{0x18, 0x14, 0x12, 0x7F, 0x10}, // Code for char 4
{0x27, 0x45, 0x45, 0x45, 0x39}, // Code for char 5
{0x3C, 0x4A, 0x49, 0x49, 0x30}, // Code for char 6
{0x01, 0x71, 0x09, 0x05, 0x03}, // Code for char 7
{0x36, 0x49, 0x49, 0x49, 0x36}, // Code for char 8
{0x06, 0x49, 0x49, 0x29, 0x1E}, // Code for char 9
{0x00, 0x36, 0x36, 0x00, 0x00}, // Code for char :
{0x00, 0x56, 0x36, 0x00, 0x00}, // Code for char //
{0x08, 0x14, 0x22, 0x41, 0x00}, // Code for char <
{0x14, 0x14, 0x14, 0x14, 0x14}, // Code for char =
{0x41, 0x22, 0x14, 0x08, 0x00}, // Code for char >
{0x02, 0x01, 0x51, 0x09, 0x06}, // Code for char ?
{0x32, 0x49, 0x79, 0x41, 0x3E}, // Code for char @
{0x7E, 0x09, 0x09, 0x09, 0x7E}, // Code for char A
{0x7F, 0x49, 0x49, 0x49, 0x36}, // Code for char B
{0x3E, 0x41, 0x41, 0x41, 0x22}, // Code for char C
{0x7F, 0x41, 0x41, 0x41, 0x3E}, // Code for char D
{0x7F, 0x49, 0x49, 0x41, 0x41}, // Code for char E
{0x7F, 0x09, 0x09, 0x01, 0x01}, // Code for char F
{0x3E, 0x41, 0x49, 0x49, 0x3A}, // Code for char G
{0x7F, 0x08, 0x08, 0x08, 0x7F}, // Code for char H
{0x00, 0x00, 0x7F, 0x00, 0x00}, // Code for char I
{0x31, 0x41, 0x41, 0x41, 0x3F}, // Code for char J
{0x7F, 0x08, 0x14, 0x22, 0x41}, // Code for char K
{0x7F, 0x40, 0x40, 0x40, 0x40}, // Code for char L
{0x7F, 0x02, 0x04, 0x02, 0x7F}, // Code for char M
{0x7F, 0x04, 0x08, 0x10, 0x7F}, // Code for char N
{0x3E, 0x41, 0x41, 0x41, 0x3E}, // Code for char O
{0x7F, 0x09, 0x09, 0x09, 0x06}, // Code for char P
{0x3E, 0x41, 0x51, 0x21, 0x5E}, // Code for char Q
{0x7F, 0x09, 0x19, 0x29, 0x46}, // Code for char R
{0x26, 0x49, 0x49, 0x49, 0x32}, // Code for char S
{0x01, 0x01, 0x7F, 0x01, 0x01}, // Code for char T
{0x3F, 0x40, 0x40, 0x40, 0x3F}, // Code for char U
{0x1F, 0x20, 0x40, 0x20, 0x1F}, // Code for char V
{0x3F, 0x40, 0x30, 0x40, 0x3F}, // Code for char W
{0x63, 0x14, 0x08, 0x14, 0x63}, // Code for char X
{0x03, 0x04, 0x78, 0x04, 0x03}, // Code for char Y
{0x61, 0x51, 0x49, 0x45, 0x43}, // Code for char Z
{0x00, 0x7F, 0x41, 0x41, 0x00}, // Code for char [
{0x02, 0x04, 0x08, 0x10, 0x20}, // Code for char BackSlash
{0x00, 0x41, 0x41, 0x7F, 0x00}, // Code for char ]
{0x00, 0x02, 0x01, 0x02, 0x00}, // Code for char ^
{0x00, 0x40, 0x40, 0x40, 0x00}, // Code for char _
{0x00, 0x03, 0x03, 0x00, 0x00}, // Code for char `
{0x20, 0x54, 0x54, 0x54, 0x78}, // Code for char a
{0x7F, 0x48, 0x44, 0x44, 0x38}, // Code for char b
{0x38, 0x44, 0x44, 0x44, 0x20}, // Code for char c
{0x38, 0x44, 0x44, 0x48, 0x7F}, // Code for char d
{0x38, 0x54, 0x54, 0x54, 0x18}, // Code for char e
{0x08, 0x7E, 0x09, 0x01, 0x02}, // Code for char f
{0x08, 0x54, 0x54, 0x54, 0x3C}, // Code for char g
{0x7F, 0x08, 0x04, 0x04, 0x78}, // Code for char h
{0x00, 0x44, 0x7D, 0x40, 0x00}, // Code for char i
{0x20, 0x40, 0x44, 0x3D, 0x00}, // Code for char j
{0x7F, 0x10, 0x28, 0x44, 0x00}, // Code for char k
{0x00, 0x41, 0x7F, 0x40, 0x00}, // Code for char l
{0x7C, 0x04, 0x78, 0x04, 0x78}, // Code for char m
{0x7C, 0x08, 0x04, 0x04, 0x78}, // Code for char n
{0x38, 0x44, 0x44, 0x44, 0x38}, // Code for char o
{0x7C, 0x14, 0x14, 0x14, 0x08}, // Code for char p
{0x08, 0x14, 0x14, 0x14, 0x7C}, // Code for char q
{0x7C, 0x08, 0x04, 0x04, 0x08}, // Code for char r
{0x48, 0x54, 0x54, 0x54, 0x20}, // Code for char s
{0x02, 0x3F, 0x42, 0x40, 0x20}, // Code for char t
{0x3C, 0x40, 0x40, 0x20, 0x7C}, // Code for char u
{0x1C, 0x20, 0x40, 0x20, 0x1C}, // Code for char v
{0x3C, 0x40, 0x30, 0x40, 0x3C}, // Code for char w
{0x44, 0x28, 0x10, 0x28, 0x44}, // Code for char x
{0x0C, 0x50, 0x50, 0x50, 0x3C}, // Code for char y
{0x44, 0x64, 0x54, 0x4C, 0x44} // Code for char z
};
void wait(int w){
for (int d2=0;d2<w;d2++)
for (int d=0;d<100;d++)
__delay_ms(10);
}
void pause(int p){
for (int d=0;d<p;d++)
__delay_ms(1);
}
// DISPON
void dispon(){
DC = 0;
CS = 0;
putcSPI(0b00101001);
CS = 1;
}
// DISPOFF
void dispoff(){
DC = 0;
CS = 0;
putcSPI(0b00101000);
CS = 1;
}
// 12ti BITOVÉ BAREVNÉ ROZLI?ENÍ
void colmod12(){
DC = 0;
CS = 0;
putcSPI(0b00111010);
DC = 1;
putcSPI(0b00000011);
CS = 1;
}
// 16ti BITOVÉ BAREVNÉ ROZLI?ENÍ
void colmod16(){
DC = 0;
CS = 0;
putcSPI(0b00111010);
DC = 1;
putcSPI(0b01010101);
CS = 1;
}
// NORMAL
void normal(){
DC = 0;
CS = 0;
putcSPI(0b00010011);
CS = 1;
}
// INVERT ON
void invon(){
DC = 0;
CS = 0;
putcSPI(0b00100001);
CS = 1;
}
// INVERT OFF
void invoff(){
DC = 0;
CS = 0;
putcSPI(0b00100000);
CS = 1;
}
// DATA TO LCD
void data(){
DC = 0;
CS = 0;
putcSPI(0b00101100);
DC = 1;
}
// SCROLLING
void scrl(unsigned short int X){
DC = 0;
CS = 0;
putcSPI(X);
CS = 1;
}
void frame(int x1, int x2, char y1, char y2){
// X adresses
DC = 0;
CS = 0;
putcSPI(0x2B);
DC = 1;
char x1a;
if (x1>255){
x1a = 255;
x1 = (char)x1 - 256;
}
else x1a = 0;
putcSPI(x1a);
putcSPI(x1);
char x2a;
if (x2>255){
x2a = 255;
x2 = (char)x2 - 256;
}
else x2a = 0;
putcSPI(x2a);
putcSPI(x2);
CS = 1;
// Y adresses
DC = 0;
CS = 0;
putcSPI(0x2A);
DC = 1;
putcSPI(0x00);
putcSPI(y1);
putcSPI(0x00);
putcSPI(y2);
CS = 1;
}
void box (int x1, int x2, char y1, char y2,char color){
colmod12();
++x2;
++y2;
long i2 = ((((long)x2-(long)x1) * ((long)y2-(long)y1))/2)+1;
--x2;
--y2;
frame(x1,x2,y1,y2);
char col1,col2,col3;
switch (color) {
case 0: col1 = 0b00000000; col2 = 0b00000000; col3 = 0b00000000; break; //?erná
case 1: col1 = 0b11111111; col2 = 0b11111111; col3 = 0b11111111; break; //bílá
case 2: col1 = 0b00000000; col2 = 0b11110000; col3 = 0b00001111; break; //?ervená
case 3: col1 = 0b00001111; col2 = 0b00000000; col3 = 0b11110000; break; //zelená
case 4: col1 = 0b11110000; col2 = 0b00001111; col3 = 0b00000000; break; //modrá
case 5: col1 = 0b00001111; col2 = 0b11110000; col3 = 0b11111111; break; //?lutá
case 6: col1 = 0b11111111; col2 = 0b00001111; col3 = 0b11110000; break; //azurová
case 7: col1 = 0b11110000; col2 = 0b11111111; col3 = 0b00001111; break; //purpurová
case 8: col1 = 0b00000011; col2 = 0b01110000; col3 = 0b00110111; break; //hn?dá
}
data();
while (i2){
putcSPI(col1); // POSLI BYT PREZ SPI
putcSPI(col2);
putcSPI(col3);
i2 = i2 -1;
}
}
//void writetxt (char text[],char size, unsigned int x1,unsigned int y1){
void writetxt(char* text, size_t size, unsigned int x1,unsigned int y1){
colmod16();
switch (size){
case 1: frame(x1,319,y1,y1+7); break;
case 2: frame(x1,319,y1,y1+15); break;
case 3: frame(x1,319,y1,y1+23); break;
case 4: frame(x1,319,y1,y1+31); break;
case 10:frame(x1,319,y1,y1+79); break;
}
data();
unsigned char bajt[5];
unsigned char bit0, bit1, bit2, bit3, bit4, bit5, bit6, bit7;
// TUNING OD MTAJOVSKEHO
for (long i2=0;i2 < strlen(text);++i2){
int radek = text[i2] - 32;
for(int sloupec = 0; sloupec < 5; ++sloupec) //místo 5 .. sizeof(bajt)/sizeof(unsigned char)
{
bajt[sloupec] = asci[radek][sloupec];
}
for (long i=0;i < 5;i++){
bit0 = (bajt[i] & 0b00000001)*255;
bit1 = ((bajt[i] & 0b00000010)>>1)*255;
bit2 = ((bajt[i] & 0b00000100)>>2)*255;
bit3 = ((bajt[i] & 0b00001000)>>3)*255;
bit4 = ((bajt[i] & 0b00010000)>>4)*255;
bit5 = ((bajt[i] & 0b00100000)>>5)*255;
bit6 = ((bajt[i] & 0b01000000)>>6)*255;
bit7 = ((bajt[i] & 0b10000000)>>7)*255;
switch (size){
case 1:
putcSPI(bit0);putcSPI(bit0);putcSPI(bit1);putcSPI(bit1);putcSPI(bit2);putcSPI(bit2);putcSPI(bit3);putcSPI(bit3);
putcSPI(bit4);putcSPI(bit4);putcSPI(bit5);putcSPI(bit5);putcSPI(bit6);putcSPI(bit6);putcSPI(bit7);putcSPI(bit7);
break;
case 2:
for (char iii=0;iii<2;iii++){
for (char ii=0;ii < 4;ii++){putcSPI(bit0);}
for (char ii=0;ii < 4;ii++){putcSPI(bit1);}
for (char ii=0;ii < 4;ii++){putcSPI(bit2);}
for (char ii=0;ii < 4;ii++){putcSPI(bit3);}
for (char ii=0;ii < 4;ii++){putcSPI(bit4);}
for (char ii=0;ii < 4;ii++){putcSPI(bit5);}
for (char ii=0;ii < 4;ii++){putcSPI(bit6);}
for (char ii=0;ii < 4;ii++){putcSPI(bit7);}
}
break;
case 3:
for (char iii=0;iii<3;iii++){
for (char ii=0;ii < 6;ii++){putcSPI(bit0);}
for (char ii=0;ii < 6;ii++){putcSPI(bit1);}
for (char ii=0;ii < 6;ii++){putcSPI(bit2);}
for (char ii=0;ii < 6;ii++){putcSPI(bit3);}
for (char ii=0;ii < 6;ii++){putcSPI(bit4);}
for (char ii=0;ii < 6;ii++){putcSPI(bit5);}
for (char ii=0;ii < 6;ii++){putcSPI(bit6);}
for (char ii=0;ii < 6;ii++){putcSPI(bit7);}
}
break;
case 4:
for (char iii=0;iii<4;iii++){
for (char ii=0;ii < 8;ii++){putcSPI(bit0);}
for (char ii=0;ii < 8;ii++){putcSPI(bit1);}
for (char ii=0;ii < 8;ii++){putcSPI(bit2);}
for (char ii=0;ii < 8;ii++){putcSPI(bit3);}
for (char ii=0;ii < 8;ii++){putcSPI(bit4);}
for (char ii=0;ii < 8;ii++){putcSPI(bit5);}
for (char ii=0;ii < 8;ii++){putcSPI(bit6);}
for (char ii=0;ii < 8;ii++){putcSPI(bit7);}
}
break;
case 10:
for (char iii=0;iii<8;iii++){
for (char ii=0;ii < 20;ii++){putcSPI(bit0);}
for (char ii=0;ii < 20;ii++){putcSPI(bit1);}
for (char ii=0;ii < 20;ii++){putcSPI(bit2);}
for (char ii=0;ii < 20;ii++){putcSPI(bit3);}
for (char ii=0;ii < 20;ii++){putcSPI(bit4);}
for (char ii=0;ii < 20;ii++){putcSPI(bit5);}
for (char ii=0;ii < 20;ii++){putcSPI(bit6);}
for (char ii=0;ii < 20;ii++){putcSPI(bit7);}
}
break;
}
}
for (int i4=0; i4 < size; i4++){
for (int i3=0; i3 < 16*size; i3++){
putcSPI(0);
}
}
}
CS = 1;
}
void writenum (unsigned int cislo,unsigned int size, unsigned int x1, unsigned int y1){
char buf[10];
utoa(buf, cislo, 10);
writetxt(buf,size,x1,y1);
}
// *** MAIN ***
void main(void) {
// NASTAVENI FREKVENCE OSCILATORU
OSCCON = 112 ; //16MHZ clock speed based on internal oscillator block
OSCCON2 = 0 ;
OSCTUNE = 64 ; //PLLx4 coz je 16x4=64
wait(1);
OpenSPI(SPI_FOSC_16, MODE_00, SMPEND); // NASTAVENI SPI
TRISC = 0;
TRISCbits.TRISC7 = 0; //using pin as output
TRISBbits.TRISB6 = 0; //using pin as output
TRISBbits.TRISB7 = 0; //using pin as output
TRISBbits.TRISB5 = 0; //using pin as output
TRISCbits.TRISC6 = 0; //using pin as output
TRISAbits.TRISA4 = 1; //potenciometr
ANSELbits.ANS3 = 1; //analog input - different than pic16 syntax
ADCON0 = 0b00001101; //select RA4 as source of ADC, which is AN3, and enable the module
ADCON2 = 0b00111110; // fosc/64
// INICIALIZACE LCD
CS = 1;
RST = 1;
__delay_ms(10);
DC = 0;
CS = 0;
putcSPI(0b00010001);
CS = 1;
pause(120);
dispon();
box (0,319,0,239,0);
writetxt(" ** 2,2\" LCD ILI9341 :) **",2,0,0);
wait(2);
writetxt("!\"#$%&´()*+,-./0123456789",1,0,30);
writetxt(":;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ",1,0,38);
writetxt("[\\]^_'abcdefghijklmnopqrstuvwxyz",1,0,46);
writetxt("!\"#$%&´()*+,-./",2,0,60);
writetxt("0123456789:;<=>?@",2,0,76);
writetxt("ABCDEFGHIJKLMNOPQRSTUVWXYZ",2,0,92);
writetxt("[\\]^_'",2,0,108);
writetxt("abcdefghijklmnopqrstuvwxyz",2,0,124);
wait(5);
box (0,319,0,239,0);
box (10,310,10,230,1);
box (20,300,20,220,2);
box (30,290,30,210,3);
box (40,280,40,200,4);
box (50,270,50,190,5);
box (60,260,60,180,6);
box (70,250,70,170,7);
box (80,240,80,160,0);
writetxt("Size1",1,150,120);
wait(2);
box (80,240,80,160,0);
writetxt("Size2",2,140,110);
wait(2);
box (80,240,80,160,0);
writetxt("Size3",3,120,100);
wait(2);
box (80,240,80,160,0);
writetxt("Size4",4,110,90);
wait(2);
box (0,320,70,170,0);
writetxt("Size10",10,10,85);
wait(2);
invon();
wait(1);
invoff();
wait(1);
invon();
box (0,320,70,170,0);
while (1){
__delay_us(5);
GO = 1;
while (GO) continue;
writenum (ADRESH,10,100,85);
}
}