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

QQ登錄

只需一步,快速開始

搜索
查看: 4504|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

[原創(chuàng)]開源ARM7驅(qū)動(dòng)拼接1024X1024LCD屏Proteus仿真源碼 多年前設(shè)計(jì)的

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:405708 發(fā)表于 2018-10-10 19:13 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
在當(dāng)年還沒有人嘗試過用多塊LCD拼接成大屏幕的仿真程序,采用ARM7驅(qū)動(dòng),希望多交流。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:
  1. #include "config.h"

  2. uint8   BMP[]={

  3. 0x00,0x00,0x00,0x00,0x00,0x01,0xF3,0xF0,0x7F,0x18,0x1B,0xFB,0xF2,0x02,0x41,0xF1,
  4. …………
  5. …………
  6. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
  7. 0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00},/*":",5*/

  8. };



  9. #define  RD (1<<8)
  10. #define  RW (1<<9)
  11. #define  CD (1<<10)
  12. #define  CE1 (1<<11)
  13. #define  CE2 (1<<12)
  14. #define  CE3 (1<<13)
  15. #define  CE4 (1<<14)
  16. #define  CE5 (1<<15)
  17. #define  CE6 (1<<16)
  18. #define  CE7 (1<<17)
  19. #define  CE8 (1<<18)
  20. #define  CE9 (1<<19)
  21. #define  CE10 (1<<20)
  22. #define  CE11 (1<<21)
  23. #define  CE12 (1<<22)
  24. #define  CE13 (1<<23)
  25. #define  CE14 (1<<24)
  26. #define  CE15 (1<<25)
  27. #define  CE16 (1<<26)



  28. #define  LCD_CUR_POS                0x21        /* 光標(biāo)位置設(shè)置(只有設(shè)置到有效顯示地址并打開顯示時(shí)才看到) */
  29. #define  LCD_CGR_POS                0x22        /* CGRAM偏置地址設(shè)置(可以增加自已的符號(hào)) */
  30. #define  LCD_ADR_POS                0x24        /* 地址指針位置(設(shè)置讀寫操作指針) */

  31. #define  LCD_TXT_STP                0x40        /* 文本區(qū)首址(從此地址開始向屏幕左上角顯示字符) */
  32. #define  LCD_TXT_WID                0x41        /* 文本區(qū)寬度(設(shè)置顯示寬度,N/6或N/8,其中N為x軸的點(diǎn)數(shù)) */
  33. #define  LCD_GRH_STP                0x42        /* 圖形區(qū)首址(從此地址開始向屏幕左上角顯示點(diǎn)) */
  34. #define  LCD_GRH_WID                0x43        /* 圖形區(qū)寬度(設(shè)置顯示寬度,N/6或N/8,其中N為x軸的點(diǎn)數(shù)) */

  35. #define  LCD_MOD_OR                        0x80        /* 顯示方式:邏輯或 */
  36. #define  LCD_MOD_XOR                0x81        /* 顯示方式:邏輯異或 */
  37. #define  LCD_MOD_AND                0x82        /* 顯示方式:邏輯與 */
  38. #define  LCD_MOD_TCH                0x83        /* 顯示方式:文本特征 */

  39. #define  LCD_DIS_SW                        0x90        /* 顯示開關(guān):D0=1/0,光標(biāo)閃爍啟用/禁用 */
  40.                                                                         /*                          D1=1/0,光標(biāo)顯示啟用/禁用 */
  41.                                                                         /*                         D2=1/0,文本顯示啟用/禁用(打開后再使用) */
  42.                                                                         /*                         D3=1/0,圖形顯示啟用/禁用(打開后再使用) */
  43.                                                                                                                
  44. #define  LCD_CUR_SHP                0xA0        /* 光標(biāo)形狀選擇:0xA0-0xA7表示光標(biāo)占的行數(shù) */

  45. #define  LCD_AUT_WR                        0xB0        /* 自動(dòng)寫設(shè)置 */
  46. #define  LCD_AUT_RD                        0xB1        /* 自動(dòng)讀設(shè)置 */
  47. #define  LCD_AUT_OVR                0xB2        /* 自動(dòng)讀/寫結(jié)束 */

  48. #define  LCD_INC_WR                        0xC0        /* 數(shù)據(jù)一次寫,地址加1 */
  49. #define  LCD_INC_RD                        0xC1        /* 數(shù)據(jù)一次讀,地址加1 */
  50. #define  LCD_DEC_WR                        0xC2        /* 數(shù)據(jù)一次寫,地址減1 */
  51. #define  LCD_DEC_RD                        0xC3        /* 數(shù)據(jù)一次讀,地址減1 */
  52. #define  LCD_NOC_WR                        0xC4        /* 數(shù)據(jù)一次寫,地址不變 */
  53. #define  LCD_NOC_RD                        0xC5        /* 數(shù)據(jù)一次讀,地址不變 */

  54. #define  LCD_SCN_RD                        0xE0        /* 屏讀 */

  55. #define  LCD_SCN_CP                        0xE8        /* 屏拷貝 */

  56. #define  LCD_BIT_OP                        0xF0        /* 位操作:D0-D2--定義D0-D7位,D3--1為置位,0為清除 */

  57. void CHECK_BUSY_COM()
  58. {
  59.         IODIR=0xff000000;
  60.         do
  61.         {
  62.                 IOSET=CD;
  63.                 IOSET=RW;
  64.                 IOCLR=RD;
  65.         }
  66.         while(!(IOPIN|0xfffe));
  67.         IOSET=RD;
  68. }
  69. void CHECK_BUSY_DAT()
  70. {
  71.         IODIR=0xff000000;
  72.         do
  73.         {
  74.                 IOSET=CD;
  75.                 IOSET=RW;
  76.                 IOCLR=RD;
  77.         }
  78.         while(!(IOPIN|0xfffd));
  79.         IOSET=RD;
  80. }

  81.                         
  82. void  LCD_Write_Command(uint8 dat)
  83. {
  84. //        CHECK_BUSY_COM();
  85.         IOCLR=0xff;
  86.         IOSET=dat;
  87.         IOSET=CD;
  88.         IOSET=RD;
  89.         IOCLR=RW;
  90.         IOSET=RW;
  91. }
  92. void  LCD_Write_Data(uint8 dat)
  93. {
  94. //        CHECK_BUSY_DAT();
  95.         IOCLR=0xff;
  96.         IOSET=dat;
  97.         IOCLR=CD;
  98.         IOSET=RD;
  99.         IOCLR=RW;
  100.         IOSET=RW;
  101. }



  102. void LCD_Write_Command3(uint8 command,uint8 dat1,uint8 dat2)
  103. {
  104.         LCD_Write_Data(dat1);
  105.         LCD_Write_Data(dat2);
  106.         LCD_Write_Command(command);
  107. }

  108. void LCD_Write_Command1(uint8 command,uint8 dat1)
  109. {
  110.         LCD_Write_Data(dat1);
  111.         LCD_Write_Command(command);
  112. }



  113. void LCD_Initialize()
  114. {
  115.         LCD_Write_Command3(LCD_TXT_STP,0x00,0x00);
  116.         LCD_Write_Command3(LCD_TXT_WID,32,0x00);
  117.         LCD_Write_Command3(LCD_GRH_STP,0x00,0x00);
  118.         LCD_Write_Command3(LCD_GRH_WID,32,0x00);
  119.         LCD_Write_Command(LCD_MOD_OR);
  120.         LCD_Write_Command(LCD_DIS_SW|0x08);
  121. }

  122. void  LCD_FillAll(uint8 dat)
  123. {  uint32  i;

  124.    LCD_Write_Command3(LCD_ADR_POS, 0x00, 0x00);                        // 置地址指針
  125.    LCD_Write_Command(LCD_AUT_WR);                                                // 自動(dòng)寫
  126.    for(i=0;i<240*128;i++)
  127.    {  
  128.    LCD_Write_Data(dat);
  129.    }
  130.    LCD_Write_Command(LCD_AUT_OVR);                                                // 自動(dòng)寫結(jié)束
  131.    LCD_Write_Command3(LCD_ADR_POS,0x00,0x00);                        // 重置地址指針
  132. }

  133. void  LCD_UpdatePoint(uint32 x, uint32 y,uint8 dat)
  134. {  uint32  addr;

  135.    /* 找出目標(biāo)地址 */
  136.    addr = y*(256>>3) + (x>>3);
  137.    LCD_Write_Command3(LCD_ADR_POS, addr&0xFF, addr>>8);        // 置地址指針
  138.    
  139.    /* 輸出數(shù)據(jù) */
  140.    LCD_Write_Command1(LCD_INC_WR, dat);
  141. }
  142. void Disp_LCD_HZ(uint16 x,uint16 y,uint16 xsize,uint16 ysize,uint8 *dat)
  143. {
  144.         uint32 i,j;
  145.         for(j=0;j<ysize;j++)
  146.         {
  147.                 for(i=0;i<xsize;)
  148.                 {
  149.                         LCD_UpdatePoint(i+x,j+y,*dat);
  150.                         dat++;
  151.                         i+=8;
  152.                 }
  153.         }
  154. }
  155. void Disp_LCD(uint8 *dat)
  156. {
  157.         uint32 i,j;
  158.         for(j=0;j<1023;j++)
  159.         {
  160.                 for(i=0;i<1023;)
  161.                 {
  162.                         if((i<=256)&&(j<=255)){IOSET=0xfffffc00;IOCLR=CE1;}
  163.                         if((i>=256)&&(j<=256)&&(i<=512)){IOSET=0xfffffc00;IOCLR=CE2;}
  164.                         if((i<=768)&&(j<=256)&&(i>=512)){IOSET=0xfffffc00;IOCLR=CE3;}
  165.                         if((i>=768)&&(j<=256)&&(i<=1024)){IOSET=0xfffffc00;IOCLR=CE4;}
  166.                         if((i<=256)&&(j>=256)&&(j<=512)){IOSET=0xfffffc00;IOCLR=CE5;}
  167.                         if((i>=256)&&(j>=256)&&(i<=512)&&(j<=512)){IOSET=0xfffffc00;IOCLR=CE6;}
  168.                         if((i<=768)&&(j>=256)&&(i>=512)&&(j<=512)){IOSET=0xfffffc00;IOCLR=CE7;}
  169.                         if((i>=768)&&(j>=256)&&(i<=1024)&&(j<=512)){IOSET=0xfffffc00;IOCLR=CE8;}
  170.                         if((i<=256)&&(j>=512)&&(j<=768)){IOSET=0xfffffc00;IOCLR=CE9;}
  171.                         if((i>=256)&&(j>=512)&&(i<=512)&&(j<=768)){IOSET=0xfffffc00;IOCLR=CE10;}
  172.                         if((i<=768)&&(j>=512)&&(i>=512)&&(j<=768)){IOSET=0xfffffc00;IOCLR=CE11;}
  173.                         if((i>=768)&&(j>=512)&&(i<=1024)&&(j<=768)){IOSET=0xfffffc00;IOCLR=CE12;}
  174.                         if((i<=256)&&(j>=768)&&(j<=1024)){IOSET=0xfffffc00;IOCLR=CE13;}
  175.                         if((i>=256)&&(j>=768)&&(i<=512)&&(j<=1024)){IOSET=0xfffffc00;IOCLR=CE14;}
  176.                         if((i<=768)&&(j>=768)&&(i>=512)&&(j<=1024)){IOSET=0xfffffc00;IOCLR=CE15;}
  177.                         if((i>=768)&&(j>=768)&&(i<=1024)&&(j<=1024)){IOSET=0xfffffc00;IOCLR=CE16;}

  178.                         if(j<255)LCD_UpdatePoint(i,j,*dat);
  179.                         if((j>255)&&(j<512)) LCD_UpdatePoint(i,j-255,*dat);
  180.                         if((j>512)&&(j<768)) LCD_UpdatePoint(i,j-512,*dat);
  181.                         if((j>768)&&(j<1024)) LCD_UpdatePoint(i,j-768,*dat);
  182.                         dat++;
  183.                         i+=8;
  184.                 }
  185.         }
  186. }

  187. void Delay()
  188. {
  189.         uint32 i,j;
  190.         for(i=0;i<512;i++)
  191.         for(j=0;j<2;j++);
  192. }
  193. int main()
  194. {
  195.                 uint16 j;
  196.                 IODIR=0xffffffff;
  197.                 IOCLR=0xffffffff;
  198.                 IOCLR=CE1;
  199.                 IOCLR=CE2;
  200.                 IOCLR=CE3;
  201.                 IOCLR=CE4;
  202.                 IOCLR=CE5;
  203.                 IOCLR=CE6;
  204.                 IOCLR=CE7;
  205.                 IOCLR=CE8;
  206.                 IOCLR=CE9;
  207.                 IOCLR=CE10;
  208.                 IOCLR=CE11;
  209.                 IOCLR=CE12;
  210.                 IOCLR=CE13;
  211.                 IOCLR=CE14;
  212.                 IOCLR=CE15;
  213. ……………………

  214. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
  1. /**--------------文件信息--------------------------------------------------------------------------------
  2. **文   件   名: target.c
  3. **描        述: lpc210x(飛利浦的ARM)目標(biāo)板特殊的代碼,包括異常處理程序和目標(biāo)板初始化程序
  4. **              每個(gè)工程應(yīng)當(dāng)具有這個(gè)文件的拷貝,用戶根據(jù)程序的需要修改本文件。
  5. **注        意:本文件必須以ARM(32位代碼)方式編譯,否則,必須更改init.s和vector.s文件
  6. **              別的C代碼不必使用ARM(32位代碼)方式編譯
  7. ********************************************************************************************************/

  8. #define IN_TARGET
  9. #include "config.h"

  10. /*********************************************************************************************************
  11. ** 函數(shù)名稱: IRQ_Exception
  12. ** 功能描述: 中斷異常處理程序,用戶根據(jù)需要自己改變程序
  13. **
  14. ** 輸 入: 無
  15. **
  16. ** 輸 出: 無
  17. **         
  18. ** 全局變量: 無
  19. ** 調(diào)用模塊: 無
  20. ********************************************************************************************************/
  21. void __irq IRQ_Exception(void)
  22.         {
  23.     while(1);                   // 這一句替換為自己的代碼
  24.         }

  25. /*********************************************************************************************************
  26. ** 函數(shù)名稱: FIQ_Exception
  27. ** 功能描述: 快速中斷異常處理程序,用戶根據(jù)需要自己改變程序
  28. **           
  29. ** 輸 入: 無
  30. **
  31. ** 輸 出: 無
  32. **         
  33. ** 全局變量: 無
  34. ** 調(diào)用模塊: 無
  35. ********************************************************************************************************/
  36.         void FIQ_Exception(void)
  37. {
  38.     while(1);                   // 這一句替換為自己的代碼
  39. }

  40. /*********************************************************************************************************
  41. ** 函數(shù)名稱: TargetInit
  42. ** 功能描述: 目標(biāo)板初始化代碼,在需要的地方調(diào)用,根據(jù)需要改變
  43. ** 輸 入: 無
  44. **
  45. ** 輸 出: 無
  46. **         
  47. ** 全局變量: 無
  48. ** 調(diào)用模塊: 無
  49. ********************************************************************************************************/
  50.         void TargetInit(void)
  51. {
  52.     /* 添加自己的代碼 */
  53. }

  54. /*********************************************************************************************************
  55. ** 函數(shù)名稱: TargetResetInit
  56. ** 功能描述: 調(diào)用main函數(shù)前目標(biāo)板初始化代碼,根據(jù)需要改變,不能刪除
  57. ** 輸 入: 無
  58. **
  59. ** 輸 出: 無
  60. **         
  61. ** 全局變量: 無
  62. ** 調(diào)用模塊: 無
  63. ********************************************************************************************************/
  64.         void TargetResetInit(void)
  65. {

  66.     /* 設(shè)置系統(tǒng)各部分時(shí)鐘 */
  67. /*    PLLCON = 1;
  68. #if ((Fcclk / 4) / Fpclk) == 1
  69.     VPBDIV = 0;
  70. #endif

  71. #if ((Fcclk / 4) / Fpclk) == 2
  72.     VPBDIV = 2;
  73. #endif

  74. #if ((Fcclk / 4) / Fpclk) == 4
  75.     VPBDIV = 1;
  76. #endif

  77. #if (Fcco / Fcclk) == 2
  78.     PLLCFG = ((Fcclk / Fosc) - 1) | (0 << 5);
  79. #endif
  80. #if (Fcco / Fcclk) == 4
  81.     PLLCFG = ((Fcclk / Fosc) - 1) | (1 << 5);
  82. #endif
  83. #if (Fcco / Fcclk) == 8
  84.     PLLCFG = ((Fcclk / Fosc) - 1) | (2 << 5);
  85. #endif
  86. #if (Fcco / Fcclk) == 16
  87.     PLLCFG = ((Fcclk / Fosc) - 1) | (3 << 5);
  88. #endif
  89.     PLLFEED = 0xaa;
  90.     PLLFEED = 0x55;
  91.     while((PLLSTAT & (1 << 10)) == 0);
  92.     PLLCON = 3;
  93.     PLLFEED = 0xaa;
  94.     PLLFEED = 0x55;
  95. */  
  96.    
  97.     /* 設(shè)置存儲(chǔ)器加速模塊 */
  98.     MAMCR = 2;                //MAMCR 8u2 00-MAM 功能被禁止、01-MAM功能部分使能、10-MAM功能完全使能
  99.     /* MAMTIM 8u3
  100.     000=0-保留
  101.     001=1-一段時(shí)間內(nèi)只有 1 個(gè)處理器時(shí)鐘(cclk)用于 MAM 取指。
  102.     010=2-一段時(shí)間內(nèi)只有2個(gè)處理器時(shí)鐘(cclk)用于MAM取指。
  103.     011=3-一段時(shí)間內(nèi)只有 3 個(gè)處理器時(shí)鐘(cclk)用于 MAM 取指。
  104.     100=4-一段時(shí)間內(nèi)只有4個(gè)處理器時(shí)鐘(cclk)用于 MAM 取指。
  105.     101=5-一段時(shí)間內(nèi)只有5 個(gè)處理器時(shí)鐘(cclk)用于 MAM 取指。
  106.     110=6-一段時(shí)間內(nèi)只有 6 個(gè)處理器時(shí)鐘(cclk)用于 MAM 取指。
  107.     111=7-一段時(shí)間內(nèi)只有7個(gè)處理器時(shí)鐘(cclk)用于 MAM 取指。
  108.      */
  109. #if Fcclk < 20000000
  110.     MAMTIM = 1;
  111. #else
  112. #if Fcclk < 40000000
  113.     MAMTIM = 2;
  114. #else
  115.     MAMTIM = 3;
  116. #endif
  117. #endif
  118.       
  119.     /* 初始化VIC */
  120.     VICIntEnClr = 0xffffffff;//清所有中斷使能,即關(guān)中斷
  121.     VICVectAddr = 0;//默認(rèn)向量地址寄存器
  122.     VICIntSelect = 0;//1:對(duì)應(yīng)的中斷請(qǐng)求分配為FIQ。0:對(duì)應(yīng)的中斷請(qǐng)求分配為IRQ。

  123.     /* 添加自己的代碼 */

  124. }

  125. /*********************************************************************************************************
  126. **                            End Of File
  127. ********************************************************************************************************/
復(fù)制代碼

所有資料51hei提供下載:
LCD1024X1024.rar (229.75 KB, 下載次數(shù): 21)

評(píng)分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:409262 發(fā)表于 2018-10-16 21:15 | 只看該作者
樓主威武,下載學(xué)習(xí)哈!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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