找回密码
 立即注册

QQ登录

只需一步,快速开始

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

pic16f877加2块8x8led点阵滚动显示数字时钟Proteus仿真程序

[复制链接]
跳转到指定楼层
楼主
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. //-----------------------------------------------------------------
  2. //  名称: 8×8LED点阵屏显示数字
  3. //-----------------------------------------------------------------
  4. //  说明: 8×8LED点阵屏循环显示数字0-9,刷新过程由定时器中断完成
  5. //   
  6. //-----------------------------------------------------------------
  7. #include <pic.h>
  8. #define INT8U   unsigned char
  9. #define INT16U  unsigned int
  10. #define _XTAL_FREQ 1000000UL
  11. unsigned char s,m;

  12. unsigned char column[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};  //column number select chart                         
  13. //数字0~9的8*8点阵编码
  14. //const INT8U Table_OF_Digits[] =
  15. //{  
  16.       
  17. //};

  18. const unsigned char dot5x3[10][3] = {
  19.                                                                          {0x07,0x77,0x07},  //0 3column for 1 digit
  20.                                                                    {0xff,0x07,0xff},  //1
  21.                                                                    {0x47,0x57,0x17},  //2
  22.                                                                    {0x57,0x57,0x07},  //3
  23.                                                                    {0x1f,0xdf,0x07},  //4
  24.                                                                    {0x17,0x57,0x47},  //5
  25.                                                                    {0x07,0x57,0x47},  //6
  26.                                                                    {0x7f,0x7f,0x07},  //7
  27.                                                                    {0x07,0x57,0x07},  //8
  28.                                                                    {0x17,0x57,0x07},  //9

  29.                                                                    };

  30. void display()
  31. {
  32.         INT8U i,j;       
  33.        
  34.         for (i=0;i<32;i++)
  35.         {
  36.                 for (j=0;j<12;j++)
  37.                 {
  38.                 if(16>i&&i>=0)
  39.                 {
  40.                         if(i<8)
  41.                         {
  42.                         PORTB=0xff;          //关闭显示
  43.                         PORTB=dot5x3[m/10][0]>>2|11000000;
  44.                           PORTC=column[i%8];         //选通第1个点阵,显示第i列
  45.                           __delay_ms(1);           //显示延时
  46.                         PORTC=0x00;          //关闭显示
  47.                           PORTB=0xff;          //关闭显示
  48.                         }
  49.                         else
  50.                         {
  51.                         PORTB=0xff;          //关闭显示
  52.                         PORTB=dot5x3[m/10][0]>>2|11000000;
  53.                           PORTD=column[i%8];         //选通第2个点阵,显示第i列
  54.                           __delay_ms(1);           //显示延时
  55.                         PORTD=0x00;          //关闭显示
  56.                           PORTB=0xff;          //关闭显示
  57.                         }
  58.                 }
  59.                 if(17>i&&i>=1)
  60.                   {
  61.                         if(i<9)
  62.                         {
  63.                         PORTB=0xff;          //关闭显示
  64.                         PORTB=dot5x3[m/10][1]>>2|11000000;
  65.                           PORTC=column[(i-1)%8];         //选通第1个点阵,显示第i列
  66.                           __delay_ms(1);           //显示延时
  67.                         PORTC=0x00;          //关闭显示
  68.                         PORTB=0xff;          //关闭显示
  69.                         }
  70.                           else
  71.                         {
  72.                         PORTB=0xff;          //关闭显示
  73.                         PORTB=dot5x3[m/10][1]>>2|11000000;
  74.                           PORTD=column[(i-1)%8];         //选通第2个点阵,显示第i列
  75.                           __delay_ms(1);           //显示延时
  76.                         PORTD=0x00;          //关闭显示
  77.                         PORTB=0xff;          //关闭显示
  78.                         }
  79.                 }
  80.                 if(18>i&&i>=2)
  81.                 {
  82.                         if(i<10)
  83.                         {
  84.                         PORTB=0xff;          //关闭显示
  85.                         PORTB=dot5x3[m/10][2]>>2|11000000;
  86.                           PORTC=column[(i-2)%8];         //选通左起第2个数码管,显示i位
  87.                           __delay_ms(1);           //显示延时
  88.                         PORTC=0x00;          //关闭显示
  89.                         PORTB=0xff;          //关闭显示
  90.                         }
  91.                         else
  92.                         {
  93.                         PORTB=0xff;          //关闭显示
  94.                         PORTB=dot5x3[m/10][2]>>2|11000000;
  95.                           PORTD=column[(i-2)%8];         //选通左起第2个数码管,显示i位
  96.                           __delay_ms(1);           //显示延时
  97.                         PORTD=0x00;          //关闭显示
  98.                         PORTB=0xff;          //关闭显示
  99.                         }
  100.                 }
  101.                 if(19>i&&i>=3)
  102.                 {
  103.                         if(i<11)
  104.                         {
  105.                         PORTB=0xff;          //关闭显示               
  106.                         PORTC=column[(i-3)%8];         //选通左起第2个数码管,显示i位
  107.                         __delay_ms(1);           //显示延时
  108.                         PORTC=0x00;          //关闭显示
  109.                         PORTB=0xff;          //关闭显示
  110.                         }
  111.                         else
  112.                         {
  113.                         PORTB=0xff;          //关闭显示               
  114.                         PORTD=column[(i-3)%8];         //选通左起第2个数码管,显示i位
  115.                         __delay_ms(1);           //显示延时
  116.                         PORTD=0x00;          //关闭显示
  117.                         PORTB=0xff;          //关闭显示         
  118.                         }
  119.                 }
  120.                 if(20>i&&i>=4)
  121.                 {
  122.                         if(i<12)
  123.                         {
  124.                         PORTB=0xff;          //关闭显示
  125.                         PORTB=dot5x3[m%10][0]>>2|11000000;
  126.                           PORTC=column[(i-4)%8];         //选通左起第1个数码管,显示i位
  127.                           __delay_ms(1);           //显示延时
  128.                         PORTC=0x00;          //关闭显示
  129.                           PORTB=0xff;          //关闭显示
  130.                         }
  131.                         else
  132.                         {
  133.                         PORTB=0xff;          //关闭显示
  134.                         PORTB=dot5x3[m%10][0]>>2|11000000;
  135.                           PORTD=column[(i-4)%8];         //选通左起第1个数码管,显示i位
  136.                           __delay_ms(1);           //显示延时
  137.                         PORTD=0x00;          //关闭显示
  138.                           PORTB=0xff;          //关闭显示
  139.                         }
  140.                 }
  141.                 if(21>i&&i>=5)
  142.                 {
  143.                         if(i<13)
  144.                         {
  145.                         PORTB=0xff;          //关闭显示       
  146.                           PORTB=dot5x3[m%10][1]>>2|11000000;
  147.                           PORTC=column[(i-5)%8];         //选通左起第2个数码管,显示i位
  148.                           __delay_ms(1);           //显示延时
  149.                         PORTC=0x00;          //关闭显示
  150.                         PORTB=0xff;          //关闭显示
  151.                         }
  152.                         else
  153.                         {
  154.                         PORTB=0xff;          //关闭显示       
  155.                           PORTB=dot5x3[m%10][1]>>2|11000000;
  156.                           PORTD=column[(i-5)%8];         //选通左起第2个数码管,显示i位
  157.                           __delay_ms(1);           //显示延时
  158.                         PORTD=0x00;          //关闭显示
  159.                         PORTB=0xff;          //关闭显示
  160.                         }
  161.                 }
  162.                 if(22>i&&i>=6)
  163.                 {
  164.                         if(i<14)
  165.                         {
  166.                         PORTB=0xff;          //关闭显示
  167.                           PORTB=dot5x3[m%10][2]>>2|11000000;
  168.                           PORTC=column[(i-6)%8];         //选通左起第2个数码管,显示i位
  169.                           __delay_ms(1);           //显示延时
  170.                         PORTC=0x00;          //关闭显示
  171.                         PORTB=0xff;          //关闭显示               
  172.                         }
  173.                         else
  174.                         {
  175.                         PORTB=0xff;          //关闭显示
  176.                           PORTB=dot5x3[m%10][2]>>2|11000000;
  177.                           PORTD=column[(i-6)%8];         //选通左起第2个数码管,显示i位
  178.                           __delay_ms(1);           //显示延时
  179.                         PORTD=0x00;          //关闭显示
  180.                         PORTB=0xff;          //关闭显示               
  181.                         }
  182.                 }
  183.                 if(23>i&&i>=7)
  184.                 {
  185.                         if(i<15)
  186.                         {
  187.                         PORTB=0xff;          //关闭显示               
  188.                         //RTC=column[(i-7)%8];         //选通左起第2个数码管,显示i位
  189.                         __delay_ms(1);           //显示延时
  190.                         PORTC=0x00;          //关闭显示       
  191.                         PORTB=0xff;          //关闭显示         
  192.                         }
  193.                         else
  194.                         {
  195.                         PORTB=0xff;          //关闭显示               
  196.                         //RTD=column[(i-7)%8];         //选通左起第2个数码管,显示i位
  197.                         __delay_ms(1);           //显示延时
  198.                         PORTD=0x00;          //关闭显示
  199.                         PORTB=0xff;          //关闭显示
  200.                         }
  201.                 }
  202.                 if(24>i&&i>=8)
  203.                 {
  204.                         if(i<16)
  205.                         {
  206.                         PORTB=0xff;          //关闭显示
  207.                         PORTB=dot5x3[s/10][0]>>2|11000000;
  208.                           PORTC=column[(i-8)%8];         //选通左起第1个数码管,显示i位
  209.                           __delay_ms(1);           //显示延时
  210.                         PORTC=0x00;          //关闭显示
  211.                           PORTB=0xff;          //关闭显示
  212.                         }
  213.                         else
  214.                         {
  215.                         PORTB=0xff;          //关闭显示       
  216.                         PORTB=dot5x3[s/10][0]>>2|11000000;
  217.                           PORTD=column[(i-8)%8];         //选通左起第1个数码管,显示i位
  218.                           __delay_ms(1);           //显示延时
  219.                         PORTD=0x00;          //关闭显示
  220.                           PORTB=0xff;          //关闭显示
  221.                         }
  222.                 }       
  223.                   if(25>i&&i>=9)
  224.                 {
  225.                         if(i<17)
  226.                         {
  227.                         PORTB=0xff;          //关闭显示
  228.                         PORTB=dot5x3[s/10][1]>>2|11000000;
  229.                           PORTC=column[(i-9)%8];         //选通左起第2个数码管,显示i位
  230.                           __delay_ms(1);           //显示延时
  231.                         PORTC=0x00;          //关闭显示
  232.                         PORTB=0xff;          //关闭显示
  233.                         }
  234.                         else
  235.                         {
  236.                         PORTB=0xff;          //关闭显示
  237.                         PORTB=dot5x3[s/10][1]>>2|11000000;
  238.                           PORTD=column[(i-9)%8];         //选通左起第2个数码管,显示i位
  239.                           __delay_ms(1);           //显示延时
  240.                         PORTD=0x00;          //关闭显示
  241.                         PORTB=0xff;          //关闭显示
  242.                         }
  243.                 }
  244.                 if(26>i&&i>=10)
  245.                 {
  246.                         if(i<18)
  247.                         {
  248.                         PORTB=0xff;          //关闭显示
  249.                           PORTB=dot5x3[s/10][2]>>2|11000000;
  250.                           PORTC=column[(i-10)%8];         //选通左起第2个数码管,显示i位
  251.                           __delay_ms(1);           //显示延时
  252.                         PORTC=0x00;          //关闭显示
  253.                         PORTB=0xff;          //关闭显示
  254.                         }
  255.                         else
  256.                         {
  257.                         PORTB=0xff;          //关闭显示
  258.                         PORTB=dot5x3[s/10][2]>>2|11000000;
  259.                           PORTD=column[(i-10)%8];         //选通左起第2个数码管,显示i位
  260.                           __delay_ms(1);           //显示延时
  261.                         PORTD=0x00;          //关闭显示
  262.                         PORTB=0xff;          //关闭显示
  263.                         }
  264.                 }
  265.                 if(27>i&&i>=11)
  266.                 {
  267.                         if(i<19)
  268.                         {
  269.                         PORTB=0xff;          //关闭显示               
  270.                         //RTC=column[(i-11)%8];         //选通左起第2个数码管,显示i位
  271.                         __delay_ms(1);           //显示延时
  272.                         PORTC=0x00;          //关闭显示
  273.                         }
  274.                         else
  275.                         {
  276.                         PORTB=0xff;          //关闭显示               
  277.                         //RTD=column[(i-11)%8];         //选通左起第2个数码管,显示i位
  278.                         __delay_ms(1);           //显示延时
  279.                         PORTD=0x00;          //关闭显示
  280.                         }
  281.                 }
  282.                 if(28>i&&i>=12)
  283.                 {
  284.                         if(i<20)
  285.                         {
  286.                         PORTB=0xff;          //关闭显示
  287.                         PORTB=dot5x3[s%10][0]>>2|11000000;
  288.                           PORTC=column[(i-12)%8];         //选通左起第1个数码管,显示i位
  289.                           __delay_ms(1);           //显示延时
  290.                         PORTC=0x00;          //关闭显示
  291.                           PORTB=0xff;          //关闭显示
  292.                         }
  293.                         else
  294.                         {
  295.                         PORTB=0xff;          //关闭显示
  296.                         PORTB=dot5x3[s%10][0]>>2|11000000;
  297.                           PORTD=column[(i-12)%8];         //选通左起第1个数码管,显示i位
  298.                           __delay_ms(1);           //显示延时
  299.                         PORTD=0x00;          //关闭显示
  300.                           PORTB=0xff;          //关闭显示
  301.                         }
  302.                 }
  303.                 if(29>i&&i>=13)
  304.                 {
  305.                         if(i<21)
  306.                         {
  307.                         PORTB=0xff;          //关闭显示       
  308.                           PORTB=dot5x3[s%10][1]>>2|11000000;
  309.                           PORTC=column[(i-13)%8];         //选通左起第2个数码管,显示i位
  310.                           __delay_ms(1);           //显示延时
  311.                         PORTC=0x00;          //关闭显示
  312.                         PORTB=0xff;          //关闭显示
  313.                         }
  314.                         else
  315.                         {
  316.                         PORTB=0xff;          //关闭显示       
  317.                           PORTB=dot5x3[s%10][1]>>2|11000000;
  318.                           PORTD=column[(i-13)%8];         //选通左起第2个数码管,显示i位
  319.                           __delay_ms(1);           //显示延时
  320.                         PORTD=0x00;          //关闭显示
  321.                         PORTB=0xff;          //关闭显示
  322.                         }
  323.                 }
  324.                 if(30>i&&i>=14)
  325.                 {
  326.                         if(i<22)
  327.                         {
  328.                         PORTB=0xff;          //关闭显示
  329.                           PORTB=dot5x3[s%10][2]>>2|11000000;
  330.                           PORTC=column[(i-14)%8];         //选通左起第2个数码管,显示i位
  331.                           __delay_ms(1);           //显示延时
  332.                         PORTC=0x00;          //关闭显示
  333.                         PORTB=0xff;          //关闭显示       
  334.                         }
  335.                         else
  336.                         {
  337.                         PORTB=0xff;          //关闭显示
  338.                           PORTB=dot5x3[s%10][2]>>2|11000000;
  339.                           PORTD=column[(i-14)%8];         //选通左起第2个数码管,显示i位
  340.                           __delay_ms(1);           //显示延时
  341.                         PORTD=0x00;          //关闭显示         
  342.                         PORTB=0xff;          //关闭显示       
  343.                         }
  344.                 }
  345.                 if(31>i&&i>=15)
  346.                 {
  347.                         if(i<23)
  348.                         {
  349.                         PORTB=0xff;          //关闭显示               
  350.                         //RTC=column[(i-15)%8];         //选通左起第2个数码管,显示i位
  351.                         __delay_ms(1);           //显示延时
  352.                         PORTC=0x00;          //关闭显示
  353.                         PORTB=0xff;          //关闭显示       
  354.                         }
  355.                         else
  356.                         {
  357.                         PORTB=0xff;          //关闭显示               
  358.                         //RTD=column[(i-15)%8];         //选通左起第2个数码管,显示i位
  359.                         __delay_ms(1);           //显示延时
  360.                         PORTD=0x00;          //关闭显示
  361.                         PORTB=0xff;          //关闭显示         
  362.                         }
  363.                 }
  364.                 }
  365.         //__delay_ms(40);       
  366.         }
  367.         __delay_ms(2000);           //显示延时        
  368. }



  369. //------------------------------------------------------------------
  370. // 主程序
  371. //------------------------------------------------------------------
  372. void main()
  373. {   
  374.        
  375.     TRISB = TRISC = TRISD = 0x00;                            //配置端口

  376.         //TRISB=0x00;TRISC=0x00; //PB PC PD out put
  377.         PORTB=0xff;
  378.         PORTC=PORTD=0x00;
  379.         PSA=0;
  380.         PS2=0; PS1=PS0=1;
  381.         TMR0 = (INT8U)(256-_XTAL_FREQ/16*0.002);
  382.         T0IF=0;
  383.         T0CS=0;
  384.         T0IE=1;
  385.         GIE=1;

  386.         s=45;m=59;
  387.         while(1)
  388.         {
  389.          
  390.                  display();
  391.         //        __delay_ms(10);       
  392.         }

  393. }


  394. //-----------------------------------------------------------------
  395. // TMR0溢出中断控制点阵屏刷新显示
  396. //-----------------------------------------------------------------
  397. void interrupt TMR0_OVR_Interrupt()
  398. {
  399.    //static INT8U  i = 0, Num_Index = 0;
  400.    static INT8U t = 0;
  401.    if (T0IE & T0IF)
  402.    {        
  403.         T0IF=0;
  404.                 t++;
  405.                 if (t==61)
  406.                 {
  407.                 t=0;s++;              

  408.                   if (s==60)
  409.                             {
  410.                                   s=0;m++;
  411.                                     if (m==60)
  412.                                    {m=0;}
  413.                         }
  414.                 }

  415.    }
  416. }
复制代码

所有资料51hei提供下载:
2-8x8led.zip (23.97 KB, 下载次数: 40)


评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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