找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机中如何用12864单独显示两个独立数字

[复制链接]
跳转到指定楼层
楼主
ID:516871 发表于 2019-5-21 10:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
          最近想做一件东西,却想到一个一直没有直视的问题,12864只能显示32个汉字,但如何实现在某个位置上写上两个数字呢(不用数组),在网上也很少有这类资料,至少我没有看到,偶然间在调试1602程序时,发现位置可以自动加1,也就是你定了一个位置,写上数据后,可以连续写,如下程序,就实现在在cd_pos(2,0);          //第二行第一列地址上显示45度的字样,你学会了吗?

单片机源程序如下:
  1. #include<reg52.h>        //每个程序都 要包含头文件,

  2. typedef unsigned char uint8;   //声明定义 ,,同 #define ,但#define要加#号才能使用 ,后不加分号
  3. typedef unsigned int uint16;
  4. sbit rs=P2^6;//数据或命令接口
  5. sbit rw=P2^5; //读写接口
  6. sbit e=P2^7;   //使能接口
  7. sbit PSB=P3^2;
  8. uint8 code a[]="今天2019年05月11"; //1602只能显示每行40个字符,多余的无法显示
  9. uint8 code b[]="现在天气真的很热";//为了标示显示位置,两行作为对比                7890
  10. void delay(uint16 i)  //1us
  11. {         uint8 t;
  12.         while(i--)
  13.         {
  14.          for(t=0;t<12;t++)        ;
  15.         }
  16. }
  17. //写指令程序
  18. void write_cmd(uint8 cmd)
  19. {
  20.         delay(2);
  21.         rs=0;                //指令接口
  22.         rw=0;                //写指令
  23.         e=0;
  24.         P0=cmd;                 //指令传给IO口
  25.         e=1;                  //使能端高电平有效,要再拉低结束程序转送,
  26.         delay(2);
  27.         e=0;
  28. }
  29. //写数据程序
  30. void write_dat(uint8 dat)
  31. {
  32.         delay(2);
  33.         rs=1;        //数据
  34.         rw=0;         //写
  35.         e=0;
  36.         P0=dat;
  37.         e=1;
  38.         delay(10);
  39.         e=0;
  40.         delay(2);  //每写完一个数据, 延时,这样显示慢一点,也决定了移屏的速度


  41. }
  42. void init()
  43. {
  44.         delay(1);
  45.          PSB=1;
  46.         write_cmd(0x30); // 0x30:8位数据总线,基本指令集  设置为位数据总线,单行或双行显示
  47.         delay(5);                 // 0x34:8位数据总线,扩充指令集 可实现翻屏操作
  48.         write_cmd(0x0c); //0X0f:光标显示及闪烁         0X0c:光标不显示及不闪烁        
  49.         delay(5);                //0X0e:        光标显示,不闪烁         0x0d:光标不显示闪烁
  50.                                         //同1602
  51.         write_cmd(0x01);         //清屏显示
  52.         delay(5);
  53. }
  54. void lcd_pos(uint8 x,uint8 y)        //位置函数,非常重要,显示第几行,几列
  55. {
  56.          uint8 pos;
  57.         if(x==0)
  58.         {
  59.                 x=0x80;
  60.         }
  61.         else        if(x==1)
  62.         {
  63.                         x=0x90;
  64.         }
  65.         else        if(x==2)
  66.         {
  67.                         x=0x88;
  68.         }
  69.         else        if(x==3)
  70.         {
  71.           x=0x98;
  72.         }
  73.         pos=x+y;                //第几的第几个位置,,所以要相加,相当于第1行的第Y列的,Y,的位置就要定为X+Y
  74.         write_cmd(pos);
  75. }


  76. void display()
  77. {
  78.         uint8 i;
  79.          
  80.         lcd_pos(0,0);                 //第一行第一列地址,若要空降某一地址,写上即可
  81.         for(i=0;i<16;i++)         //设置 80个字符显示,第一行显示完,自动在第二行显示
  82.         {
  83.                 write_dat(a[i]);         //用了数组        ,就要以直接写显示 的字符,否者字符要加单引号''
  84.         }
  85.                            //单独显示某一个字时必须写上对应的十六 进制编码;不要
  86.                                                    //不能直接写上
  87.         lcd_pos(1,0);          //第二行第一列地址
  88.         for(i=0;i<16;i++)
  89.         {
  90.                 write_dat(b[i]);
  91.         }

  92.         lcd_pos(2,0);          //第二行第一列地址

  93.           write_dat('4')  ;          //显示45 度
  94.           write_dat('5')  ;
  95.            write_dat(0XA1);          //   两个度字节显示0C
  96.            write_dat(0xe6);          //
  97. }
  98. void main()
  99. {
  100.         init();
  101.         while(1)
  102.         {
  103.                 display();
  104.         }        
  105. }
复制代码


评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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