找回密码
 立即注册

QQ登录

只需一步,快速开始

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

我想问问这个proteus里 单片机和点阵为什么要这样接线?

[复制链接]
跳转到指定楼层
楼主
  1. 程序#include<reg51.h>     //51系列单片机头文件

  2. #defineuchar unsigned char     //宏定义
  3. #defineuint unsigned int       //宏定义

  4. /******************************************************
  5.                      基础定义
  6. *******************************************************/
  7. ucharm=0,n=0;
  8. ucharo,p,d;
  9. uchartime=0;
  10. ucharcode table[]={0x01,0x04,0x08,0x02,0x40,0x10,0x80,0x20};
  11. /******************************************************
  12.                      数码显示数据定义
  13. *******************************************************/
  14. ucharcode taba[]={
  15. 0xff,0xef,0xef,0xef,0xab,0xc7,0xef,0xff};      //编码定义↓

  16. ucharcode tab1[]={
  17. 0xff,0xef,0xcf,0xef,0xef,0xef,0xef,0xc7};      //编码定义1

  18. ucharcode tab2[]={
  19. 0xff,0xc7,0xbb,0xfb,0xf7,0xcf,0xbf,0x83};      //编码定义2

  20. ucharcode tab3[]={
  21. 0xff,0xc7,0xbb,0xfb,0xe7,0xfb,0xbb,0xc7};      //编码定义3

  22. ucharcode tab4[]={
  23. 0xff,0xf7,0xe7,0xd7,0xb7,0xb7,0x83,0xf7};      //编码定义4

  24. ucharcode tab5[]={
  25. 0xff,0x83,0xbf,0x87,0xfb,0xfb,0xbb,0xc7};      //编码定义5

  26. ucharcode tab6[]={
  27. 0xff,0xe7,0xdf,0xbf,0x87,0xbb,0xbb,0xc7};      //编码定义6

  28. /******************************************************
  29.                      延时
  30. *******************************************************/
  31. voiddelay(uchar n)     //延时子函数
  32. {
  33.     uchar i,j;
  34.     for(i=n;i>0;i--)
  35.     {
  36.         for(j=255;j>0;j--);
  37.     }
  38. }
  39. /********************************************************************
  40. * 名称 : ucharChangeFor(uchar dat)
  41. * 功能 : 交换一个字节位的位置,用于数码管显示
  42. * 输入 : 需要改变的数
  43. * 输出 : 改变后的数
  44. ***********************************************************************/
  45. #defineLED_a       4   //数码管段选的a段接在段选IO口的第0位
  46. #defineLED_b       3
  47. #defineLED_c       1
  48. #defineLED_d       5
  49. #defineLED_e       0
  50. #defineLED_f       6
  51. #defineLED_g       7
  52. #defineLED_dp      2

  53. ucharChangeFor(uchar dat)
  54. {
  55.     uchar temp=0;
  56.     if(dat&0x01)       //判断数据的第一位是否为1
  57.         temp|=0x01<<LED_a;//如果为1,放到控制数码管a段的位置
  58.     if(dat&0x02)
  59.         temp|=0x01<<LED_b;
  60.     if(dat&0x04)
  61.         temp|=0x01<<LED_c;
  62.     if(dat&0x08)
  63.         temp|=0x01<<LED_d;
  64.     if(dat&0x10)
  65.         temp|=0x01<<LED_e;
  66.     if(dat&0x20)
  67.         temp|=0x01<<LED_f;
  68.     if(dat&0x40)
  69.         temp|=0x01<<LED_g;
  70.     if(dat&0x80)
  71.         temp|=0x01<<LED_dp;
  72.     return temp;
  73. }

  74. /******************************************************
  75.                     T/C0中断服务程序入口
  76. *******************************************************/
  77. timer0()interrupt 1 using 1        //定时器0工作方式1
  78. {
  79.     TH0 = (65536-50000)/256;       //赋初值
  80.     TL0 = (65536-50000)%256;       //赋初值
  81.    
  82.     if(o>p)//if语句一般处理两个分支,处理多个分支用if-else-if结构
  83.     {
  84.         d=1;
  85.     }
  86.     else if(o<p)
  87.     {
  88.         d=2;
  89.     }
  90.     else
  91.     {
  92.         d=0;
  93.     }
  94.     time++;

  95.     if(time==1)
  96.     {
  97.         n=~(1<<(p+1));   
  98.     }
  99.     else if(time==5)
  100.     {
  101.         if(d==0)
  102.         {
  103.            n=~(1<<(p+1));
  104.         }
  105.         else if(d==1)
  106.         {
  107.            p++;
  108.            n=0xfe;
  109.         }
  110.         else if(d==2)
  111.         {
  112.            p--;
  113.            n=0xfd;
  114.         }
  115.     }
  116.     else if(time==20)
  117.     {
  118.         time = 0;
  119.     }
  120. }

  121. /******************************************************
  122.                      定时器T/C0初始化
  123. *******************************************************/
  124. voidcom_initialize(void)      //定时器初始化
  125. {
  126.     TMOD = 0x01;//设定定时器0为工作方式1
  127.     TH0 = (65536-50000)/256;    //装初值
  128.     TL0 = (65536-50000)%256;    //装初值
  129.     EA = 1;         //开总中断
  130.     ET0 = 1;        //开定时器0中断
  131.     TR0 = 1;        //启动定时器0
  132. }

  133. /******************************************************
  134.                          主函数
  135. *******************************************************/
  136. voidmain() //主函数
  137. {
  138.     uchar i=0,j=0,k=0;
  139.     uchar tmp=0;
  140.     uchar om=0;

  141.     d=0;
  142.     m=0;
  143.     o=1;
  144.     p=1;

  145.     n=0xff;

  146.     com_initialize();

  147.     while(1)       //主循环
  148.     {
  149.         for(i=0;i<8;i++)
  150.         {   
  151.            P1=0xff;
  152.            P0=table[ i];  //[ i]刷新

  153.            if(++k==50)  //延时
  154.            {
  155.                k=0;   
  156.            }

  157.            m=P1;   //记录按键

  158.            if(m != 0xff && d==0&& m!=om)
  159.            {
  160.                om=m;   

  161.                switch(m)      //开关语句
  162.                {
  163.                    case 0xfb:
  164.                        tmp=1;break;
  165.                    case 0xf7:
  166.                        tmp=2;break;
  167.                    case 0xef:
  168.                        tmp=3;break;
  169.                    case0xdf:
  170.                        tmp=4;break;
  171.                    case 0xbf:
  172.                        tmp=5;break;
  173.                    case 0x7f:
  174.                        tmp=6;break;
  175.                    default:
  176.                        tmp=o;break;
  177.                }
  178.    
  179.                if(o!=tmp)
  180.                {
  181.                    p=o;
  182.                    o=tmp;
  183.                    time=0;
  184.                }

  185.                n=m;

  186.            }

  187.            if(n==0xfe)   //识别按键值
  188.            {
  189.                if(k==0)
  190.                    j=++j%8;

  191.                P2=ChangeFor(taba[7-(i+j)%8]);
  192.            }
  193.            else if(n==0xfd)
  194.            {
  195.                if(k==0)
  196.                {
  197.                    if(j>0)
  198.                        j--;
  199.                    else
  200.                        j=7;
  201.                }
  202.                P2=ChangeFor(taba[(i+j)%8]);
  203.            }
  204.            else if(n==0xfb)
  205.            {
  206.                P2=ChangeFor(tab1[ i]);
  207.            }
  208.             elseif(n==0xf7)
  209.            {
  210.                P2=ChangeFor(tab2[ i]);
  211.            }
  212.            else if(n==0xef)
  213.            {
  214.                P2=ChangeFor(tab3[ i]);
  215.            }
  216.            else if(n==0xdf)
  217.            {
  218.                P2=ChangeFor(tab4[ i]);
  219.            }
  220.            else if(n==0xbf)
  221.            {
  222.                P2=ChangeFor(tab5[ i]);
  223.            }
  224.            else if(n==0x7f)
  225.            {
  226.                P2=ChangeFor(tab6[ i]);
  227.            }

  228.            delay(5);
  229.         }
  230.     }
  231. }




复制代码


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

使用道具 举报

沙发
ID:584814 发表于 2019-12-19 21:56 | 只看该作者
16点阵8横8纵,分别各接一P口(0-7)。话说电灯2根线并成一根会省线,但灯不会亮。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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