12864液晶顯示器常用顯示模式是圖形模式,顯示字符要取字模以作圖方式顯示,不太方便,但也給我們提供了更豐富的顯示功能,便于實現旋轉、鏡象等特效,旋轉理論上說可以以任意角度旋轉,但這涉及到復雜的三角函數計算,本文不做研究,如有需要另文討論。本文只針對旋轉90、180、270度的情況,這三種情況不涉及三角函數計算,只涉及矩陣變換,比較簡單,也很實用,特別是網上的一些字模是橫向布置的,需要旋轉才能在12864上正常顯示,本文的旋轉顯示方法更顯有價值。除了旋轉外,也可以實現鏡象顯示,有水平方向的鏡象顯示和垂直方向的鏡象顯示,本文都進行探索。以下是程序仿真截圖。
上面第一行為原始狀態顯示,即沒有旋轉,是從網上抄的字模,可以看出不便于12864使用。
第二行左中右分別為旋轉90度、180度、270度的顯示。
第三行為垂直鏡象顯示和水平鏡象顯示。
符件有完整的仿真設計和程序。
單片機源程序如下:
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit rs=P2^3;
- sbit rw=P2^2;
- sbit E=P2^1;
- sbit cs1=P2^5;
- sbit cs2=P2^4;
- char cdata[][8]={{0x80,0x90,0x8c,0x84,0x84,0x84,0xf5,0x86},
- {0x84,0x84,0x84,0x84,0x94,0x8c,0x84,0x00},
- {0x00,0x80,0x80,0x84,0x46,0x49,0x28,0x10},
- {0x10,0x2c,0x23,0x40,0x80,0x00,0x00,0x00},
- {0xff,0xe7,0xe7,0xdb,0x81,0xbd,0x7e,0xff},
- {0xff,0xc1,0xbd,0xbd,0xc1,0xbd,0xbd,0xc1},
- {0xff,0xc3,0xbd,0xfd,0xfd,0xbd,0xc3,0xff}
- };
- void delay(int ii){int i;for(i=0;i<ii;i++);}
- //=======================================================
- void writeCmd(char c){E=0;rs=0;rw=0;E=1;P0=c;E=0;}
- void writeDat(char c){E=0;rs=1;rw=0;E=1;P0=c;E=0;}
- void set_xy(uchar x,uchar y){if(y>=64){cs2=0;cs1=1;y=y-64;}else{cs1=0;cs2=1;}writeCmd(0x40|y);writeCmd(0xb8|x);}
- void disp_HZ(uchar R,uchar L,uchar *p)
- {uchar i;
- for(i=0;i<16;i++){set_xy(2*R,16*L+i);writeDat(p[i]);
- set_xy(2*R+1,16*L+i);writeDat(p[i+16]);}
- }
- unsigned char HLR(char ii,unsigned char *cp){char i,c=0;for(i=7;i>=0;i--){c=c<<1;c|=(cp[i]>>ii)&0x01;}return c;}
- unsigned char HLL(char ii,unsigned char *cp){char i,c=0;for(i=0;i<8;i++){c=c<<1;c|=(cp[i]>>ii)&0x01;}return c;}
- unsigned char HLY(char ii,unsigned char *cp){char i,c=0;for(i=0;i<8;i++){c=c<<1;c|=(cp[ii]>>i)&0x01;}return c;}
- void ShowChar0(unsigned char x,unsigned char y,unsigned char *ch){int i;set_xy(x,y);for(i=0;i<8;i++)writeDat(ch[i]);}
- void ShowChar90(unsigned char x,unsigned char y,unsigned char *ch){int i;set_xy(x,y);for(i=7;i>=0;i--)writeDat(HLR(i,ch));}
- void ShowChar180(unsigned char x,unsigned char y,unsigned char *ch){int i;set_xy(x,y);for(i=7;i>=0;i--)writeDat(HLY(i,ch));}
- void ShowChar270(unsigned char x,unsigned char y,unsigned char *ch){int i;set_xy(x,y);for(i=0;i<8;i++)writeDat(HLL(i,ch));}
- void ShowCharY(unsigned char x,unsigned char y,unsigned char *ch){int i;set_xy(x,y);for(i=0;i<8;i++)writeDat(HLY(i,ch));}
- void ShowCharX(unsigned char x,unsigned char y,unsigned char *ch){int i;set_xy(x,y);for(i=0;i<8;i++)writeDat(ch[7-i]);}
- main()
- {int i,j;
- //cs1=0;cs2=0;
- disp_HZ(0,3,cdata[0]);
- for(j=0;j<3;j++)ShowChar0(0,j*8,cdata[j+4]);
- for(j=0;j<3;j++)ShowChar90(3,j*8,cdata[j+4]);
- for(j=0;j<3;j++)ShowChar180(3,j*8+32,cdata[j+4]);
- for(j=0;j<3;j++)ShowChar270(3,j*8+64,cdata[j+4]);
- for(j=0;j<3;j++)ShowCharY(5,j*8,cdata[j+4]);
- for(j=0;j<3;j++)ShowCharX(5,j*8+32,cdata[j+4]);
- while(1);
- }
復制代碼
所有資料51hei提供下載:
12864A1.zip
(85.69 KB, 下載次數: 52)
2019-3-14 13:20 上傳
點擊文件名下載附件
仿真與程序
|