找回密码
 立即注册
首页 业界区 安全 同时点亮LED、数码管以及点阵

同时点亮LED、数码管以及点阵

返噗掖 4 天前
方法1
  1. #include<reg52.h>
  2. sbit ADDR0 = P1 ^ 0;
  3. sbit ADDR1 = P1 ^ 1;
  4. sbit ADDR2 = P1 ^ 2;
  5. sbit ADDR3 = P1 ^ 3;
  6. sbit ENLED = P1 ^ 4;
  7. unsigned char code iMage[10][8] =
  8. {
  9.         { 0xC3, 0xBD, 0x7E, 0x7E, 0x7E, 0x7E, 0xBD, 0xC3 },
  10.         { 0xEF, 0xE3, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0x83 },
  11.         { 0xC3, 0xBD, 0xBF, 0xBF, 0xCF, 0xF3, 0xFD, 0x81 },
  12.         { 0xFF, 0xE3, 0xDD, 0xDF, 0xE3, 0xDF, 0xDD, 0xE3 },
  13.         { 0xDF, 0xCF, 0xD7, 0xDB, 0x03, 0xDF, 0xDF, 0x07 },
  14.         { 0x81, 0xFD, 0xFD, 0xC3, 0xBF, 0xBF, 0xBD, 0xC3 },
  15.         { 0xC7, 0xBB, 0xFB, 0xC3, 0xBB, 0xBB, 0xBB, 0xC7 },
  16.         { 0xFF, 0xC1, 0xDF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF },
  17.         { 0xFF, 0xC3, 0xBD, 0xBD, 0xC3, 0xBD, 0xBD, 0xC3 },
  18.         { 0xE3, 0xDD, 0xDD, 0xDD, 0xC3, 0xDF, 0xDD, 0xE3 }       
  19. };//通过取模软件获取
  20. unsigned char code LedChar[] =
  21. {
  22.     0xC0, 0xF9, 0xA4, 0xB0, 0x99,
  23.     0x92, 0x82, 0xF8, 0x80, 0x90
  24. };//数码管真值表
  25. //首先让点阵亮,其次数码管亮,最后小灯亮,按此次序1s转换一次
  26. void main(void)
  27. {
  28.         ENLED = 0;
  29.         //ADDR3 = 0;//u4使能
  30.         EA = 1;//中断总使能
  31.         TMOD = 0x01;//定时器0设置模式1
  32.         TH0 = 0xFC;
  33.         TL0 = 0x67;//设置定时器0的初值1ms
  34.         TR0 = 1;//启动定时器0
  35.         ET0 = 1;//定时器0的中断使能
  36.         while(1);//让程序停在此处
  37. }
  38. void interruptTimer0(void) interrupt 1
  39. {
  40.         static char iDotMatrix = 0;//点阵行数
  41.         static char iDig = 0;
  42.         static char iLed = 0;//led
  43.         static long unsigned int secDig = 0;//数码管
  44.         static int sec = 0;
  45.         static char index = 0;
  46.        
  47.         TH0 = 0xFC;
  48.         TL0 = 0x67;//设置定时器0的初值1ms
  49.         ADDR3 = 0;//u4使能
  50.         P0 = 0xFF;//显示消隐
  51.         switch (iDotMatrix)
  52.         {
  53.                 case 0: ADDR2 = 0; ADDR1 = 0; ADDR0 = 0; P0 = iMage[index][iDotMatrix]; iDotMatrix++; break;
  54.                 case 1: ADDR2 = 0; ADDR1 = 0; ADDR0 = 1; P0 = iMage[index][iDotMatrix]; iDotMatrix++; break;
  55.                 case 2: ADDR2 = 0; ADDR1 = 1; ADDR0 = 0; P0 = iMage[index][iDotMatrix]; iDotMatrix++; break;
  56.                 case 3: ADDR2 = 0; ADDR1 = 1; ADDR0 = 1; P0 = iMage[index][iDotMatrix]; iDotMatrix++; break;
  57.                 case 4: ADDR2 = 1; ADDR1 = 0; ADDR0 = 0; P0 = iMage[index][iDotMatrix]; iDotMatrix++; break;
  58.                 case 5: ADDR2 = 1; ADDR1 = 0; ADDR0 = 1; P0 = iMage[index][iDotMatrix]; iDotMatrix++; break;
  59.                 case 6: ADDR2 = 1; ADDR1 = 1; ADDR0 = 0; P0 = iMage[index][iDotMatrix]; iDotMatrix++; break;
  60.                 case 7: ADDR2 = 1; ADDR1 = 1; ADDR0 = 1; P0 = iMage[index][iDotMatrix]; iDotMatrix = 0; break;
  61.                 default: break;
  62.         }
  63.         ADDR3 = 1;//U3使能
  64.         P0 = 0xFF;       
  65.         switch (iDig)
  66.         {
  67.                 case 0: ADDR2 = 0; ADDR1 = 0; ADDR0 = 0; P0 = LedChar[secDig % 10]; iDig++; break;
  68.                 case 1: ADDR2 = 0; ADDR1 = 0; ADDR0 = 1; P0 = LedChar[secDig / 10 % 10]; iDig++; break;
  69.                 case 2: ADDR2 = 0; ADDR1 = 1; ADDR0 = 0; P0 = LedChar[secDig / 100 % 10]; iDig++; break;
  70.                 case 3: ADDR2 = 0; ADDR1 = 1; ADDR0 = 1; P0 = LedChar[secDig / 1000 % 10]; iDig++; break;
  71.                 case 4: ADDR2 = 1; ADDR1 = 0; ADDR0 = 0; P0 = LedChar[secDig / 10000 % 10]; iDig++; break;
  72.                 case 5: ADDR2 = 1; ADDR1 = 0; ADDR0 = 1; P0 = LedChar[secDig / 100000 % 10]; iDig = 0; break;
  73.                 default: break;
  74.         }
  75.        
  76.         ADDR3 = 1;
  77.         P0 = 0xFF;                         
  78.         ADDR2 = 1; ADDR1 = 1; ADDR0 = 0;
  79.         P0 = ~(1 << iLed);
  80.         sec++;
  81.         if (sec > 1000)
  82.         {
  83.                 index++;
  84.                 iLed++;
  85.                 secDig++;
  86.                 sec = 0;               
  87.         }
  88.         if (index > 9)
  89.                 index = 0;
  90.         if (8 == iLed)
  91.                 iLed = 0;
  92. }
