找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3631|回复: 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 单片机教程网

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