找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4997|回復(fù): 0
收起左側(cè)

基于AT89C51和12864的萬(wàn)年歷仿真+源代碼

[復(fù)制鏈接]
ID:147685 發(fā)表于 2016-11-16 16:18 | 顯示全部樓層 |閱讀模式
0.png
本文件分四個(gè)部分 生成一個(gè)HEX文件
萬(wàn)年歷完整版.rar (65.46 KB, 下載次數(shù): 124)

  1. //--------------------------LCD_12864.c-------------------------
  2. // 名稱 :12864LCD顯示驅(qū)動(dòng)程序(不帶字庫(kù))
  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   // 液晶數(shù)據(jù)線端口DB0-DB7
  9. #define LCD_START_ROW 0xc0  //起始行命令
  10. #define LCD_PAGE 0xB8   //  頁(yè)指令
  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. // 檢查L(zhǎng)CD是否忙
  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寫入一個(gè)字節(jié)(一般用于發(fā)送命令)
  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寫入數(shù)據(jù)
  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)    //根據(jù)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. // 通用顯示函數(shù)  從第P頁(yè)第L列顯示W(wǎng)個(gè)字節(jié)數(shù)據(jù),具體顯示的數(shù)據(jù)在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. // 顯示一個(gè)8×16點(diǎn)陣字符
  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. // 顯示一個(gè)16×16點(diǎn)陣字符 (漢字上半部分與下半部分分別處在相鄰兩頁(yè)中)
  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. }
復(fù)制代碼


評(píng)分

參與人數(shù) 2黑幣 +55 收起 理由
xiegh + 5 贊一個(gè)!
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表