找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1130|回复: 3
收起左侧

单片机64x128LED点阵屏显示不完整的问题

[复制链接]
ID:284453 发表于 2023-6-3 11:35 | 显示全部楼层 |阅读模式
大家好。我有一块64x128LED全彩点阵屏,HUB75E接口,可以显示4排每排8个16x16的汉字。
用STC8H3K64S单片机核心板,在网上搜了一个32x64的LED屏代码。
添加一下行扫描(原本是16扫,改成32扫),屏点亮,显示两幅相同画面,右幅比左幅整个要上移一行,如图1。
继续修改其它参数,第1和3排可以完整显示,第2和4排只显示上8行,下8行被条纹覆盖。如图2。
如果让主程序只运行Timer1_Init()和DZ64X32_Write_Buffer(),点阵屏第2和第4组下8行出现条纹,如图3
源代码附上,修改过的地方已经标注出来了。
向大家请教,这个代码怎样修改才能完美点亮这块64x128的屏。先谢谢了。

单片机源程序如下:
  1. #include <stc8h.h>
  2. #include <intrins.h>
  3. #define FOSC 22118400L
  4. #define BAUD  38400
  5. #define     uint    unsigned int
  6. #define     uchar   unsigned char

  7. //HUB75引脚
  8. sbit        R0      =   P0^0;    sbit        G0      =   P1^0;
  9. sbit        B0      =   P0^1;    //接地
  10. sbit        R1      =   P0^2;                 sbit        G1      =   P1^1;
  11. sbit        B1      =   P0^3;    sbit        HC_138E =   P1^2;
  12. sbit        HC_138A =   P0^4;    sbit        HC_138B =   P1^6;
  13. sbit        HC_138C =   P0^5;    sbit        HC_138D =   P1^7;
  14. sbit        RGB_CLK =   P0^6;    sbit        LE      =   P2^0;//LAT
  15. sbit        OE      =   P0^7;    //接地


  16. void DZ64X32_Write_Buffer();
  17. void SM16126_Send_Data();
  18. void HC138_Sel(uchar hang);
  19. void LED_Tu(uchar x,uchar y,uchar num,uchar Background);
  20. uchar code Tu_16X16[][32];                   //***********************************
  21. #define T10MS12T (65536-FOSC/12/3000)//967   //原值1000,画面闪动,改成3000就稳定了
  22. #define T1MS12T  (65536-FOSC/12/1000)        //************************************
  23. void Timer1_Init()//主刷新定时器
  24. {
  25.         TL0 = T10MS12T;               
  26.         TH0 = T10MS12T>>8;
  27.     TR0 = 1;                                    
  28.     ET0 = 1;
  29. }
  30. void TM1_Rountine(void) interrupt 1
  31. {
  32.                         SM16126_Send_Data();                        
  33. }

  34. void HC138_Sel(uchar hang)//hang 选择
  35. {
  36.         HC_138A=hang&0x01;
  37.         HC_138B=hang&0x02;
  38.         HC_138C=hang&0x04;
  39.         HC_138D=hang&0x08;//***********************************
  40.         HC_138E=hang&0x10;//改成32扫
  41. }                   //******************************************

  42. //数据存储方式,因为汉字需要左右滚动,所以上下两16行存储在同一Byte
  43. #define C_0          0
  44. #define C_R          0x09
  45. #define C_G                0x0A
  46. #define C_B         0x0C
  47. #define C_RG        0x0B
  48. #define C_RB        0x0D
  49. #define C_GB        0x0E
  50. #define C_RGB        0x0F

  51. uchar bdata dat;
  52. /*
  53. 0 1 2 3 4 5 6 7
  54. R G B L R G B H
  55. L存储是否点亮,R,G,B存储值
  56. 一个点需要4bit,一共是32*64*4=32*32Byte
  57. */
  58. sbit dat_RL=dat^0;
  59. sbit dat_GL=dat^1;
  60. sbit dat_BL=dat^2;
  61. sbit dat_LL=dat^3;

  62. sbit dat_RH=dat^4;
  63. sbit dat_GH=dat^5;
  64. sbit dat_BH=dat^6;
  65. sbit dat_LH=dat^7;

  66. uchar Point_color;//取值范围0,9-15,同时//********************************************************
  67. uchar xdata RGB_DZ64X32_Buffer[32][128];//原值为32和64;点亮64x128点阵屏
  68.                                         //显示分左右两相同内容,右边内容上移壹行。如图1.
  69. void DZ64X32_Write_Buffer()             //改成32和128时,第2和第4排的上部8行显示正常,
  70. {                                       //下8行位置被条纹覆盖,如图2.
  71.         uchar i,j;                            //*******************************************************
  72.         for(i=0;i<32;i++)
  73.         {
  74.                 for(j=0;j<128;j++)
  75.                 {
  76.                         RGB_DZ64X32_Buffer[i][j]=0x00;
  77.                 }
  78.         }
  79. }

  80. void SM16126_Send_Data()
  81. {
  82.         uchar i;
  83.         static uchar hang;
  84.         
  85.         RGB_CLK=0;//低电平
  86.         LE=1;//允许数据,
  87.         OE=1;//失效,不亮
  88.                                    //****************************************
  89.         for(i=0;i<128;i++)         //64列是原值,改成128列  
  90.         {                                                                                       //****************************************
  91.                 dat=RGB_DZ64X32_Buffer[hang][i];//取出数据
  92.                 RGB_CLK=0;
  93.                 //---上半屏
  94.                 if(dat_LL)//有数据
  95.                 {
  96.                         R0=dat_RL;
  97.                         G0=dat_GL;
  98.                         B0=dat_BL;
  99.            }
  100.         
  101.                  else//没有数据
  102.                 {
  103.                         R0=0;
  104.                         G0=0;
  105.                         B0=0;
  106.                 }
  107.                 //---下半屏
  108.                 if(dat_LH)//有数据
  109.                 {
  110.                         R1=dat_RH;
  111.                         G1=dat_GH;
  112.                         B1=dat_BH;
  113.           }
  114.                
  115.                 else//没有数据
  116.                 {
  117.                         R1=0;
  118.                         G1=0;
  119.                         B1=0;
  120.                 }
  121.                 RGB_CLK=1;//上升沿数据吸收
  122.         }
  123.         
  124.         LE=0;//禁止输入
  125.         HC138_Sel(hang);//行选
  126.   hang++;          //*************************************
  127.         hang&=0x1f;      //原值是0x0f,0~15 16行;改成0x1f,0~31 32行
  128.         OE=0;//点亮      //***************************************
  129. }

  130. void DZRGB_DrawPoint(uchar x,uchar y)
  131. {
  132.         uchar da,db;
  133.         if(Point_color)//有亮度
  134.         {
  135.                 if(y>=32)//在高位  //************************************
  136.                 {                  //原值16,改成32
  137.                         y-=32;           //**************************************
  138.                         da=Point_color<<=4;//移动到高位
  139.                         
  140.                         db=RGB_DZ64X32_Buffer[y][x];//取出数据
  141.                         db&=0X0F;//清除高位00001111
  142.                
  143.                         RGB_DZ64X32_Buffer[y][x]=db+da;
  144.                 }
  145.                 else//在低位
  146.                 {
  147.                         db=RGB_DZ64X32_Buffer[y][x];//取出数据
  148.                         db&=0XF0;//清除低位 11110000
  149.                
  150.                         RGB_DZ64X32_Buffer[y][x]=db+Point_color;
  151.                 }
  152.         }
  153.         else//没有亮度
  154.         {
  155.                 if(y>=32)//在高位
  156.                 {
  157.                         y-=32;
  158.                         RGB_DZ64X32_Buffer[y][x]&=0x7F;//01111111
  159.                 }
  160.                 else
  161.                 {
  162.                         RGB_DZ64X32_Buffer[y][x]&=0xE7;//11100111
  163.                 }
  164.         }
  165. }

  166. uchar code er[8]={1,2,4,8,16,32,64,128};
  167. void LED_Tu(uchar x,uchar y,uchar num,uchar Background)
  168. {
  169.         uchar i,j;
  170.         uchar Point_color_Save;
  171.         Point_color_Save=Point_color;//保存颜色

  172.         for(j=0;j<16;j++)//16列
  173.         {
  174.                 for(i=0;i<8;i++)//前8行
  175.                 {
  176.                         if(Tu_16X16[num][j]&er[i])
  177.                         {
  178.                                 Point_color=Point_color_Save;
  179.                         }
  180.                         else
  181.                         {
  182.                                 Point_color=Background;
  183.                         }
  184.                         DZRGB_DrawPoint(x+j,y+i);        
  185.                 }
  186.         }
  187.         for(j=0;j<16;j++)//16列
  188.         {
  189.                 for(i=0;i<8;i++)//后8行
  190.                 {
  191.                         if(Tu_16X16[num][j+16]&er[i])
  192.                         {
  193.                                 Point_color=Point_color_Save;
  194.                         }
  195.                         else
  196.                         {
  197.                                 Point_color=Background;
  198.                         }
  199.                         DZRGB_DrawPoint(x+j,y+8+i);        
  200.                 }
  201.         }
  202.         Point_color=Point_color_Save;
  203. }

  204. void main()
  205. {
  206.         P2M0=0x00;P2M1=0X00;
  207.         P1M0=0X00;P1M1=0X00;
  208.         P0M0=0X00;P0M1=0X00;
  209.                                                                                                                                 //*******************************************
  210.         Timer1_Init();                                                                //主程序只运行Timer1_Init();DZ64X32_Write_Buffer();        .
  211.   DZ64X32_Write_Buffer();                        //点阵屏第2和第4组下8行出现条纹,如图3
  212.                                       //*******************************************
  213. //        Point_color=C_R;
  214. //        LED_Tu(0,0,1,C_0);LED_Tu(48,0,5,C_0);
  215. //        LED_Tu(0,16,2,C_0);LED_Tu(48,16,10,C_0);

  216. //        Point_color=C_G;
  217. //        LED_Tu(0,32,3,C_0);LED_Tu(48,32,7,C_0);
  218. //        LED_Tu(0,48,4,C_0);LED_Tu(48,48,8,C_0);
  219.         
  220.         EA=1;       //打开总中断

  221.         while(1)
  222.         {        
  223.                  
  224.         }
  225. }


  226. uchar code Tu_16X16[][32]={ //阴码 顺向 行列扫描

  227.         0x10,0x0C,0x05,0x55,0x55,0x55,0x85,0x7F,0x85,0x55,0x55,0x55,0x05,0x14,0x0C,0x00,
  228. 0x04,0x04,0x02,0x0A,0x09,0x29,0x2A,0x4C,0x48,0xA9,0x19,0x02,0x02,0x04,0x04,0x00, //"零",0
  229. 0x00,0xC4,0x44,0x54,0x54,0x54,0x54,0x5F,0x54,0x54,0x54,0x54,0x44,0x44,0xC0,0x00,
  230. 0x81,0x80,0x80,0x9D,0xB5,0xD5,0x95,0x95,0x95,0xD5,0xB5,0x9D,0x80,0x81,0x80,0x00, //"壹",1
  231. 0x04,0x44,0x54,0x54,0x54,0x54,0x54,0x54,0x54,0x04,0xFF,0x04,0x05,0x06,0x04,0x00,
  232. 0x00,0x80,0x9F,0x41,0x21,0x1D,0x21,0x41,0x9F,0x00,0x01,0x0E,0x30,0x40,0xF0,0x00, //"贰",2
  233. 0x00,0x20,0x20,0xA8,0x6C,0x2A,0x39,0x28,0x28,0x2A,0x6C,0xA8,0x20,0x20,0x00,0x00,
  234. 0x02,0x02,0x41,0x40,0x48,0x49,0x49,0x49,0x49,0x49,0x48,0x40,0x41,0x02,0x02,0x00, //"叁",3
  235. 0x00,0x00,0xFE,0x92,0x92,0x92,0x02,0x10,0x54,0x54,0xFF,0x54,0x54,0x7C,0x10,0x00,
  236. 0x44,0xE4,0x5F,0x44,0x44,0x54,0xE4,0x12,0x12,0x12,0xFF,0x12,0x12,0x12,0x10,0x00, //"肆",4
  237. 0x00,0x80,0x60,0xF8,0x07,0x00,0x42,0x42,0xC2,0x7E,0x42,0x42,0xC2,0x02,0x00,0x00,
  238. 0x01,0x00,0x00,0xFF,0x00,0x40,0x40,0x78,0x47,0x40,0x40,0x40,0x7F,0x40,0x40,0x00, //"伍",5
  239. 0x00,0xFE,0x02,0x22,0xDA,0x06,0x80,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x80,0x00,
  240. 0x00,0xFF,0x08,0x10,0x08,0x07,0x00,0x7C,0x40,0x40,0x7F,0x40,0x40,0xFC,0x00,0x00, //"陆",6
  241. 0x00,0x88,0x91,0x42,0x20,0x08,0x08,0x08,0x7F,0x88,0x88,0x84,0x84,0xE4,0x00,0x00,
  242. 0x44,0x44,0x25,0x24,0x14,0x0C,0x04,0xFF,0x04,0x0C,0x14,0x24,0x24,0x44,0x44,0x00, //"柒",7
  243. 0x10,0x10,0xFF,0x10,0x90,0x3E,0xE2,0x22,0x22,0x3E,0x00,0xF8,0x00,0xFF,0x00,0x00,
  244. 0x42,0x82,0x7F,0x81,0x40,0x31,0x0F,0x41,0x81,0x7F,0x00,0x4F,0x80,0x7F,0x00,0x00, //"捌",8
  245. 0x04,0x44,0x44,0xFC,0x44,0x44,0x80,0x70,0x0F,0x08,0x08,0xC8,0x38,0x00,0x00,0x00,
  246. 0x10,0x30,0x10,0x0F,0x08,0x88,0x40,0x20,0x10,0x0C,0x03,0x0C,0x30,0x40,0x80,0x00, //"玖",9
  247. 0x10,0x10,0x10,0xFF,0x10,0x90,0x20,0x50,0x48,0x44,0x43,0x44,0x48,0x50,0x20,0x00,
  248. 0x04,0x44,0x82,0x7F,0x01,0x00,0x00,0xFE,0x42,0x42,0x42,0x42,0x42,0xFE,0x00,0x00, //"拾",10        
  249.         

  250. };
复制代码


51hei图片1.jpg
51hei图片2.jpg
51hei图片3.jpg
回复

使用道具 举报

ID:123289 发表于 2023-6-5 13:47 | 显示全部楼层
先弄清硬件原理、扫描显示原理。再按照原理写程序。
回复

使用道具 举报

ID:161164 发表于 2023-6-5 16:06 | 显示全部楼层
75行 xdata 32x128 = 4096 >> 4k
2023-06-05_160430.png

回复

使用道具 举报

ID:284453 发表于 2023-6-5 20:27 | 显示全部楼层
lkc8210 发表于 2023-6-5 16:06
75行 xdata 32x128 = 4096 >> 4k

谢谢指出错误之处。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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