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)
|