找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1059|回复: 13
收起左侧

请教关于51单片机驱动RGB接口屏

[复制链接]
ID:1010435 发表于 2024-4-3 23:53 | 显示全部楼层 |阅读模式
一直想用51单片机驱动RGB接口的屏,自己啃英文时序写的,单片机用STC8H8K64U,屏幕是480*272分辨率的RGB接口屏,网上说用DE模式驱动比较简单,麻烦看下我这个程序时序哪有问题,不考虑刷屏速度,就单纯显示个红色。现在是什么都不显示,纯白,就背光亮,给背光直接接的24V,单片机用的3.3V
1.png

2.png

3.png

4.png

单片机源程序如下:
  1. #include <STC8H.H>
  2. #include "IO_int.H"

  3. #define rrr  P2                //R0~7 在P2口
  4. #define ggg  P0                //G0~7 在P0口
  5. #define bbb  P7                //B0~7 在P7口

  6. #define        wide        480                //有效行
  7. #define        high        272                //有效列
  8. #define        hbp                41+2        //行前沿
  9. #define        hfp                2                //行后沿
  10. #define        vbp                8+2                //列前沿
  11. #define        vfp                2                //列后沿

  12. sbit dclk        =        P1^4;
  13. sbit disp        =        P1^5;                //屏幕开关 高电平有效
  14. sbit hsync        =        P1^6;
  15. sbit vsync        =        P1^7;
  16. sbit de                =        P1^3;                //高电平有效

  17. //DE模式驱动  频率设置48MHz


  18. void main()
  19. {
  20.         unsigned int i,j;        
  21.         
  22.         IO_int();        //初始化所有IO端口

  23.         P0DR = 0;    P0SR = 0x00;         //设置针脚转换速度 快速
  24.         P2DR = 0;    P2SR = 0x00;         //设置针脚转换速度 快速
  25.         P7DR = 0;    P7SR = 0x00;         //设置针脚转换速度 快速
  26.         P1DR = 0;    P1SR = 0x07;        //设置针脚转换速度 快速

  27.         disp=0;        //关显示

  28.         hsync=1;
  29.         vsync=1;

  30.         disp=1;        //开显示

  31.         de=0;

  32.     while (1)
  33.     {
  34. //上部不显示区域
  35.         for(j=0;j<vbp;j++)
  36.         {
  37.                 for(i=0;i<hbp;i++)
  38.                 {
  39.                         de=0;
  40.                         rrr=0;
  41.                         ggg=0;
  42.                         bbb=0;
  43.                         dclk=0;
  44.                         dclk=1;
  45.                 }

  46.                 for(i=0;i<wide;i++)
  47.                 {
  48.                         de=0;
  49.                         rrr=0;
  50.                         ggg=0;
  51.                         bbb=0;
  52.                         dclk=0;
  53.                         dclk=1;
  54.                 }
  55.                 for(i=0;i<hfp;i++)
  56.                 {
  57.                         de=0;
  58.                         rrr=0;
  59.                         ggg=0;
  60.                         bbb=0;
  61.                         dclk=0;
  62.                         dclk=1;
  63.                 }
  64.         }        
  65. //中间272可显示区域
  66.         for(j=0;j<high;j++)
  67.         {
  68.                 for(i=0;i<hbp;i++)
  69.                 {
  70.                         de=0;
  71.                         rrr=0;
  72.                         ggg=0;
  73.                         bbb=0;
  74.                         dclk=0;
  75.                         dclk=1;
  76.                 }

  77.                 for(i=0;i<wide;i++)
  78.                 {
  79.                         de=1;
  80.                         rrr=0xff;
  81.                         ggg=0;
  82.                         bbb=0;
  83.                         dclk=0;
  84.                         dclk=1;
  85.                 }
  86.                 for(i=0;i<hfp;i++)
  87.                 {
  88.                         de=0;
  89.                         rrr=0;
  90.                         ggg=0;
  91.                         bbb=0;
  92.                         dclk=0;
  93.                         dclk=1;
  94.                 }
  95.         }
  96. //下部不显示区域        
  97.         for(j=0;j<vfp;j++)
  98.         {
  99.                 for(i=0;i<hbp;i++)
  100.                 {
  101.                         de=0;
  102.                         rrr=0;
  103.                         ggg=0;
  104.                         bbb=0;
  105.                         dclk=0;
  106.                         dclk=1;
  107.                 }

  108.                 for(i=0;i<wide;i++)
  109.                 {
  110.                         de=0;
  111.                         rrr=0;
  112.                         ggg=0;
  113.                         bbb=0;
  114.                         dclk=0;
  115.                         dclk=1;
  116.                 }
  117.                 for(i=0;i<hfp;i++)
  118.                 {
  119.                         de=0;
  120.                         rrr=0;
  121.                         ggg=0;
  122.                         bbb=0;
  123.                         dclk=0;
  124.                         dclk=1;
  125.                 }
  126.         }               
  127.                
  128.     }
  129. }

复制代码

还是我压根就没有看懂这个时序图
回复

使用道具 举报

ID:73992 发表于 2024-4-5 00:12 | 显示全部楼层
我看你没有程序控制时间,
        for(i=0;i<hbp;i++)
                {
                        de=0;
                        rrr=0;
                        ggg=0;
                        bbb=0;
                        dclk=0;
                        dclk=1;
                }
