STM32 12864串行驱动
有些12864没有以下全部功能:
DDRAM:(Data Display Ram),数据显示RAM,往里面写啥,屏幕就会显示啥。
CGROM:(Character Generation ROM),字符发生ROM。里面存储了中文汉字的字模,也称作中文字库,编码方式有GB2312(中文简体)和BIG5(中文繁体)。
CGRAM:(Character Generation RAM),字符发生RAM,,12864内部提供了64×2B的CGRAM,可用于用户自定义4个16×16字符,每个字符占用32个字节。
GDRAM:(Graphic Display RAM):图形显示RAM,用于绘图,往里面写啥,屏幕就会显示啥,往GDRAM中写的数据是图形的点阵信息,每个点用1bit来保存其显示与否。
绘图RAM就是给这些点阵置1或置0,可以看到其实它本来是32行×256列的,但是分成了上下两屏显示,每个点对应了屏幕上的一个点。要使用绘图功能需要开启扩展指令。然后写地址,再读写数据。
GDRAM的读写:GDRAM的操作基本单位是一个字,也就是2个字节。
写数据:先开启扩展指令集(0x36),然后送地址,这里的地址与DDRAM中的略有不同,DDRAM中的地址只有一个,那就是字地址。而GDRAM中的地址有2个,分别是字地址(列地址/水平地址X)和位地址(行地址/垂直地址Y),上图中的垂直地址就是00H~31H,水平地址就是00H~15H,写地址时先写垂直地址(行地址)再写水平地址(列地址),也就是连续写入两个地址,然后再连续写入2个字节的数据。如图中所示,左边为高字节右边为低字节。为1的点被描黑,为0的点则显示空白。这里列举个写地址的例子:写GDRAM地址指令是0x80+地址。被加上的地址就是上面列举的X和Y,假设我们要写第一行的2个字节,那么写入地址就是0x00H(写行地址)然后写0x80H(列地址),之后才连续写入2个字节的数据(先高字节后低字节)。再如写屏幕右下角的2个字节,先写行地址0x9F(0x80+32),再写列地址0x8F(0x80+15),然后连续写入2个字节的数据。编程中写地址函数中直接用参数(0x+32),而不必自己相加。
读数据:先开启扩展指令集,然后写行地址、写列地址,假读一次,再连续读2字节的数据(先高字节后低字节)。
由于串行下不好读数据,所以画点程序还没弄好:
1 /*yj12864.h*/ 2 #ifndef _YJ12864_H 3 #define _YJ12864_H 4 #include "sys.h" 5 6 //YJ-G12864-97 7 //1=SDA 2=SCK 3=CS 4=CD(RS) 5=RST 6=VDD 7=VSS 8=K 9=A 8 //For STM32F103 9 10 #define RS PBout(15) 11 #define RST PBout(14) 12 #define CS PBout(13) 13 #define SDA PBout(12) 14 #define SCK PBout(11) 15 16 extern void Lcd_init(void); 17 extern u8 Read_data(void); 18 extern void Write_data(u8 data); 19 extern void Write_command(u8 com); 20 21 extern void Lcd_pos(u8 x,u8 y); 22 extern void Clear_screen(void); 23 extern void Disp_char(u8 x, u8 y, u8 z); 24 extern void Disp_string(u8 x,u8 y,u8 *z); 25 extern void Disp_num(u8 x,u8 y,s16 num); 26 27 extern void Clear_GDRAM(void); 28 extern void Draw_point(u8 x,u8 y,u8 color); 29 30 #endif
1 /*yj12864.c*/ 2 #include "yj12864.h" 3 #include "delay.h" 4 #include "stm32f10x_gpio.h" 5 6 const u8 zimu[][6] = 7 { 8 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // sp ASCII = 32 9 { 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00 }, // ! 10 { 0x00, 0x00, 0x07, 0x00, 0x07, 0x00 }, // " 11 { 0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // # 12 { 0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // $ 13 { 0x00, 0x62, 0x64, 0x08, 0x13, 0x23 }, // % 14 { 0x00, 0x36, 0x49, 0x55, 0x22, 0x50 }, // & 15 { 0x00, 0x00, 0x05, 0x03, 0x00, 0x00 }, // ' 16 { 0x00, 0x00, 0x1c, 0x22, 0x41, 0x00 }, // ( 17 { 0x00, 0x00, 0x41, 0x22, 0x1c, 0x00 }, // ) 18 { 0x00, 0x14, 0x08, 0x3E, 0x08, 0x14 }, // * 19 { 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08 }, // + 20 { 0x00, 0x00, 0x00, 0xA0, 0x60, 0x00 }, // , 21 { 0x00, 0x08, 0x08, 0x08, 0x08, 0x08 }, // - 22 { 0x00, 0x00, 0x60, 0x60, 0x00, 0x00 }, // . 23 { 0x00, 0x20, 0x10, 0x08, 0x04, 0x02 }, // / 24 { 0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E }, // 0 25 { 0x00, 0x00, 0x42, 0x7F, 0x40, 0x00 }, // 1 26 { 0x00, 0x42, 0x61, 0x51, 0x49, 0x46 }, // 2 27 { 0x00, 0x21, 0x41, 0x45, 0x4B, 0x31 }, // 3 28 { 0x00, 0x18, 0x14, 0x12, 0x7F, 0x10 }, // 4 29 { 0x00, 0x27, 0x45, 0x45, 0x45, 0x39 }, // 5 30 { 0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30 }, // 6 31 { 0x00, 0x01, 0x71, 0x09, 0x05, 0x03 }, // 7 32 { 0x00, 0x36, 0x49, 0x49, 0x49, 0x36 }, // 8 33 { 0x00, 0x06, 0x49, 0x49, 0x29, 0x1E }, // 9 34 { 0x00, 0x00, 0x36, 0x36, 0x00, 0x00 }, // : 35 { 0x00, 0x00, 0x56, 0x36, 0x00, 0x00 }, // ; 36 { 0x00, 0x08, 0x14, 0x22, 0x41, 0x00 }, // < 37 { 0x00, 0x14, 0x14, 0x14, 0x14, 0x14 }, // = 38 { 0x00, 0x00, 0x41, 0x22, 0x14, 0x08 }, // > 39 { 0x00, 0x02, 0x01, 0x51, 0x09, 0x06 }, // ? 40 { 0x00, 0x32, 0x49, 0x59, 0x51, 0x3E }, // @ 41 { 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C }, // A 42 { 0x00, 0x7F, 0x49, 0x49, 0x49, 0x36 }, // B 43 { 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22 }, // C 44 { 0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C }, // D 45 { 0x00, 0x7F, 0x49, 0x49, 0x49, 0x41 }, // E 46 { 0x00, 0x7F, 0x09, 0x09, 0x09, 0x01 }, // F 47 { 0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A }, // G 48 { 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F }, // H 49 { 0x00, 0x00, 0x41, 0x7F, 0x41, 0x00 }, // I 50 { 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01 }, // J 51 { 0x00, 0x7F, 0x08, 0x14, 0x22, 0x41 }, // K 52 { 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40 }, // L 53 { 0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F }, // M 54 { 0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F }, // N 55 { 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E }, // O 56 { 0x00, 0x7F, 0x09, 0x09, 0x09, 0x06 }, // P 57 { 0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E }, // Q 58 { 0x00, 0x7F, 0x09, 0x19, 0x29, 0x46 }, // R 59 { 0x00, 0x46, 0x49, 0x49, 0x49, 0x31 }, // S 60 { 0x00, 0x01, 0x01, 0x7F, 0x01, 0x01 }, // T 61 { 0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F }, // U 62 { 0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F }, // V 63 { 0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F }, // W 64 { 0x00, 0x63, 0x14, 0x08, 0x14, 0x63 }, // X 65 { 0x00, 0x07, 0x08, 0x70, 0x08, 0x07 }, // Y 66 { 0x00, 0x61, 0x51, 0x49, 0x45, 0x43 }, // Z 67 { 0x00, 0x00, 0x7F, 0x41, 0x41, 0x00 }, // [ 68 { 0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55 }, // 55 69 { 0x00, 0x00, 0x41, 0x41, 0x7F, 0x00 }, // ] 70 { 0x00, 0x04, 0x02, 0x01, 0x02, 0x04 }, // ^ 71 { 0x00, 0x40, 0x40, 0x40, 0x40, 0x40 }, // _ 72 { 0x00, 0x00, 0x01, 0x02, 0x04, 0x00 }, // ' 73 { 0x00, 0x20, 0x54, 0x54, 0x54, 0x78 }, // a 74 { 0x00, 0x7F, 0x48, 0x44, 0x44, 0x38 }, // b 75 { 0x00, 0x38, 0x44, 0x44, 0x44, 0x20 }, // c 76 { 0x00, 0x38, 0x44, 0x44, 0x48, 0x7F }, // d 77 { 0x00, 0x38, 0x54, 0x54, 0x54, 0x18 }, // e 78 { 0x00, 0x08, 0x7E, 0x09, 0x01, 0x02 }, // f 79 { 0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C }, // g 80 { 0x00, 0x7F, 0x08, 0x04, 0x04, 0x78 }, // h 81 { 0x00, 0x00, 0x44, 0x7D, 0x40, 0x00 }, // i 82 { 0x00, 0x40, 0x80, 0x84, 0x7D, 0x00 }, // j 83 { 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00 }, // k 84 { 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00 }, // l 85 { 0x00, 0x7C, 0x04, 0x18, 0x04, 0x78 }, // m 86 { 0x00, 0x7C, 0x08, 0x04, 0x04, 0x78 }, // n 87 { 0x00, 0x38, 0x44, 0x44, 0x44, 0x38 }, // o 88 { 0x00, 0xFC, 0x24, 0x24, 0x24, 0x18 }, // p 89 { 0x00, 0x18, 0x24, 0x24, 0x18, 0xFC }, // q 90 { 0x00, 0x7C, 0x08, 0x04, 0x04, 0x08 }, // r 91 { 0x00, 0x48, 0x54, 0x54, 0x54, 0x20 }, // s 92 { 0x00, 0x04, 0x3F, 0x44, 0x40, 0x20 }, // t 93 { 0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C }, // u 94 { 0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C }, // v 95 { 0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C }, // w 96 { 0x00, 0x44, 0x28, 0x10, 0x28, 0x44 }, // x 97 { 0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C }, // y 98 { 0x00, 0x44, 0x64, 0x54, 0x4C, 0x44 }, // z 99 { 0x14, 0x14, 0x14, 0x14, 0x14, 0x14 } // horiz lines 100 }; 101 void Lcd_init(void) 102 { 103 GPIO_InitTypeDef GPIO_InitStructure; 104 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); 105 106 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; 107 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 108 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 109 GPIO_Init(GPIOB, &GPIO_InitStructure); 110 111 RST=0; /*µÍµçƽ¸´Î»*/ 112 delay_ms(20); 113 RST=1; /*¸´Î»Íê±Ï*/ 114 delay_ms(20); 115 Write_command(0xe2); /*Èí¸´Î»*/ 116 delay_ms(5); 117 Write_command(0x2c); /*Éýѹ²½¾Û1*/ 118 delay_ms(5); 119 Write_command(0x2e); /*Éýѹ²½¾Û2*/ 120 delay_ms(5); 121 Write_command(0x2f); /*Éýѹ²½¾Û3*/ 122 delay_ms(5); 123 Write_command(0x25); /*´Öµ÷¶Ô±È¶È£¬¿ÉÉèÖ÷¶Î§0x20¡«0x27*/ 124 Write_command(0x81); /*΢µ÷¶Ô±È¶È*/ 125 Write_command(0x1A); /*΢µ÷¶Ô±È¶ÈµÄÖµ£¬¿ÉÉèÖ÷¶Î§0x00¡«0x3f*/ 126 Write_command(0xa2); /*1/9 ƫѹ±È£¨bias£©*/ 127 Write_command(0xc8); /*ÐÐɨÃè˳Ðò£º´ÓÉϵ½ÏÂ*/ 128 Write_command(0xa0); /*ÁÐɨÃè˳Ðò£º´Ó×óµ½ÓÒ*/ 129 Write_command(0x40); /*ÆðʼÐУºµÚÒ»ÐпªÊ¼*/ 130 Write_command(0xaf); /*¿ªÏÔʾ*/ 131 delay_ms(10); 132 Write_command(0x30); 133 delay_ms(5); 134 Write_command(0x30); 135 delay_ms(10); 136 Write_command(0x0c); 137 138 Clear_screen(); 139 } 140 void Write_command(u8 com) 141 { 142 u8 i; 143 CS=0; 144 RS=0; 145 for(i=0;i<8;i++) 146 { 147 SCK=0; 148 if(com&0x80) SDA=1; 149 else SDA=0; 150 delay_ms(2); 151 SCK=1; 152 delay_ms(2); 153 com=com<<=1; 154 } 155 } 156 void Write_data(u8 data) 157 { 158 u8 i; 159 CS=0; 160 RS=1; 161 for(i=0;i<8;i++) 162 { 163 SCK=0; 164 if(data&0x80) SDA=1; 165 else SDA=0; 166 SCK=1; 167 data=data<<=1; 168 } 169 } 170 void Lcd_pos(u8 x,u8 y) 171 { 172 Write_command(0xb0+y); 173 Write_command(((x&0xf0)>>4)|0x10); 174 Write_command((x&0x0f)|0x01); 175 } 176 void Clear_screen(void) 177 { 178 u8 i,j; 179 for(i=0;i<9;i++) 180 { 181 CS=0; 182 Write_command(0xb0+i); 183 Write_command(0x10); 184 Write_command(0x01); 185 for(j=0;j<132;j++) 186 Write_data(0x00); 187 } 188 } 189 void Disp_char(u8 x, u8 y, u8 z) 190 { 191 192 u8 j; 193 z -=32; 194 Lcd_pos(x,y); 195 for(j=0;j<6;j++) 196 { 197 Write_data(zimu[z][j]); 198 } 199 } 200 void Disp_string(u8 x,u8 y,u8 *z) 201 { 202 while(*z) 203 { 204 Disp_char(x, y, *z); 205 z++; 206 x +=6; 207 if(x>126) 208 { 209 x=0; 210 y++; 211 } 212 } 213 } 214 void Disp_num(u8 x,u8 y,s16 num) 215 {//s16 = signed int 216 u8 c,i,j,n[7]={0}; 217 if(num<0) 218 { 219 Disp_char(x,y,'-'); 220 x +=6; 221 num=-num; 222 } 223 if(num==0) 224 { 225 Disp_char(x,y,'0'); 226 } 227 else 228 { 229 for(i=0;num>0;i++) 230 { 231 n[i]=num%10; 232 num/=10; 233 } 234 while(i--) 235 { 236 c=n[i]+16; 237 Lcd_pos(x,y); 238 for(j=0;j<6;j++) 239 { 240 Write_data(zimu[c][j]); 241 } 242 x+=6; 243 } 244 } 245 } 246 void Clear_GDRAM(void) 247 { 248 u8 j,k; 249 Write_command(0x34); 250 for( j = 0 ; j < 32 ; j++ ) 251 { 252 Write_command(0x80 + j); // Y 253 Write_command(0x80); // X 254 for( k = 0 ; k < 32 ; k++ ) 255 {// address auto ++ 256 Write_data(0x00); 257 } 258 } 259 Write_command(0x30); 260 } 261 void Draw_point(u8 x,u8 y,u8 color) 262 {//color = 0, 1 263 u8 X,Y,k,DH=0x00,DL=0x00; 264 Write_command(0x34); 265 if(y >= 0 && y <= 63 && x >= 0 && x <= 127) 266 { 267 if(y < 32) 268 { 269 X = 0x80 + (x >> 4); // x/16 128/16=8 270 Y = 0x80 + y; 271 } 272 else 273 { 274 X = 0x88 + (x >> 4); 275 Y = 0x80 + (y - 32); 276 } 277 } 278 k = x%16; 279 switch(color) 280 { 281 case 0: if(k < 8) 282 DH = ~(0x01 << (7 - k)); 283 else 284 DL = ~(0x01 << (7 - (k % 8))); 285 break; 286 case 1: if(k < 8) 287 DH = (0x01 << (7 - k)); 288 else 289 DL = (0x01 << (7 - (k % 8))); 290 break; 291 default: break; 292 } 293 Write_command(Y); 294 Write_command(X); 295 Write_data(DH); 296 Write_data(DL); 297 Write_command(0x36); 298 Write_command(0x30); 299 }