久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4476|回復: 1
打印 上一主題 下一主題
收起左側

[原創]開源ARM7驅動拼接1024X1024LCD屏Proteus仿真源碼 多年前設計的

[復制鏈接]
跳轉到指定樓層
樓主
在當年還沒有人嘗試過用多塊LCD拼接成大屏幕的仿真程序,采用ARM7驅動,希望多交流。

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


單片機源程序如下:
  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. …………限于本文篇幅 余下代碼請從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        /* 光標位置設置(只有設置到有效顯示地址并打開顯示時才看到) */
  29. #define  LCD_CGR_POS                0x22        /* CGRAM偏置地址設置(可以增加自已的符號) */
  30. #define  LCD_ADR_POS                0x24        /* 地址指針位置(設置讀寫操作指針) */

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

  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        /* 顯示開關:D0=1/0,光標閃爍啟用/禁用 */
  40.                                                                         /*                          D1=1/0,光標顯示啟用/禁用 */
  41.                                                                         /*                         D2=1/0,文本顯示啟用/禁用(打開后再使用) */
  42.                                                                         /*                         D3=1/0,圖形顯示啟用/禁用(打開后再使用) */
  43.                                                                                                                
  44. #define  LCD_CUR_SHP                0xA0        /* 光標形狀選擇:0xA0-0xA7表示光標占的行數 */

  45. #define  LCD_AUT_WR                        0xB0        /* 自動寫設置 */
  46. #define  LCD_AUT_RD                        0xB1        /* 自動讀設置 */
  47. #define  LCD_AUT_OVR                0xB2        /* 自動讀/寫結束 */

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

  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);                                                // 自動寫
  126.    for(i=0;i<240*128;i++)
  127.    {  
  128.    LCD_Write_Data(dat);
  129.    }
  130.    LCD_Write_Command(LCD_AUT_OVR);                                                // 自動寫結束
  131.    LCD_Write_Command3(LCD_ADR_POS,0x00,0x00);                        // 重置地址指針
  132. }

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

  135.    /* 找出目標地址 */
  136.    addr = y*(256>>3) + (x>>3);
  137.    LCD_Write_Command3(LCD_ADR_POS, addr&0xFF, addr>>8);        // 置地址指針
  138.    
  139.    /* 輸出數據 */
  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. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
  1. /**--------------文件信息--------------------------------------------------------------------------------
  2. **文   件   名: target.c
  3. **描        述: lpc210x(飛利浦的ARM)目標板特殊的代碼,包括異常處理程序和目標板初始化程序
  4. **              每個工程應當具有這個文件的拷貝,用戶根據程序的需要修改本文件。
  5. **注        意:本文件必須以ARM(32位代碼)方式編譯,否則,必須更改init.s和vector.s文件
  6. **              別的C代碼不必使用ARM(32位代碼)方式編譯
  7. ********************************************************************************************************/

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

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

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

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

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

  66.     /* 設置系統各部分時鐘 */
  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.     /* 設置存儲器加速模塊 */
  98.     MAMCR = 2;                //MAMCR 8u2 00-MAM 功能被禁止、01-MAM功能部分使能、10-MAM功能完全使能
  99.     /* MAMTIM 8u3
  100.     000=0-保留
  101.     001=1-一段時間內只有 1 個處理器時鐘(cclk)用于 MAM 取指。
  102.     010=2-一段時間內只有2個處理器時鐘(cclk)用于MAM取指。
  103.     011=3-一段時間內只有 3 個處理器時鐘(cclk)用于 MAM 取指。
  104.     100=4-一段時間內只有4個處理器時鐘(cclk)用于 MAM 取指。
  105.     101=5-一段時間內只有5 個處理器時鐘(cclk)用于 MAM 取指。
  106.     110=6-一段時間內只有 6 個處理器時鐘(cclk)用于 MAM 取指。
  107.     111=7-一段時間內只有7個處理器時鐘(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;//清所有中斷使能,即關中斷
  121.     VICVectAddr = 0;//默認向量地址寄存器
  122.     VICIntSelect = 0;//1:對應的中斷請求分配為FIQ。0:對應的中斷請求分配為IRQ。

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

  124. }

  125. /*********************************************************************************************************
  126. **                            End Of File
  127. ********************************************************************************************************/
復制代碼

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

評分

參與人數 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:409262 發表于 2018-10-16 21:15 | 只看該作者
樓主威武,下載學習哈!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕在线网 | 久久亚洲国产精品日日av夜夜 | 中文字幕在线观看 | 黄视频国产 | 天天操狠狠操 | 欧美一区二区三区四区视频 | 成人在线中文字幕 | 亚洲精品亚洲人成人网 | 91精品久久久 | 天天操天天射综合网 | 九九热这里只有精品6 | 国际精品鲁一鲁一区二区小说 | 亚洲国产精品一区 | 久久免费高清视频 | 二区高清 | 欧美成人一区二免费视频软件 | 成人国产精品久久久 | 欧美一级片a | 99热热精品 | 亚洲人在线 | 国产亚洲精品久久久久动 | 一区日韩 | 欧美啪啪 | 国产一区免费视频 | 国产一区二区三区免费观看视频 | 欧美福利 | 四虎影院在线播放 | 国产91丝袜在线播放 | 中文精品视频 | av官网在线 | 亚洲一区二区三区四区五区午夜 | 欧美一区二区视频 | 亚洲精品久久久久久久久久久久久 | 国产人久久人人人人爽 | 成人动漫视频网站 | 色天堂影院 | www.色53色.com | 97久久超碰| 天天弄| 午夜影院视频 | 人人种亚洲 |