找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4414|回复: 0
打印 上一主题 下一主题
收起左侧

在12864显示器上实现字符的旋转和镜象显示(单片机程序+仿真)

[复制链接]
跳转到指定楼层
楼主
     12864液晶显示器常用显示模式是图形模式,显示字符要取字模以作图方式显示,不太方便,但也给我们提供了更丰富的显示功能,便于实现旋转、镜象等特效,旋转理论上说可以以任意角度旋转,但这涉及到复杂的三角函数计算,本文不做研究,如有需要另文讨论。本文只针对旋转90、180、270度的情况,这三种情况不涉及三角函数计算,只涉及矩阵变换,比较简单,也很实用,特别是网上的一些字模是横向布置的,需要旋转才能在12864上正常显示,本文的旋转显示方法更显有价值。除了旋转外,也可以实现镜象显示,有水平方向的镜象显示和垂直方向的镜象显示,本文都进行探索。以下是程序仿真截图。

      上面第一行为原始状态显示,即没有旋转,是从网上抄的字模,可以看出不便于12864使用。
      第二行左中右分别为旋转90度、180度、270度的显示。
      第三行为垂直镜象显示和水平镜象显示。
      符件有完整的仿真设计和程序。

单片机源程序如下:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint  unsigned int

  4. sbit rs=P2^3;
  5. sbit rw=P2^2;
  6. sbit E=P2^1;
  7. sbit cs1=P2^5;
  8. sbit cs2=P2^4;
  9. char cdata[][8]={{0x80,0x90,0x8c,0x84,0x84,0x84,0xf5,0x86},
  10.                  {0x84,0x84,0x84,0x84,0x94,0x8c,0x84,0x00},
  11.                  {0x00,0x80,0x80,0x84,0x46,0x49,0x28,0x10},
  12.                  {0x10,0x2c,0x23,0x40,0x80,0x00,0x00,0x00},
  13.                  {0xff,0xe7,0xe7,0xdb,0x81,0xbd,0x7e,0xff},
  14.                  {0xff,0xc1,0xbd,0xbd,0xc1,0xbd,0xbd,0xc1},
  15.                                  {0xff,0xc3,0xbd,0xfd,0xfd,0xbd,0xc3,0xff}
  16.                                  };
  17. void delay(int ii){int i;for(i=0;i<ii;i++);}
  18. //=======================================================
  19. void writeCmd(char c){E=0;rs=0;rw=0;E=1;P0=c;E=0;}
  20. void writeDat(char c){E=0;rs=1;rw=0;E=1;P0=c;E=0;}
  21. 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);}
  22. void disp_HZ(uchar R,uchar L,uchar *p)
  23. {uchar i;
  24. for(i=0;i<16;i++){set_xy(2*R,16*L+i);writeDat(p[i]);
  25. set_xy(2*R+1,16*L+i);writeDat(p[i+16]);}
  26. }
  27. 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;}
  28. 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;}
  29. 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;}
  30. 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]);}
  31. 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));}
  32. 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));}
  33. 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));}
  34. 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));}
  35. 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]);}

  36. main()
  37. {int i,j;
  38. //cs1=0;cs2=0;
  39. disp_HZ(0,3,cdata[0]);
  40. for(j=0;j<3;j++)ShowChar0(0,j*8,cdata[j+4]);
  41. for(j=0;j<3;j++)ShowChar90(3,j*8,cdata[j+4]);
  42. for(j=0;j<3;j++)ShowChar180(3,j*8+32,cdata[j+4]);
  43. for(j=0;j<3;j++)ShowChar270(3,j*8+64,cdata[j+4]);
  44. for(j=0;j<3;j++)ShowCharY(5,j*8,cdata[j+4]);
  45. for(j=0;j<3;j++)ShowCharX(5,j*8+32,cdata[j+4]);
  46. while(1);
  47. }
复制代码

所有资料51hei提供下载:
12864A1.zip (85.69 KB, 下载次数: 49)

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表