¿Está buscando un programa sencillo para controlar el LCD 12864ZB mediante un microcontrolador?
#include
#include
# incluir
#include
#include
#include delay100us(); } uchar RdData() { // uchar ocupado; uchar DData; RS = 0; RW = 1; /* hacer { p> LCDBUS=0xff; E=1; ocupado=LCDBUS&0x80; E=0; } mientras (ocupado==0x80);*/ RS=1; LCDBUS=0xff; E =1; DData = LCDBUS; E = 0; retorno(DData); } / ----- Función de escritura en español---------------- void PrintASCII(uint x,y,uchar *pstr) //función genérica p> { uint addr; y=y<<4; addr=y|0x8x; SdCmd(addr); while(*pstr>0) { SdData(*pstr++); } } /----Función de escritura china----------------- void PrintGB (uchar x,y, uchar *pstr) { uint addr; y=y<<4; addr =y|0x8x; SdCmd(addr); while(*pstr>0) { SdData ( *pstr++); delayms(300); //demostración } } //---- Inicialización función ------------------ void initLCM() { RST=0; delayms(5); RST=1; delayms(800); SdCmd(0x30); modo (bus de 8 bits) */ SdCmd(0x06); /* Establecer modo de entrada*/ SdCmd(0x0f); > SdCmd(0x01); /* Borrar pantalla*/ delayms(2); } /---- Función borrar pantalla --- ------- -------- void ClearRAM()< { uchar i,j; // SdCmd (0x01); // delayms(2); SdCmd(0x34); for(i=0;i<32;i++) { SdCmd (i|0x80); SdCmd(0x80); for(j=0;j<16; j++) { SdData(0x00); // SdData(0x00); } } SdCmd(0x30); } /---- Función de dibujo-------------- --------------- void ShowBmp(uchar x,y, ancho,alto,uchar *bmp) { uchar i,j; SdCmd(0x34); SdCmd(0x36); for(i=y;i<(y+ alto );i++) { si (i<32) { SdCmd( 0x80|i); SdCmd(0x80|x); } más { SdCmd(0x80|(i - 32)); SdCmd(0x80|(x+8)); } for(j=0.j { SdData(*bmp++); SdData(*bmp++); // } } } SdCmd(0x30); } // ---- Función de punto de dibujo---- - . ------------- void Draw_Dot(uint x,y) { uchar m,n;< / p> uint k; if(y>=32) { y=y-32; x=x +128; } SdCmd(y|0x80); k=x/16; SdCmd ( k|0x80); k=0x8000; k=k>>x%16; m=RdData() m=RdData()|k>>8; n=RdData()|k; k=x/16; SdCmd ( y|0x80); SdCmd(k|0x80); SdData(m); SdData(n); } /--- Función Draw_Line--------------- void Draw_Line(uint x1,y1,x2,y2) p> { uint temp; int dalt_x, dalt_y,err=0; if (y1>y2) { temp=x1; x1=x2; x2=temp; temp=y1; y1=y2; y2=temp; } Draw_Dot(x1,y1); dalt_x =x2-x1; dalt_y=y2-y1; if(dalt_x>=0) { if( dalt_y >dalt_x)//k.gt;1 { while(y1 { if(err < 0) { x1=x1+1; y1=y1+1; err=err+dalt_y- dalt_x ; } else { y1=y1+1; err=err- dalt_x ; } Draw_Dot(x1,y1); } } más // 0 <=k= <1 { si (dalt_y==0) y1=y1-1; mientras ( x1 { si(err<0) { x1=x1+1; err =err+dalt_y; } else { y1=y1+1; x1=x1+1; err=err+dalt_y-dalt_x; } Draw_Dot(x1,y1); } } } más { dalt_x= x1 -x2; if(dalt_y>dalt_x)//k<-1 { mientras(y1 { si(err<0) { x1=x1-1; y1=y1+1; err=err+dalt_y-dalt_x; } else { y1= y1+1; err=err-dalt_x; } Draw_Dot(x1,y1); } else //0>k>=-1 { if (dalt_y==0) y1=y1-1; while(x1>x2) { if(err<0) { x1=x1-1; err=err+dalt_y; } más { x1=x1-1; y1=y1+1; err= err+dalt_y-dalt_x; } Draw_Dot(x1,y1); } } } } } } // ----- Función de fuente de creación propia----- - ------------- void Set_CGRAM(uint num,uchar *pstr) // num es el número de caracteres chinos pstr: el nombre de la matriz de caracteres chinos { uchar i; SdCmd(0x40 for(i=0; i { SdData(*pstr++); } } / --Función de demostración de función--------------- ---------- void quxian1( ) { SdCmd(0x06); PrintGB( 0,0, "La pantalla no mueve la dirección del cursor más 1 código de instrucción es 06"); demorams(3000 ); SdCmd (0x01); demorams(2); SdCmd(0x04); p> PrintGB( 15,0 , "La pantalla no mueve la dirección del cursor menos 1 código de instrucción 04"); delayms(3000); SdCmd(0x01); /p> SdCmd(0x01) ; delayms(2); SdCmd(0x07); PrintGB(0,0, "El general izquierdo 1- El código de comando de dígitos de la pantalla es 07"); delayms(3000); SdCmd(0x01); delayms(2); SdCmd(0x01); delayms(2); delayms(2); SdCmd(0x05); > PrintGB( 15,0, "El código de comando para desplazar toda la pantalla 1 bit hacia la derecha es 05"); delayms(3000); SdCmd(0x06) ; } //---- Hacer una función de demostración gráfica------- ---------------- ------- ------- void quxian2() { código uint data1[48]={88, 89,85,87,89 ,90,89,89,89, 88,86,87,86,88,.89,90,94, 95,96 ,96,97,99, 99,101,103, 101,101,100,103,105,113,113, 117,117,116,114,107,110,114, 113,112,115 113,112,113,11 9.120, 125.124.128}; uint a1, b1,a2,b2,i; SdCmd(0x01); delayms(2); SdCmd(0x0c) ; PrintASCII(0,0, "Hora"); PrintASCII(14,1, "Temp"); /p> SdCmd (0x36); Draw_Line(1, 60, 125,60);//Establece las coordenadas Coordenada X Draw_Line(1, 15, 1 , 60);//Establece las coordenadas Coordenada Y delayms(1000); a1=1; for ( i=0;i<40 ;i++) { b1=data1[i]-70; Draw_Dot(a1,b1);//dibujar punto a1=a1+3; } demorams(3000); a1=1; for ( i= 0;i<40;i++) { b1=datos1[i]-70; b2=datos1[i+1] -70; a2=a1+3; Draw_Line(a1,b1,a2,b2);//dibujar línea a1=a2; } p> SdCmd(0x32); } //-------------- --------- ------------ // Programa principal /---------- -------- ---------------- void main() { SP=0x60; EA=0; // PSB=0; // Selección de interfaz serie PSB=1; /p> LCDBUS= 0xff; // Interfaz de inicialización RW= 1; E = 0; initLCM(); Set_CGRAM(3, CCTAB); while(1) { SdCmd(0x01); Cortina*/ delayms(2); ClearRAM(); /-- Visualización de caracteres personalizados SdCmd(0x0f ) ; SdCmd(0x82); SdData(0x00); SdData(0x00); SdData(0x00); /p> SdData(0x00); SdData(0x00); SdData(0x00); SdData(0x00); SdData(0x00); SdData(0x02); SdData(0x00); SdData(0x04); //-- Visualización de líneas de caracteres PrintASCII(8,0," Programa de demostración ST7920"); delayms(3000) ) / /-- Visualización gráfica SdCmd(0x01); /* ClearRAM */ delayms(2); ClearRAM(); ShowBmp(0,0,8,32,symbo); ShowBmp(0,32,8, "Programa de demostración ST7920"); ShowBmp(0,32 , 8, 32,symbo); delayms(3000); //-- Función de escritura show SdCmd(0x01); delayms(2); quxian1(); delayms(3000); //-- Dibujar gráficos ClearRAM(); quxian2(); // Solo interfaz paralela delayms(3000); } }< / p> //Fin del programa