找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于AT89C51和12864的万年历仿真+源代码

[复制链接]
跳转到指定楼层
楼主

本文件分四个部分 生成一个HEX文件
万年历完整版.rar (65.46 KB, 下载次数: 120)

  1. //--------------------------LCD_12864.c-------------------------
  2. // 名称 :12864LCD显示驱动程序(不带字库)
  3. //-----------------------------------------------------------------
  4. #include <reg52.h>
  5. #include <intrins.h>
  6. #define uchar unsigned char
  7. #define uint unsigned int
  8. #define LCD_DB_PORT P0   // 液晶数据线端口DB0-DB7
  9. #define LCD_START_ROW 0xc0  //起始行命令
  10. #define LCD_PAGE 0xB8   //  页指令
  11. #define LCD_COL  0x40   //   列指令
  12. bit Reverse_Display=0;//是否反相显示(白底黑字/黑底白字)
  13. //液晶引脚定义
  14. sbit DI=P2^0;
  15. sbit RW=P2^1;
  16. sbit E=P2^2;
  17. sbit CS1=P2^3;
  18. sbit CS2=P2^4;
  19. sbit RST=P2^5;
  20. //---------------------------------------------------------------
  21. // 检查LCD是否忙
  22. //--------------------------------------------------------------
  23. bit LCD_IS_BUSY()
  24. {
  25.    LCD_DB_PORT=0xFF;
  26. RW=1;
  27. _nop_();
  28. DI=0;
  29. E=1;
  30. _nop_();
  31. E=0;
  32. return (bit)(P0&0x80);
  33. }
  34. //---------------------------------------------------------------
  35. // 向LCD写入一个字节(一般用于发送命令)
  36. //--------------------------------------------------------------
  37. void Write_Byte_To_LCD(uchar comand)
  38. {  
  39.     while(LCD_IS_BUSY());   
  40.    LCD_DB_PORT=0xFF;
  41.    RW=0;
  42.    _nop_();
  43.    DI=0;
  44.    LCD_DB_PORT=comand;
  45.    E=1;
  46.    _nop_();
  47.    E=0;
  48. }
  49. //---------------------------------------------------------------
  50. // 向LCD写入数据
  51. //--------------------------------------------------------------
  52. void Write_Data_To_LCD(uchar dat)
  53. {
  54.    while(LCD_IS_BUSY());   
  55.    LCD_DB_PORT=0xFF;
  56.    RW=0;
  57.    _nop_();
  58.    DI=1;
  59.    if(!Reverse_Display)    //根据Reverse_Display决定是否反相显示
  60.        LCD_DB_PORT=dat;
  61.    else  
  62.       LCD_DB_PORT=~dat;
  63.    E=1;
  64.    _nop_();
  65.    E=0;
  66. }
  67. //---------------------------------------------------------------
  68. // 初始化LCD
  69. //--------------------------------------------------------------
  70. void LCD12864_Initialization()
  71. {
  72.   CS1=1;
  73.   CS2=1;
  74.   Write_Byte_To_LCD(0x38);
  75.   Write_Byte_To_LCD(0x0F);
  76.   Write_Byte_To_LCD(0x01);
  77.   Write_Byte_To_LCD(0x06);
  78.   Write_Byte_To_LCD(LCD_START_ROW);
  79. }
  80. //---------------------------------------------------------------
  81. // 通用显示函数  从第P页第L列显示W个字节数据,具体显示的数据在r所
  82. //--------------------------------------------------------------
  83. void LCD_Show(uchar P,uchar L,uchar W,uchar *r) reentrant
  84. {
  85.     uchar i;
  86. if(L<64)
  87.     {
  88.       CS1=1;
  89.          CS2=0;
  90.    Write_Byte_To_LCD(LCD_PAGE+P);
  91.    Write_Byte_To_LCD(LCD_COL+L);
  92.    if(L+W<64)
  93.      {  
  94.        for(i=0;i<W;i++)
  95.        Write_Data_To_LCD(r[i]);
  96.      }
  97.    else
  98.      {
  99.        for(i=0;i<64-L;i++)
  100.        Write_Data_To_LCD(r[i]);
  101.     CS1=0;
  102.              CS2=1;
  103.     Write_Byte_To_LCD(LCD_PAGE+P);
  104.        Write_Byte_To_LCD(LCD_COL);
  105.     for(i=64-L;i<W;i++)
  106.        Write_Data_To_LCD(r[i]);
  107.      }
  108.      }
  109. else
  110.    {
  111.       CS1=0;
  112.             CS2=1;
  113.    Write_Byte_To_LCD(LCD_PAGE+P);
  114.       Write_Byte_To_LCD(LCD_COL+L-64);
  115.    for(i=0;i<W;i++)
  116.       Write_Data_To_LCD(r[i]);
  117.    }
  118. }
  119. //---------------------------------------------------------------
  120. // 显示一个8×16点阵字符
  121. //--------------------------------------------------------------
  122. void Display_char(uchar P1,uchar L1,uchar *M) reentrant
  123. {
  124.    LCD_Show(P1,L1,8,M);
  125.    LCD_Show(P1+1,L1,8,M+8);   
  126. }
  127. //-------------------------------------------------------------------
  128. // 显示一个16×16点阵字符 (汉字上半部分与下半部分分别处在相邻两页中)
  129. //-------------------------------------------------------------------
  130. void Display_Word(uchar P2,uchar L2,uchar *M) reentrant
  131. {            
  132.    LCD_Show(P2,L2,16,M);  
  133.    LCD_Show(P2+1,L2,16,M+16);  
  134. }
复制代码


评分

参与人数 2黑币 +55 收起 理由
xiegh + 5 赞一个!
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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