找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机LCD12864显示屏图片中文英文显示仿真程序

[复制链接]
跳转到指定楼层
楼主
出于爱好,喜欢单片机而进行的学习,将学习过程发出来进行交流。如有不妥的地方,也希望大家可以指正,多谢。软件版本:proteus8.9,keil uvision5
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)




显示结果:






图片及字体取模





附件中含详细的代码及C源文件,及显示的控制芯片的手册及个人记录的相应芯片操作指令。

单片机源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #include<stdlib.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. //定义端口
  7. sbit A0=P2^0;  //定义端口是传输命令还是数据,
  8. sbit RW=P2^1;//定义端口是读取还是写入,
  9. sbit LCDEN=P2^2;//芯片使能启动
  10. sbit RST=P2^3;//复位键

  11. uchar code dis1[]={/*--  文字:  我  --*/
  12. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  13. 0x20,0x24,0x24,0x24,0xFE,0x23,0x22,0x20,0x20,0xFF,0x20,0x22,0x2C,0xA0,0x20,0x00,
  14. 0x00,0x08,0x48,0x84,0x7F,0x02,0x41,0x40,0x20,0x13,0x0C,0x14,0x22,0x41,0xF8,0x00};



  15. uchar code dis2[]={
  16. /*--  文字:  爱  --*/
  17. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  18. 0x80,0x64,0x2C,0x34,0x24,0x24,0xEC,0x32,0x22,0x22,0x32,0x2E,0x23,0xA2,0x60,0x00,
  19. 0x00,0x41,0x21,0x91,0x89,0x87,0x4D,0x55,0x25,0x25,0x55,0x4D,0x81,0x80,0x80,0x00};
  20.         中间省略 见附件
  21. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00
  22. };



  23. /*******************************************************************************
  24. * 函 数 名         : delay_ms,
  25. * 函数功能         : 毫秒延时程序
  26. * 输    入         : 输入延时时间长度,单位为毫秒
  27. * 输    出         : 无
  28. *******************************************************************************/


  29. void delay_ms(uint x)
  30. {
  31.         uint i,j;
  32.         for (j=0;j<x;j++)
  33.                 for(i=0;i<110;i++);
  34. }


  35. /*******************************************************************************
  36. * 函 数 名         : write_com
  37. * 函数功能         : LCD写指令程序
  38. * 输    入         : 输入LCD对应的设置指令代码
  39. * 输    出         : 对LCD进行相应的设置
  40. *******************************************************************************/
  41. void write_com(uchar cmd)
  42. {
  43.         A0=0;
  44.         RW=0;
  45.         LCDEN=1;
  46.         P0=cmd;
  47.         _nop_();
  48.         LCDEN=0;
  49.         RW=1;

  50. }
  51. /*******************************************************************************
  52. * 函 数 名         : write_dat
  53. * 函数功能         : LCD写数据程序
  54. * 输    入         : 向LCD写入对应的数据或代码
  55. * 输    出         : 对LCD数据输入显示
  56. *******************************************************************************/
  57. void write_dat(uchar dat)
  58. {
  59.         A0=1;
  60.         RW=0;
  61.         LCDEN=1;
  62.         P0=dat;
  63.         _nop_();
  64.         LCDEN=0;
  65.         RW=1;
  66. }

  67. /*******************************************************************************
  68. * 函 数 名         : LCD_Initial
  69. * 函数功能         : 对LCD进行初始化
  70. * 输    入         : 对LCD的初始状态进行配置
  71. * 输    出         : 无
  72. *******************************************************************************/


  73. /*LCD初始化*/
  74. void LCD_Initial()
  75. {
  76.         RST=0;
  77.         delay_ms(10);
  78.         RST=1;
  79.         delay_ms(10);
  80.          write_com(0xa2); //1/9 bias set
  81.         write_com(0xa1);    //adc=0,正常从左到右显示
  82. write_com(0xc8);    //COM颠倒输出,,Startline0在上侧,Com0 在上侧
  83.                 write_com(0xae);    //Display_Hanzi 0ff
  84.                     write_com(0xaf);    //Display_Hanzi on
  85.       
  86.         }
  87. /*******************************************************************************
  88. * 函 数 名         : Display_Hanzi
  89. * 函数功能         : 在指定的行与列写入对应的汉字
  90. * 输    入         : a对应的是写入位置的页,b对应写入字符的列,c为写入的汉字代码数组,汉字的宽度为16,
  91.                                                                                 则在对高四位来进行设定的时候,直接用0x10与其列数进行与操作,高四位的变化范围只能
  92.                                                                                 为0-7,满足128列的范围。
  93. * 输    出         : 在屏幕上显示要输出的内容
  94. *******************************************************************************/
  95.         void Display_Hanzi(int a,int b,uchar *c)
  96. {
  97.         int n;
  98.         for(n=0;n<=15;n++)
  99.         {
  100.          write_com(a);                                //选择a页
  101.          _nop_();       
  102.          write_com(0x10|b);   //由于字符特征,直接选取对应的高位进行设置。
  103.          _nop_();       
  104.          write_com(0x00|n);
  105.          _nop_();       
  106.          write_dat(c[n]);
  107.          _nop_();       
  108.                
  109.          write_com(1+a);                                //选择a+1页
  110.          _nop_();       
  111.          write_com(0x10|b);//列的高四位
  112.          _nop_();       
  113.          write_com(0x00|n);//列的低四位
  114.          _nop_();       
  115.          write_dat(c[n+16]);
  116.          _nop_();
  117.                 }
  118.        
  119.         }

  120.        
  121.         /*******************************************************************************
  122. * 函 数 名         : Display_SC
  123. * 函数功能         : 在指定的行与列写入对应的单字节字符
  124. * 输    入         : a对应的是写入位置的页,b对应写入字符的列,c为写入的汉字代码数组
  125. * 输    出         : 在屏幕上显示要输出的内容
  126. *******************************************************************************/
  127.         void Display_SC(int a,int b,uchar *c)
  128. {
  129.         int n;
  130.         int C_high,C_low;
  131.         C_high = (b&0xF0)>>4;//选择列的高四位
  132.         C_low = (b&0x0F);  //列的低四位
  133.         for(n=0;n<=7;n++)
  134.         {
  135.          write_com(a);                                //选择a页
  136.        
  137.          write_com(0x10|C_high);//列的高四位
  138.          write_com((0x00|C_low)+n);//列的低四位
  139.          write_dat(c[n]);
  140.                
  141.          write_com(1+a);                                //选择a+1页
  142.          write_com(0x10|C_high);//列的高四位
  143.          write_com((0x00|C_low)+n);//列的低四位
  144.          write_dat(c[n+8]);
  145.                 }
  146.        
  147.         }

  148.         /*******************************************************************************
  149. * 函 数 名         : Display_BMP
  150. * 函数功能         : 显示图片的内容,图片大小为128*64
  151. * 输    入         : 输入对应的代码数组
  152. * 输    出         : 在屏幕上显示要输出的图片内容
  153. *******************************************************************************/
  154.         void Display_BMP(uchar *bmp)
  155.         {
  156.                 int i=0;        //页码,0-7页
  157.                 int j=0;        //列数,0-127列,对应一行的像素数
  158.                         int C_high,C_low,C_COLUMN;

  159.                 {
  160.                 for(i=0;i<8;i++)
  161.                         {
  162.                         write_com(0xb0+i);//写入页数
  163.                        
  164.                                 C_COLUMN=0x00;
  165.                                
  166.                         for (j=0;j<128;j++)
  167.                                 {
  168.                                         if(j<128)
  169.                                         {
  170.                                
  171.                                         C_high = ((C_COLUMN+j)&0xF0)>>4;//选择列的高四位
  172.                                         C_low = ((C_COLUMN+j)&0x0F);  //列的低四位
  173.                                         write_com(0x10|C_high);//列的高四位
  174.                                         write_com(0x00|C_low);//列的低四位
  175.                                        
  176.                                         write_dat(bmp[i*128+j]);}
  177.                                 else
  178.                                         {
  179.                                                 C_COLUMN=0X00;
  180.                                                
  181.                                         }
  182.                                        
  183.                                  }
  184.                         }
  185.                
  186.         }
  187. }
  188.        
  189.        
  190. main()
  191. {
  192.                 LCD_Initial();
  193.        
  194.        
  195. while(1)
  196.                
  197.         {
  198.        
  199.                 Display_Hanzi(0xb0,0x00,dis1);
  200.                 Display_Hanzi(0xb0,0x01,dis2);
  201.                 Display_Hanzi(0xb0,0x02,dis3);
  202.           Display_Hanzi(0xb0,0x03,dis4);
  203.                 Display_Hanzi(0xb0,0x04,dis5);
  204.                 Display_Hanzi(0xb0,0x05,dis6);
  205.                 Display_Hanzi(0xb0,0x06,dis7);
  206.                                
  207.                 Display_Hanzi(0xb2,0x00,dis21);
  208.                 Display_Hanzi(0xb2,0x01,dis22);
  209.                 Display_Hanzi(0xb2,0x02,dis23);
  210.                
  211.                 Display_SC(0xb4,0x00,dis30);
  212.                 Display_SC(0xb4,0x08,dis31);
  213.           Display_SC(0xb4,16,dis32);
  214.                 Display_SC(0xb4,24,dis33);
  215.                 Display_SC(0xb6,0,dis40);
  216.                 Display_SC(0xb6,8,dis41);
  217.                 Display_SC(0xb6,16,dis42);
  218.                 Display_SC(0xb6,24,dis43);
  219.                
  220.                 delay_ms(2000);
  221.        
  222.                 Display_BMP(img);
  223.                
  224.                
  225.                 delay_ms(2000);
  226.                 Display_BMP(C_Clear);
  227.                

  228.         }
  229.        
  230.        
  231. }
复制代码

所有资料51hei提供下载:
12864 Display.zip (1.82 MB, 下载次数: 66)

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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