//本程序實現了一個字符串向左移動,向右移動,向下稱動,向上移動,在同一個位置顯示一個ASCII字符 //將各個函數改寫使之通用化 #include "U8glib.h" U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) char str1[]="HW SPI Com: CS = 10, A0 = 9 "; char str2[]="HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)"; void moveStrToRight(char *str,int x,int y) //這個函數未實現字符串從左向右移動,而是出現了字符串疊加的現象。 //原來是字符串太長了 { for (int i=0;i<=12;i++) { u8g.firstPage(); do { u8g.drawStr(i*10+x,y,(char *)str); } while( u8g.nextPage() ); delay(100); } } void moveStr2ToRight(char *str1,char *str2,int x1,int y1,int x2,int y2) //這個函數未實現字符串從左向右移動,而是出現了字符串疊加的現象。 //原來是字符串太長了 { for (int i=0;i<=12;i++) { u8g.firstPage(); do { u8g.drawStr(i*10+x1,y1,(char *)str1); u8g.drawStr(i*10+x2,y2,(char *)str2); } while( u8g.nextPage() ); delay(100); } } void moveStrToLeft(char *str,int x, int y) //這個函數未實現字符串從右向左移動,而是出現了字符串疊加的現象。 //原來是字符串太長了 { for (int i=0;i<=12;i++) { u8g.firstPage(); do { u8g.drawStr(x-i*10,y,(char *)str1); } while( u8g.nextPage() ); delay(100); } } void moveStrToDown(char *str,int x ,int y)// 這個過程是字符串豎直排,從上向下移動位置 { //注這個字符串共有20個字符,20*8=160(字體像素以6*8計算) //顯示的位置是從Y軸-160開始,然后每次向下增進10個像素值,從上向下完全的完整顯示字符串 for (int i=0;i<=10;i++) { u8g.firstPage(); do { u8g.drawStr90(x,i*16-y,(char *)str); } while( u8g.nextPage() ); delay(100); } } void moveStrToUp(char *str,int x,int y)// 這個過程是字符串豎直排,從下向上移動位置 { //str1[] 注這個字符串共有20個字符,20*8=160(字體像素以6*8計算) //顯示的位置是從Y軸-160開始,然后每次向上增進10個像素值,從下向上完全的完整顯示字符串 //為了能顯示最后一個字符,Y軸的值至少為-20*8=-160 for (int i=0;i<=17;i++) { u8g.firstPage(); do { u8g.drawStr90(x,y-i*10,(char *)str1); } while( u8g.nextPage() ); delay(100); } } void u8g_prepare(void) { u8g.setFont(u8g_font_6x10); u8g.setFontRefHeightExtendedText(); u8g.setDefaultForegroundColor(); u8g.setFontPosTop(); } uint8_t draw_state = 0; void mydraw(void) { u8g_prepare(); switch(draw_state >> 3) { case 0: moveStrToLeft(str1,120,10); //x=20(個字符數)*6(字符寬),y=10差不多在第一行 break; case 1: moveStrToRight(str1,0,10) ; //x=0,y=10 ,y=10差不多在第一行 break; case 2: moveStrToUp(str1,10,60); //x=10,y=60 x在超過一個字符位置,Y在差不多第六行 break; case 3: moveStrToDown(str1,10,120); //x=10,由于str1字符長度20個,字符串長度是=20*8=160,y就等于120 break; case 4: displayAchar(); //在依次顯示不同的ASCII字符 break; case 5: u8g_ascii_1(30,50); //在指定的坐標,顯示不同的ASCII字符 break; } } void u8g_ascii_1(int i,int j) //顯示ascii在屏幕上 { char s[2] = " "; uint8_t x, y; for( y = 0; y < 6; y++ ) { for( x = 0; x < 16; x++ ) { s[0] = y*16 + x + 32; do { u8g.drawStr( 0, 0, "ASCII page 1"); u8g.drawStr(i, j, s); //如果需要依次在不同的位置顯示,如下行 // u8g.drawStr(x*7+i, y*10+j, s); delay(50); } while( u8g.nextPage() ); } } } void setup() { if ( u8g.getMode() == U8G_MODE_R3G3B2 ) u8g.setColorIndex(255); // white else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) u8g.setColorIndex(3); // max intensity else if ( u8g.getMode() == U8G_MODE_BW ) u8g.setColorIndex(1); // pixel on // u8g.setFont(u8g_font_unifont); Serial.begin(9600); u8g_prepare();//初始化字體,屏幕參數 } void loop() { //moveStr2ToRight(str1,str2,0,0,0,10); mydraw(); draw_state++; if ( draw_state >= 7*8 ) draw_state = 0; // rebuild the picture after some delay delay(100); } void displayAchar()//這個過程,依次在不同的坐標,顯示不同ASCII的字符 { char s[2] = " "; uint8_t x, y; for( y = 0; y < 6; y++ ) { for( x = 0; x < 16; x++ ) { s[0] = y*16 + x + 32; u8g.firstPage(); do { u8g.drawStr( 0, 0, "ASCII page 1"); // u8g.drawStr(31, 40, s); //如果需要依次在不同的位置顯示,如下行 u8g.drawStr(x*7, y*10, s); delay(50); } while( u8g.nextPage() ); } } } |