复制代码
方法2
  1. #include<reg52.h>
  2. sbit ADDR0 = P1 ^ 0;
  3. sbit ADDR1 = P1 ^ 1;
  4. sbit ADDR2 = P1 ^ 2;
  5. sbit ADDR3 = P1 ^ 3;
  6. sbit ENLED = P1 ^ 4;
  7. unsigned char code iMage[10][8] =
  8. {
  9.         { 0xC3, 0xBD, 0x7E, 0x7E, 0x7E, 0x7E, 0xBD, 0xC3 },
  10.         { 0xEF, 0xE3, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0x83 },
  11.         { 0xC3, 0xBD, 0xBF, 0xBF, 0xCF, 0xF3, 0xFD, 0x81 },
  12.         { 0xFF, 0xE3, 0xDD, 0xDF, 0xE3, 0xDF, 0xDD, 0xE3 },
  13.         { 0xDF, 0xCF, 0xD7, 0xDB, 0x03, 0xDF, 0xDF, 0x07 },
  14.         { 0x81, 0xFD, 0xFD, 0xC3, 0xBF, 0xBF, 0xBD, 0xC3 },
  15.         { 0xC7, 0xBB, 0xFB, 0xC3, 0xBB, 0xBB, 0xBB, 0xC7 },
  16.         { 0xFF, 0xC1, 0xDF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF },
  17.         { 0xFF, 0xC3, 0xBD, 0xBD, 0xC3, 0xBD, 0xBD, 0xC3 },
  18.         { 0xE3, 0xDD, 0xDD, 0xDD, 0xC3, 0xDF, 0xDD, 0xE3 }       
  19. };//通过取模软件获取
  20. unsigned char code LedChar[] =
  21. {
  22.     0xC0, 0xF9, 0xA4, 0xB0, 0x99,
  23.     0x92, 0x82, 0xF8, 0x80, 0x90
  24. };//数码管真值表
  25. //首先让点阵亮,其次数码管亮,最后小灯亮,按此次序1s转换一次
  26. void main(void)
  27. {
  28.         ENLED = 0;
  29.         //ADDR3 = 0;//u4使能
  30.         EA = 1;//中断总使能
  31.         TMOD = 0x01;//定时器0设置模式1
  32.         TH0 = 0xFC;
  33.         TL0 = 0x67;//设置定时器0的初值1ms
  34.         TR0 = 1;//启动定时器0
  35.         ET0 = 1;//定时器0的中断使能
  36.         while(1);//让程序停在此处
  37. }
  38. void interruptTimer0(void) interrupt 1
  39. {
  40.         static char i = 0;//点阵行数
  41.         static char iLed = 0;//led
  42.         static long unsigned int secDig = 0;//数码管
  43.         static int sec = 0;
  44.         static char index = 0;
  45.        
  46.         TH0 = 0xFC;
  47.         TL0 = 0x67;//设置定时器0的初值1ms
  48.         ADDR3 = 0;//u4使能
  49.         P0 = 0xFF;//显示消隐
  50.         switch (i)
  51.         {
  52.                 case 0: ADDR3 = 0; ADDR2 = 0; ADDR1 = 0; ADDR0 = 0; P0 = iMage[index][i]; i++; break;
  53.                 case 1: ADDR3 = 0; ADDR2 = 0; ADDR1 = 0; ADDR0 = 1; P0 = iMage[index][i]; i++; break;
  54.                 case 2: ADDR3 = 0; ADDR2 = 0; ADDR1 = 1; ADDR0 = 0; P0 = iMage[index][i]; i++; break;
  55.                 case 3: ADDR3 = 0; ADDR2 = 0; ADDR1 = 1; ADDR0 = 1; P0 = iMage[index][i]; i++; break;
  56.                 case 4: ADDR3 = 0; ADDR2 = 1; ADDR1 = 0; ADDR0 = 0; P0 = iMage[index][i]; i++; break;
  57.                 case 5: ADDR3 = 0; ADDR2 = 1; ADDR1 = 0; ADDR0 = 1; P0 = iMage[index][i]; i++; break;
  58.                 case 6: ADDR3 = 0; ADDR2 = 1; ADDR1 = 1; ADDR0 = 0; P0 = iMage[index][i]; i++; break;
  59.                 case 7: ADDR3 = 0; ADDR2 = 1; ADDR1 = 1; ADDR0 = 1; P0 = iMage[index][i]; i++; break;
  60.                 case 8: ADDR3 = 1; ADDR2 = 0; ADDR1 = 0; ADDR0 = 0; P0 = LedChar[secDig % 10]; i++; break;
  61.                 case 9: if (secDig < 10); else {ADDR3 = 1; ADDR2 = 0; ADDR1 = 0; ADDR0 = 1; P0 = LedChar[secDig / 10 % 10];} i++; break;
  62.                 case 10: if (secDig < 100); else {ADDR3 = 1; ADDR2 = 0; ADDR1 = 1; ADDR0 = 0; P0 = LedChar[secDig / 100 % 10];} i++; break;
  63.                 case 11: if (secDig < 1000); else {ADDR3 = 1; ADDR2 = 0; ADDR1 = 1; ADDR0 = 1; P0 = LedChar[secDig / 1000 % 10];} i++; break;
  64.                 case 12: if (secDig < 10000); else {ADDR3 = 1; ADDR2 = 1; ADDR1 = 0; ADDR0 = 0; P0 = LedChar[secDig / 10000 % 10];} i++; break;
  65.                 case 13: if (secDig < 100000); else {ADDR3 = 1; ADDR2 = 1; ADDR1 = 0; ADDR0 = 1; P0 = LedChar[secDig / 100000 % 10];} i++; break;
  66.                 case 14: ADDR3 = 1; ADDR2 = 1; ADDR1 = 1; ADDR0 = 0; P0 = ~(1 << iLed); i = 0; break;
  67.                 default: break;
  68.         }
  69.         sec++;
  70.         if (sec > 1000)
  71.         {
  72.                 index++;
  73.                 iLed++;
  74.                 secDig++;
  75.                 sec = 0;               
  76.         }
  77.         if (index > 9)
  78.                 index = 0;
  79.         if (8 == iLed)
  80.                 iLed = 0;
  81. }
