找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1940|回复: 0
打印 上一主题 下一主题
收起左侧

单片机16X32点阵左移显示白居易的《长恨歌》源程序

[复制链接]
跳转到指定楼层
楼主
       闲时就准备一些外设,编个程序练练C语言。春节是个大好时光
   买了16X32的点阵套件,动手焊了一块显示屏,配合一个单片机开发板,搭了一个显示系统。
   这个系统关键是程序。买套件时有附了一些示范程序。感觉太复杂,自己动手编了一个。调试
  成功,拿出来大家分享一下。视频



单片机源程序如下:
  1. /*        白居易  长恨歌
  2. 标准08接口点阵屏管脚定义
  3. GND     A     ABCD是行扫描信号
  4. GND     B
  5. GND     C
  6. OE      D          OE是屏的使能端  低有效
  7. R1      G1          上半屏绿色
  8. R2      G2          下半屏绿色  本板由于没有使用R2 G2,故把这两脚改接为VCC,方便大家接线。
  9. GND            STR          锁存信号
  10. GND     SCK         时钟信号
  11. */
  12. /*接口说明*/
  13. //A B C D 是138行扫描信号
  14. // SCK   是595的移位信号
  15. // STR  是595的锁存信号
  16. // OE    是屏的使能端 可以控制亮度
  17. // R     是红色信号线
  18. // G     是绿色信号线
  19. // 本板由于没有使用R2 G2,故把这两脚改接为VCC,方便大家接线。   

  20. #include<reg52.h>
  21. #include<intrins.h>
  22. #include<stdio.h>
  23. #define u8 unsigned char
  24. #define u16 unsigned int
  25.                  
  26. /*****************************接口定义********************************/
  27. sbit sck=P0^1;//595的移位信号         
  28. sbit str=P0^2;//是595的锁存信号            
  29. sbit sda_r=P2^7;//红数据  
  30. sbit sda_g=P0^4;//绿数据   
  31. sbit OE=P0^5;//输出使能
  32. sbit sign=P0^7;//检测用LED
  33. sbit IA=P2^0;//行控制线A          
  34. sbit IB=P2^1;//行控制线B
  35. sbit IC=P2^2;//行控制线C
  36. sbit ID=P2^3;//行控制线D

  37. /********************************************************************/


  38. #define  scan0    {IA=0;IB=0;IC=0;ID=0;}
  39. #define  scan1    {IA=1;IB=0;IC=0;ID=0;}
  40. #define  scan2    {IA=0;IB=1;IC=0;ID=0;}
  41. #define  scan3    {IA=1;IB=1;IC=0;ID=0;}
  42. #define  scan4    {IA=0;IB=0;IC=1;ID=0;}
  43. #define  scan5    {IA=1;IB=0;IC=1;ID=0;}
  44. #define  scan6    {IA=0;IB=1;IC=1;ID=0;}
  45. #define  scan7    {IA=1;IB=1;IC=1;ID=0;}
  46. #define  scan8    {IA=0;IB=0;IC=0;ID=1;}
  47. #define  scan9    {IA=1;IB=0;IC=0;ID=1;}
  48. #define scan10    {IA=0;IB=1;IC=0;ID=1;}
  49. #define scan11    {IA=1;IB=1;IC=0;ID=1;}
  50. #define scan12    {IA=0;IB=0;IC=1;ID=1;}
  51. #define scan13    {IA=1;IB=0;IC=1;ID=1;}
  52. #define scan14    {IA=0;IB=1;IC=1;ID=1;}
  53. #define scan15    {IA=1;IB=1;IC=1;ID=1;}

  54. u16 adj,kk;
  55. u8 x,y;//
  56. u8 line,k; //line变量被多个函数调用
  57. u8 code ziku[];
  58. u8 buff_all[16][6];//对字库里面的字重新排序缓存,           
  59. u8 buff[4];         //行缓存
  60. u8 buff_1[6];//数据移位缓存
  61. /******************************************************/

  62. u16 zishu=977;// 输入目前字库中字的个数!!!!!!!!!!!!!!!!!!!!!!!!!

  63. /********************************************************/
  64. void   rxd_data();                                   // 发送数据
  65. void   load_data();
  66. void scan(u8 Value)
  67. {switch(Value)
  68.         {case  0: scan0;break;
  69.                   case  1: scan1;break;
  70.                    case  2: scan2;break;
  71.                     case  3: scan3;break;
  72.              case  4: scan4;break;
  73.                       case  5: scan5;break;
  74.                        case  6: scan6;break;
  75.                         case  7: scan7;break;
  76.                  case  8: scan8;break;
  77.                        case  9: scan9;break;
  78.                       case 10:scan10;break;
  79.                      case 11:scan11;break;
  80.             case 12:scan12;break;
  81.                   case 13:scan13;break;
  82.                  case 14:scan14;break;
  83.             case 15:scan15;break;
  84.            default:break;
  85.         }
  86. }
  87. /*******************************************************************************
  88. * 函 数 名         : delay
  89. * 函数功能                   : 延时函数,i=1时,大约延时10us
  90. *******************************************************************************/
  91. void delay(u16 i)
  92. {
  93.         while(i--);       
  94. }
  95. /****************字库字按显示顺序调序放入2维数组缓存中,便于显示时调取 */
  96. void adj_ziku()
  97.       {

  98.            u8 w,v;
  99.            v=zishu*2;

  100.            for(y=0;y<16;y++)
  101.                {

  102.                            for(x=0;x<6;x++) //zhuang 3 ge zi
  103.                           {         
  104.                             w=x/2;//除2取整
  105.                            buff_all[y][x]=ziku[adj*32+2*y+32*w+x%2];
  106.                           }
  107.                    }
  108.           
  109.           }                   //ok
  110.    

  111. /*主函数*/
  112. void main()
  113. {           
  114.      u8 del;
  115.          u16        count ;//字库输入后要更改,循环次数=(zishu/2-1 )*16         

  116.           
  117.                 while(1)
  118.         {   
  119.                   adj=0;//这个很重要,否则不会从0开始??原因不明       
  120.         count=zishu*16+1-32 ;
  121.                   delay(50000);
  122.                 delay(50000);
  123.   for(kk=0;kk<zishu-2;kk++)
  124.           {
  125.           for(k=0;k<16;k++) //走完一个字
  126.                 {

  127.                  for(del=0;del<1;del++)        //一帧停留时间控制
  128.                    {
  129.                          adj_ziku();
  130.                     for(line=0;line<16;line++)
  131.                          {

  132.                          load_data();

  133.                           rxd_data();
  134.                           scan(line);
  135.                           str=1; //595锁存
  136.                           str=0;
  137.                            OE=0;        //各相应位输出
  138.                           delay(15); //数值大,亮度高,但会闪烁
  139.                            OE=1;//关闭595输出(都为HIGH)

  140.                            }

  141.                   }
  142.                   //           delay(501);
  143.             }
  144.                                           adj++;

  145.           }
  146.         adj=0;
  147. }         
  148. }          
  149. /**********************************************************/
  150. void load_data(void)   //装每行的4个字节到缓存buff中
  151.    {  u8 q1,q3,q4,n;
  152.    q3=k/8; q4=k%8;
  153.      for(q1=0;q1<6;q1++)        //预装3个字
  154.               {                       
  155.                         buff_1[q1]=buff_all[line][q3+q1];          
  156.                   }
  157.     if(q4==0)
  158.          {
  159.                              for(n=0;n<4;n++)
  160.                             {buff[n]=buff_1[n];        }
  161.          }
  162.          else
  163.            {
  164.                           for(n=0;n<4;n++)
  165.                           {          
  166.                           buff[n]=(buff_1[n]<<q4)|(buff_1[n+1]>>(8-q4));
  167.                           }         
  168.           }           
  169.    }

  170. /***********************发送数据****************************/
  171. void rxd_data(void)                            //串行发送数据
  172. {
  173.   u8 s;
  174.   u8 temp,k;
  175.   
  176.   for(s=0;s<4;s++)                   //发送4字节数据
  177.         {
  178.          temp=buff[s];
  179.          temp=~temp;//取反才能字亮背景暗       

  180.              for(k=0;k<8;k++)//一个字节8位 发送给595
  181.                {
  182.                        sck=0; //上升沿移位595                          

  183.                sda_g=temp>>7;  //先送最高位,
  184.                            temp<<=1;                  
  185.                   sck=1;

  186.                }
  187.     }


  188.    }
  189. //字库
  190. u8 code ziku[]={
  191. /*--  文字:  《  --*/
  192. /*--  新宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  193. 0x00,0x10,0x00,0x24,0x00,0x48,0x00,0x90,0x01,0x20,0x02,0x40,0x04,0x80,0x09,0x00,
  194. 0x04,0x80,0x02,0x40,0x01,0x20,0x00,0x90,0x00,0x48,0x00,0x24,0x00,0x10,0x00,0x00,

  195. /*--  文字:  长  --*/
  196. ……………………

  197. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有程序51hei提供下载:
多字左移测试.rar (19.4 KB, 下载次数: 20)



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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