我复制的这部分,一个循环时间应该等于一个dclk高低电平宽度。程序中dclk刚等于0 就等于1; 导致程序高电平时间 与低电平不一致。调整这个时序,用示波器 或者逻辑分析仪可以增加调试效率。
回复

使用道具 举报

ID:1101997 发表于 2024-4-5 14:26 | 显示全部楼层
51干这活有些困难,需要专门的驱动来做这是,毕竟引脚时间还是缓存都是严重不足的。
回复

使用道具 举报

ID:1101997 发表于 2024-4-5 14:28 | 显示全部楼层
一页缓存需要480*272=130.560K (word),8H8K也就是8K字节,差距甚远,换片子吧
回复

使用道具 举报

ID:517951 发表于 2024-4-5 15:28 | 显示全部楼层
51单片机驱动RGB接口的4.3寸TFT, r,g,b就需要3x8=24个IO口, pclk引脚需要9Mhz的信号,不适合.
可以用SSD1963来转换MCU16bit到RGB接口, 不仅可以驱动4.3寸480x272,也可以驱动800x480的RGB接口.
也可以用STM32H743来驱动, 此芯片自带RGB接口, 不用转换IC了.
回复

使用道具 举报

ID:1010435 发表于 2024-4-5 16:23 | 显示全部楼层
nearsea 发表于 2024-4-5 14:26
51干这活有些困难,需要专门的驱动来做这是,毕竟引脚时间还是缓存都是严重不足的。

我就是不太清楚引脚时间是怎么算的,看手册,io的反转最慢也12m,最快25m,而屏看手册需要9m就够了啊
回复

使用道具 举报

ID:1010435 发表于 2024-4-5 16:26 | 显示全部楼层
lyonkon 发表于 2024-4-5 00:12
我看你没有程序控制时间,
        for(i=0;i

你的意思是dclk 0和dclk=1的时间必须一致吗?能不能给个简单的时间控制函数
回复

使用道具 举报

ID:1010435 发表于 2024-4-5 16:29 | 显示全部楼层
rayin 发表于 2024-4-5 15:28
51单片机驱动RGB接口的4.3寸TFT, r,g,b就需要3x8=24个IO口, pclk引脚需要9Mhz的信号,不适合.
可以用SSD19 ...

你好 我就是这个9m信号和mcu频率算不来,是不是说,不管cpu在干嘛,pclk的高低反转必须在5~12m之间才行?
回复

使用道具 举报

ID:73992 发表于 2024-4-5 23:16 | 显示全部楼层
mtt661 发表于 2024-4-5 16:26
你的意思是dclk 0和dclk=1的时间必须一致吗?能不能给个简单的时间控制函数

如果你有设备可以测量上述时钟输出,如果频率够就可以使用。如果频率不够试试嵌入汇编。看看你的方案是否可行。
     不然    dclk可以用pwm输出;如果频率够
  while(1)
   {
      DE电平拉低    时间=tvbp — H BACK PORECH ,
     for   (下面循环270次)
           {
                    nop  ;=H BACK PORECH     ;相当于延时
                    DE=1
                    rgb     引脚抖动 / 取值480次;  可增减
                    DE=0
                    nop   ; =H FRONT PORECH        ;相当于延时
             }
            DE电平拉低    时间=tvfp — H FRONT PORECH,
        }
这是我的大概思路,
回复

使用道具 举报

ID:883242 发表于 2024-4-6 14:10 | 显示全部楼层
DCLK周期最多只能有200ns,用51单片机根本做不到,就别痴心妄想了。
回复

使用道具 举报

ID:1010435 发表于 2024-4-7 11:19 | 显示全部楼层
Hephaestus 发表于 2024-4-6 14:10
DCLK周期最多只能有200ns,用51单片机根本做不到,就别痴心妄想了。

你好 ,按照手册的说法 这个IO的翻转速度可以达到12MHz,也就是83.3333ns,速度是可以达到的啊,不知道我这个算法对不对
回复

使用道具 举报

ID:1010435 发表于 2024-4-7 11:22 | 显示全部楼层
nearsea 发表于 2024-4-5 14:28
一页缓存需要480*272=130.560K (word),8H8K也就是8K字节,差距甚远,换片子吧

这个我也知道 所以我就想只显示一个颜色,主要是学习下这个时序。
回复

使用道具 举报

ID:517951 发表于 2024-4-7 11:53 | 显示全部楼层
mtt661 发表于 2024-4-7 11:22
这个我也知道 所以我就想只显示一个颜色,主要是学习下这个时序。

如果只是显示红色, 可以吧显示屏的R0-7全部接高, B0-7,G0-7接GND. 就关注V,Hsync, Den, CLK的时序就行. 这个需要有示波器.  最好还是用SSD1963来直接驱动,不要用单片机直接点, 没有意义. 如果是想搞清楚时序, 建议用FPGA来做, 这个真不是单片机干的活.
回复

使用道具 举报

ID:883242 发表于 2024-4-7 13:48 | 显示全部楼层
mtt661 发表于 2024-4-7 11:19
你好 ,按照手册的说法 这个IO的翻转速度可以达到12MHz,也就是83.3333ns,速度是可以达到的啊,不知道我 ...

如果只是DCLK翻转当然够用,但是你看时序图,DCLK翻转前你要把RGB都设置成正常值,这是51单片机无论如何都做不到的。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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