复制代码
官方答案
  1. #include <reg52.h>
  2. sbit ADDR0 = P1^0;
  3. sbit ADDR1 = P1^1;
  4. sbit ADDR2 = P1^2;
  5. sbit ADDR3 = P1^3;
  6. sbit ENLED = P1^4;
  7. void main()
  8. {
  9.     EA = 1;       //使能总中断
  10.     ENLED = 0;    //使能LED
  11.     TMOD = 0x01;  //设置T0为模式1
  12.     TH0  = 0xFC;  //为T0赋初值0xFC67,定时1ms
  13.     TL0  = 0x67;
  14.     ET0  = 1;     //使能T0中断
  15.     TR0  = 1;     //启动T0
  16.     while (1);
  17. }
  18. /* 定时器0中断服务函数 */
  19. void InterruptTimer0() interrupt 1
  20. {
  21.     static unsigned char i = 0;  //动态扫描的索引
  22.     TH0 = 0xFC;  //重新加载初值
  23.     TL0 = 0x67;
  24.     //以下代码完成LED点阵动态扫描刷新
  25.     P0 = 0xFF;   //显示消隐
  26.     switch (i)
  27.     {
  28.         //点阵LED部分
  29.         case 0: ADDR3 = 0; ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=0; break;
  30.         case 1: ADDR3 = 0; ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=0; break;
  31.         case 2: ADDR3 = 0; ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=0; break;
  32.         case 3: ADDR3 = 0; ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=0; break;
  33.         case 4: ADDR3 = 0; ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=0; break;
  34.         case 5: ADDR3 = 0; ADDR2=1; ADDR1=0; ADDR0=1; i++; P0=0; break;
  35.         case 6: ADDR3 = 0; ADDR2=1; ADDR1=1; ADDR0=0; i++; P0=0; break;
  36.         case 7: ADDR3 = 0; ADDR2=1; ADDR1=1; ADDR0=1; i++; P0=0; break;
  37.         //数码管部分
  38.         case 8:  ADDR3 = 1; ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=0; break;
  39.         case 9:  ADDR3 = 1; ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=0; break;
  40.         case 10: ADDR3 = 1; ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=0; break;
  41.         case 11: ADDR3 = 1; ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=0; break;
  42.         case 12: ADDR3 = 1; ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=0; break;
  43.         case 13: ADDR3 = 1; ADDR2=1; ADDR1=0; ADDR0=1; i++; P0=0; break;
  44.         //独立LED部分
  45.         case 14: ADDR3 = 1; ADDR2=1; ADDR1=1; ADDR0=0; i=0; P0=0; break;
  46.         default: break;
  47.     }
  48. }
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册