找回密码
 立即注册

QQ登录

只需一步,快速开始

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

点阵向上滚动显示(IAR环境、MSP430)

[复制链接]
跳转到指定楼层
楼主
ID:73477 发表于 2015-2-10 17:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. /***********************************************************************************************************
  2.                       实现汉字向上滚动显示
  3. P5用于译码器LM138实现静态扫描(低四位驱动),P4用于LM595串行转并行。
  4. LM595采用级联,可输入多个字节。DS为LM595的数据口,SH上升沿保存串口数据
  5. ,ST上升沿推DS数据到LM595输出端,ST下降沿将输出端锁存。
  6. 运行时显示小组标志和“黑客电子小组”向上滚动输出。
  7. 硬件资源:
  8.   MSP430F155、LM595(两个)、LM138(两个)、8*8LED点阵(四个)
  9. ************************************************************************************************************/

  10. #include "msp430x15x.h"

  11. #define    DATADIR     P5DIR                     //                              译码器控制设定输出
  12. #define    CTLDIR      P4DIR                      //                              串行转并行芯片控制设定输出
  13. #define    DATAOUT     P5OUT
  14. #define    CTLOUT      P4OUT

  15. #define    SH_L        CTLOUT &= ~BIT0;      //                            SH为低电位
  16. #define    ST_L        CTLOUT &= ~BIT1;      //                            ST为低电位
  17. #define    DS_L        CTLOUT &= ~BIT2;      //                            DS为低电位

  18. #define    SH_H        CTLOUT |= BIT0;       //                               SH为高电位
  19. #define    ST_H        CTLOUT |= BIT1;       //                               ST为高电位
  20. #define    DS_H        CTLOUT |= BIT2;       //                               DS为高电位

  21. typedef unsigned int uint16;

  22. char table[64];   //用于存放其它数组

  23. char tab_0[]={0x00,0x00,0xE0,0x07,0x38,0x1E,0x20,0x04,0x38,0x1C,0x20,0x04,0x38,0x1C,0x20,0x04,
  24. 0x38,0x1C,0x20,0x04,0x38,0x1C,0x20,0x04,0x38,0x1C,0xE0,0x07,0x00,0x00,0x00,0x00};
  25.    //  小组标志
  26. char tab_1[]={0x08,0x00,0xFC,0x3F,0x08,0x21,0x28,0x31,0x38,0x2D,0x48,0x25,0x08,0x21,0xF8,0x3F,
  27. 0x00,0x01,0xFC,0x7F,0x00,0x01,0xFE,0xFF,0x00,0x00,0x90,0x28,0x4C,0x24,0x44,0x44};
  28.    //  *黑*
  29. char tab_2[]={0x00,0x02,0x00,0x01,0xFE,0x7F,0x02,0x48,0xF4,0x8F,0x20,0x08,0x40,0x14,0x80,0x23,
  30. 0x60,0x0C,0x1E,0x30,0xE4,0xCF,0x20,0x08,0x20,0x08,0x20,0x08,0xE0,0x0F,0x20,0x08};
  31.    //  *客*
  32. char tab_3[]={0x00,0x02,0x00,0x02,0x10,0x02,0xF8,0x7F,0x10,0x42,0x10,0x42,0xF0,0x7F,0x10,0x42,
  33. 0x10,0x42,0xF0,0x7F,0x10,0x42,0x00,0x02,0x04,0x02,0x04,0x02,0xFC,0x01,0x00,0x00};
  34.    //  *电*
  35. char tab_4[]={0x00,0x00,0xF0,0x3F,0x10,0x00,0x20,0x00,0x40,0x00,0x80,0x01,0x04,0x01,0xFE,0xFF,
  36. 0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x05,0x00,0x02};
  37.    //  *子*
  38. char tab_5[]={0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x40,0x05,0x20,0x05,0x10,0x09,
  39. 0x08,0x09,0x04,0x11,0x04,0x21,0x00,0x41,0x00,0x01,0x00,0x01,0x00,0x05,0x00,0x02};
  40.    //  *小*
  41. char tab_6[]={0x00,0x10,0x08,0x10,0xFC,0x21,0x08,0x21,0x08,0x45,0x08,0xF9,0xF8,0x11,0x08,0x21,
  42. 0x08,0x41,0x08,0xFD,0xF8,0x41,0x08,0x01,0x08,0x1D,0x08,0xE1,0xFE,0x47,0x00,0x00};
  43.    //  *组*

  44. void WriteByte(char send)      //         发送一个字节
  45. {
  46.   char temp_wb,i_wb;
  47.   SH_L;
  48.   for(i_wb=0;i_wb<8;i_wb++)
  49.   {
  50.      temp_wb = send & 0X80;
  51.      if(temp_wb==0)   DS_L;
  52.      if(temp_wb!=0)   DS_H;
  53.      SH_H;
  54.      send <<= 1;
  55.      _NOP();                           //            延时一个机器周期
  56.      SH_L;
  57.   }
  58. }

  59. void WriteLine(char *data_wl)
  60. {
  61.   char i_wl;
  62.   ST_L;
  63.   for(i_wl=16;i_wl>0;i_wl--)      //          由于两个595级联,故一次写入两个字节
  64.   {
  65.     WriteByte(*data_wl++);
  66.     WriteByte(*data_wl++);
  67.     ST_H;                               //            ST上升沿推送数据
  68.     DATAOUT = i_wl-1;           //           扫描第几行
  69.     ST_L;                                //          ST下降沿锁存
  70.   }
  71. }

  72. void arrcpy(char *arr1,char *arr2)  //  将数组arr2复制到arr1
  73. {
  74.   char i;
  75.   for(i=0;i<32;i++)
  76.     *arr1++ = *arr2++;
  77. }

  78. void arrcat(char *arr1,char *arr2)  //     将数组arr2连接到arr1后面
  79. {
  80.   char i;
  81.   for(arr1+=32,i=0;i<32;i++)
  82.     *arr1++ = *arr2++;
  83. }

  84. void dis_move(char *p_dis)         //        移动扫描
  85. {
  86.   char i1,i2;
  87.   for(i1=0;i1<17;i1++)
  88.   {
  89.     p_dis = &table[i1*2];
  90.     for(i2=0;i2<10;i2++)
  91.       WriteLine(p_dis);
  92.   }

  93. }

  94. void display()                          //             移动显示
  95. {
  96.   arrcpy(table,tab_0);           //                将tab_0复制到table
  97.   arrcat(table,tab_1);          //                  将tab_1连接到table
  98.   dis_move(table);                //                将table移动显示
  99.   arrcpy(table,tab_1);
  100.   arrcat(table,tab_2);
  101.   dis_move(table);  
  102.   arrcpy(table,tab_2);
  103.   arrcat(table,tab_3);
  104.   dis_move(table);   
  105.   arrcpy(table,tab_3);
  106.   arrcat(table,tab_4);
  107.   dis_move(table);      
  108.   arrcpy(table,tab_4);
  109.   arrcat(table,tab_5);
  110.   dis_move(table);      
  111.   arrcpy(table,tab_5);
  112.   arrcat(table,tab_6);
  113.   dis_move(table);  
  114.   arrcpy(table,tab_6);
  115.   arrcat(table,tab_0);
  116.   dis_move(table);  
  117. }

  118. void main( void )
  119. {
  120.   // Stop watchdog timer to prevent time out reset
  121.   WDTCTL = WDTPW + WDTHOLD;
  122.   DATADIR = 0X0F;                            //          设定数据为低四位输出
  123.   CTLDIR  = 0X07;                             //           设定控制为低三位输出
  124.   while(1)
  125.   {
  126.     display();
  127.   }  
  128.   
  129. }
复制代码


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

使用道具 举报

沙发
ID:119654 发表于 2016-5-9 21:41 | 只看该作者
请问有proteus的仿真图吗
回复

使用道具 举报

板凳
ID:107115 发表于 2016-11-7 18:24 | 只看该作者
1554132135bxvc3541x1432
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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