找回密码
 立即注册

QQ登录

只需一步,快速开始

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

12864显示汉字c51程序 单片机:STC12C5A60S2

[复制链接]
跳转到指定楼层
楼主
ID:79544 发表于 2015-7-25 21:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. /**************************************************
  2.         功能:12864显示汉字
  3.         单片机:STC12C5A60S2
  4.         晶振:11.0592M
  5.         作者:苏义江
  6.         时间:2015-7-25修改
  7.                         并行输出
  8. *****************************************************/
  9. #include<reg52.h>
  10. #define uchar unsigned char
  11. #define uint unsigned int


  12. sbit E=P3^7;//脉冲使能
  13. sbit RW=P3^6;//读写选择
  14. sbit RS=P3^5;//数据命令选择
  15. sbit rst=P1^0;//12864复位
  16. uchar code table3[]="欲穷千里目";
  17. uchar code table4[]="更上一层楼";
  18. uchar code table1[]="白日依山尽";
  19. uchar code table2[]="黄河入海流";
  20. // 延时ms函数:
  21. void Delayms(uint t)//STC12C5A60S2  1ms
  22. {
  23.     uint i,j;
  24.     for(i=t;i>0;i--)
  25.              for(j=0;j<840;j++);
  26. }

  27. // 12864写命令函数:
  28. void Write12864Command(uchar com)
  29. {
  30.                 Delayms(10);
  31.        P0=com;//赋值
  32.        E=0;//写命令前三控制线的状态
  33.                 Delayms(10);
  34.        RS=0;
  35.        RW=0;
  36.        E=1;//拉高,写命令
  37.                 Delayms(10);//延时必须加
  38.        E=0;//写命令后三控制线的状态
  39.                 Delayms(10);//延时必须加
  40.        RS=1;
  41.        RW=1;
  42. }
  43. //12864写数据函数:
  44. void Write12864Data( uchar dat)
  45. {
  46.            Delayms(10);
  47.        P0=dat;//赋值
  48.        E=0;//写数据前三控制线的状态
  49.                 Delayms(10);
  50.        RS=1;
  51.        RW=0;   
  52.        E=1;//拉高,写数据
  53.            Delayms(10);//延时必须加
  54.        E=0;//写数据后三控制线的状态
  55.                 Delayms(10);//延时必须加
  56.        RS=0;
  57.        RW=1;
  58. }   
  59. //12864初始化函数:
  60. void Initialize12864()
  61. {
  62.        rst=0;//复位12864
  63.        Delayms(30);
  64.        rst=1;
  65.        Delayms(20);
  66.        Write12864Command(0x30);//功能设定:8位控制方式,使用基本指令
  67.        Write12864Command(0x08);//显示关
  68.        Write12864Command(0x01);//清屏
  69.        Write12864Command(0x06);//地址计数器加一、光标右移
  70.        Write12864Command(0x0c);//显示开
  71. }
  72. //在指定行和列显示汉字
  73. void LCD12864DisplayString( uchar y, uchar x, uchar *pstr)
  74.   //y-行数值0-3,x-列数值0-7,pstr-字符串指针
  75. //12864可以显示32个汉字(四行每行8个),一个地址对应一个汉字
  76. //可以显示64个ASCII码字符(四行每行16个),一个地址对应两个字符
  77.   //为了实现自动换行功能,这个函数比较繁琐
  78. {
  79.      uchar row,n=0;
  80.      Write12864Command(0x30);//基本指令
  81.      Write12864Command(0x06);//地址计数器自动加以,光标右移
  82.      switch(y)//根据行号选择行地址
  83.      {
  84.                  case 0:row=0x80;break;//第一行首地址
  85.                  case 1:row=0x90;break;//第二行首地址
  86.                  case 2:row=0x88;break;//第三行首地址
  87.                  case 3:row=0x98;break;//第四行首地址
  88.                  default:;
  89.      }
  90.         Write12864Command(row+x);//写地址
  91.      while(*pstr!='\0')
  92.      {
  93.                 Write12864Data(*pstr);//写字符
  94.                 pstr++;
  95.                 n++;//计数
  96.                 if((n+x*2)==16)//如果一行写完,继续写第二行
  97.                 {
  98.                        if(y==0) Write12864Command(0x90);//写下一行地址
  99.                        else if(y==1) Write12864Command(0x88);//写下一行地址
  100.                        else if(y==2) Write12864Command(0x98);//写下一行地址
  101.                        else ;
  102.                 }
  103.                 else if((n+x*2)==32)//如果第二行写完,继续写第三行
  104.                 {
  105.                         if(y==0) Write12864Command(0x88);//写下一行地址
  106.                         else if(y==1) Write12864Command(0x98);//写下一行地址
  107.                         else ;
  108.                 }
  109.                 else if((n+x*2)==48)//如果第三行写完,继续写第四行
  110.                 {
  111.                         if(y==0) Write12864Command(0x98);//写下一行地址
  112.                         else ;
  113.                 }
  114.                 else ;
  115.     }
  116. }   
  117. //清屏
  118. void Clear12864Screen()
  119. {
  120.         Write12864Command(0x01);//清屏
  121.         Write12864Data(0x00);//清屏
  122. }
  123. void main()
  124. {
  125.         uchar i;
  126.         Delayms(100);
  127.         Initialize12864();
  128.         Clear12864Screen();
  129.         while(1)
  130. {
  131.         Write12864Command(0x80);
  132.         for(i=0;i<11;i++)
  133.         {
  134.                 Write12864Data(table1[i]);
  135.                 Delayms(200);
  136.         }
  137. Clear12864Screen();
  138.         Write12864Command(0x90);
  139.         for(i=0;i<11;i++)
  140.         {
  141.                 Write12864Data(table2[i]);
  142.                 Delayms(200);
  143.         }
  144. Clear12864Screen();
  145.         Write12864Command(0x88);
  146.         for(i=0;i<12;i++)
  147.         {
  148.                 Write12864Data(table3[i]);
  149.                 Delayms(200);
  150.         }
  151. Clear12864Screen();
  152.         Write12864Command(0x98);
  153.         for(i=0;i<12;i++)
  154.         {
  155.                 Write12864Data(table4[i]);
  156.                 Delayms(200);
  157.         }
  158. Clear12864Screen();
  159.         LCD12864DisplayString(0, 0, "--苏义江成心欢迎大家来到单片机世界。没有想不到只有做不到!");
  160.         Delayms(4000);
  161. Clear12864Screen();
  162.         }
  163.                
  164. }
复制代码


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:193210 发表于 2017-9-19 11:28 | 只看该作者
不错不错不错
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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