找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3000|回复: 1
收起左侧

贡献一个8*8点阵的代码,通过单片机io脚直连,比较适合初学者

[复制链接]
ID:504669 发表于 2019-4-4 11:04 | 显示全部楼层 |阅读模式
贡献一个8*8的点阵控制代码,比较合适初学者掌握点阵的控制原理。

点阵连接方式很简单,P0接行信号,P2接列信号,可以高位在前,也可以高位在后,主意编码的方式。

硬件电路图,P0直接接行信号,P2直接接列信号,高位在前。

硬件电路图,P0直接接行信号,P2直接接列信号,高位在前。

硬件电路图,P0直接接行信号,P2直接接列信号,高位在前。


编码方式

编码方式

编码方式

单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. void delay1ms(unsigned char c)   //误差 0us
  4. {
  5.     unsigned char a,b;
  6.     for(c;c>0;c--)
  7.         for(b=142;b>0;b--)
  8.             for(a=2;a>0;a--);
  9. }

  10. unsigned char code taba[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //纵条表
  11. unsigned char code tabb[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //衡条表


  12. //unsigned char code a[]={0x18,0x24,0x24,0x42,0x7E,0x42,0x42,0x81};
  13. unsigned char code a[] = {0xE7,0xDB,0xDB,0xBD,0x81,0xBD,0xBD,0x7E};
  14. #if 0
  15. unsigned char number[]= {
  16. 0xFF,0x9F,0xBF,0xBF,0xBF,0xBF,0x1F,0xFF,/*"1",0*/
  17. 0xFF,0xC3,0xDB,0xDF,0xEF,0xF7,0xFB,0xC3,/*"2",1*/
  18. 0xFF,0xC3,0xDB,0xE7,0xDF,0xDF,0xDB,0xE3,/*"3",2*/
  19. 0xFF,0xDF,0xCF,0xD7,0xDB,0xDB,0xC7,0xDF,/*"4",3*/
  20. 0xFF,0xC3,0xFB,0xE3,0xDF,0xDF,0xDB,0xE3,/*"5",4*/
  21. 0xFF,0xE7,0xFB,0xFB,0xC3,0xDB,0xDB,0xE7,/*"6",5*/
  22. 0xFF,0xC3,0xEF,0xEF,0xF7,0xF7,0xF7,0xF7,/*"7",6*/
  23. 0xFF,0xC7,0xDB,0xDB,0xE7,0xDB,0xDB,0xE7,/*"8",7*/
  24. 0xFF,0xE7,0xDB,0xDB,0xC3,0xDF,0xDF,0xE7,/*"9",8*/
  25. 0xFF,0xE7,0xDB,0xDB,0xDB,0xDB,0xDB,0xE7/*"0",9*/};
  26. #endif

  27. #if 0                //高位在后
  28. unsigned char chara[6][8]={
  29. {0xFF,0xFF,0xF7,0xEB,0xED,0xC1,0x9C,0xFF},/*"A",0*/
  30. {0xFF,0xFF,0xC1,0xDD,0xE1,0xDD,0xC1,0xFF},/*"B",1*/
  31. {0xFF,0xFF,0x83,0xF9,0xFD,0xB9,0x83,0xFF},/*"C",2*/
  32. {0xFF,0xFF,0xE1,0xDD,0xDD,0xCD,0xE1,0xFF},/*"D",3*/
  33. {0xFF,0xFF,0xC1,0xFD,0xE1,0xFD,0xC1,0xFF},/*"E",4*/
  34. {0xFF,0xFF,0xC1,0xFD,0xE1,0xFD,0xFD,0xFF},/*"F",5*/
  35. };
  36. #endif
  37. #if 1 //高位在前
  38. unsigned char chara[6][8]={
  39. {0xFF,0xFF,0xEF,0xD7,0xB7,0x83,0x39,0xFF},/*"A",0*/
  40. {0xFF,0xFF,0x83,0xBB,0x87,0xBB,0x83,0xFF},/*"B",1*/
  41. {0xFF,0xFF,0xC1,0x9F,0xBF,0x9D,0xC1,0xFF},/*"C",2*/
  42. {0xFF,0xFF,0x87,0xBB,0xBB,0xB3,0x87,0xFF},/*"D",3*/
  43. {0xFF,0xFF,0x83,0xBF,0x87,0xBF,0x83,0xFF},/*"E",4*/
  44. {0xFF,0xFF,0x83,0xBF,0x87,0xBF,0xBF,0xFF},/*"F",5*/
  45. };
  46. unsigned char temp[] = {0,0x01,0x3,0x7,0xF,0x1F,0x3F,0x7F,0xFF};
  47. unsigned char temp2[] = {0xFF,0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80};
  48. void  main()
  49. {
  50.         unsigned char i,j,k,z;

  51.         P0 = 1;
  52.         P2 = 0xFE;
  53. #if 1
  54. //向左移动字符A
  55.         while(1){
  56.         
  57.         for(k=0;k<16;k++)        
  58.            for(j=0;j<30;j++)
  59.                  for(i=0;i<8;i++){
  60.                         P0 = tabb[i];
  61.                         if(k<=7)
  62.                                 P2 = a[i]>>(8-k) | temp2[k] ;//屏蔽左边没有数据的位
  63.                         else
  64.                                 P2 = ( a[i]<< (k-8) ) | temp[k-8] ;        //屏蔽右边移出来的空位,补一,否则右边会亮
  65.                         delay1ms(2);
  66.                 }
  67.         }
  68. #endif

  69. #if 0
  70.         //向左移动所有字符
  71.         while(1)
  72.         {
  73.                 for(z=0;z<6;z++)
  74.                 {
  75.                         for(j=0;j<8;j++)                //在可见视窗内,只能显示8列数据,
  76.                         {
  77.                                 for(k=0;k<10;k++)       //每一帧数据要显示一定时间,否则看不到要显示的内容
  78.                                         for(i=0;i<8;i++)        //显示一帧,每一帧数据由8行组成
  79.                                         {
  80.                                                 P0 = tabb[i];
  81.                                                 if(z == 5)
  82.                                                         P2 = chara[z][i] << j;
  83.                                                 else                                                
  84.                                                         P2 = chara[z][i] << j | (chara[z+1][i] >> (8-j));//对数据做重新的组合之后再显示
  85.                                                 delay1ms(2);
  86.                                         }
  87.                          }
  88.                 }
  89.          }
  90. #endif


  91. #if 0               
  92.         while(1){
  93.          //先将二维数组变为一维数组,这样比较容易操作。向上移动显示0-9        ,P0为行扫描,P2为列扫描
  94.          for(k=0;k<sizeof(number)-8;k++)

  95.                 for(j=0;j<30;j++)
  96.                    for(i=0;i<8;i++){
  97.                          P0 = tabb[i];
  98.                         P2 = number[k+i];
  99.                         delay1ms(2);
  100.                 }
  101.         }
  102. #endif

  103. #if 0
  104. //静态显示字母A
  105.         while(1){
  106.                  for(i=0;i<8;i++){
  107.                         P0 = tabb[i];
  108.                         P2 = a[i];
  109.                         delay1ms(2);
  110.                 }
  111.         }
  112. #endif        

  113. #if 0               
  114.         while(1){
  115.          //循环显示0-9        ,P0为行扫描,P3为列扫描
  116.          for(k=0;k<10;k++)

  117.                 for(j=0;j<200;j++)
  118.                    for(i=0;i<8;i++){
  119.                          P0 = tabb[i];
  120.                         P2 = number[k][i];
  121.                         delay1ms(2);
  122.                 }
  123.         }
  124. #endif
  125.                  
  126.   
  127.   /*
  128.          
  129.         while(1){
  130.                  for(i=0;i<8;i++){
  131.                          P1 = a[i];
  132.                         P3 = taba[i];
  133.                         delay1ms();
  134.                         P1 = 0;
  135.                         P3 = 0;
  136.         
  137.                 }
  138.         }
  139.          
  140.         
  141.          while(1){
  142.                 //逐行扫描,从上到下
  143.                  for(i=0;i<8;i++){
  144.                         P0 = tabb[i];
  145.                         Delay500ms();                  
  146.                         P2 = 0x00;
  147.                 }
  148.                 //逐行扫描,从下到上
  149.                 for(i=7;i>0;i--){
  150.                         P0 = tabb[i];
  151.                         Delay500ms();                  
  152.                         P2 = 0x00;
  153.                 }
  154.                 //逐列扫描 从右到左
  155.                 for(i=0;i<8;i++){
  156.                         P0 = 0xFF;
  157.                         P2 = taba[i];
  158.                         Delay500ms();                           
  159.                 }
  160.                 //逐列扫描 从左到右
  161.                 for(i=7;i>0;i--){
  162.                         P0 = 0xFF;
  163.                         P2 = taba[i];
  164.                         Delay500ms();                  
  165.                 }
  166.                 P0 = 0;
  167.                 P2 = 0;
  168.         }
  169.         */

  170. }
复制代码

所有资料51hei提供下载:
dotled.rar (267.93 KB, 下载次数: 22)
回复

使用道具 举报

ID:1 发表于 2019-4-4 23:50 | 显示全部楼层
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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