返噗掖 发表于 前天 21:20

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

方法1

#include<reg52.h>

sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

unsigned char code iMage =
{
        { 0xC3, 0xBD, 0x7E, 0x7E, 0x7E, 0x7E, 0xBD, 0xC3 },
        { 0xEF, 0xE3, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0x83 },
        { 0xC3, 0xBD, 0xBF, 0xBF, 0xCF, 0xF3, 0xFD, 0x81 },
        { 0xFF, 0xE3, 0xDD, 0xDF, 0xE3, 0xDF, 0xDD, 0xE3 },
        { 0xDF, 0xCF, 0xD7, 0xDB, 0x03, 0xDF, 0xDF, 0x07 },
        { 0x81, 0xFD, 0xFD, 0xC3, 0xBF, 0xBF, 0xBD, 0xC3 },
        { 0xC7, 0xBB, 0xFB, 0xC3, 0xBB, 0xBB, 0xBB, 0xC7 },
        { 0xFF, 0xC1, 0xDF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF },
        { 0xFF, 0xC3, 0xBD, 0xBD, 0xC3, 0xBD, 0xBD, 0xC3 },
        { 0xE3, 0xDD, 0xDD, 0xDD, 0xC3, 0xDF, 0xDD, 0xE3 }       
};//通过取模软件获取

unsigned char code LedChar[] =
{
    0xC0, 0xF9, 0xA4, 0xB0, 0x99,
    0x92, 0x82, 0xF8, 0x80, 0x90
};//数码管真值表

//首先让点阵亮,其次数码管亮,最后小灯亮,按此次序1s转换一次
void main(void)
{
        ENLED = 0;
        //ADDR3 = 0;//u4使能

        EA = 1;//中断总使能

        TMOD = 0x01;//定时器0设置模式1

        TH0 = 0xFC;
        TL0 = 0x67;//设置定时器0的初值1ms

        TR0 = 1;//启动定时器0

        ET0 = 1;//定时器0的中断使能

        while(1);//让程序停在此处
}

void interruptTimer0(void) interrupt 1
{
        static char iDotMatrix = 0;//点阵行数
        static char iDig = 0;
        static char iLed = 0;//led
        static long unsigned int secDig = 0;//数码管
        static int sec = 0;
        static char index = 0;
       

        TH0 = 0xFC;
        TL0 = 0x67;//设置定时器0的初值1ms

        ADDR3 = 0;//u4使能
        P0 = 0xFF;//显示消隐
        switch (iDotMatrix)
        {
                case 0: ADDR2 = 0; ADDR1 = 0; ADDR0 = 0; P0 = iMage; iDotMatrix++; break;
                case 1: ADDR2 = 0; ADDR1 = 0; ADDR0 = 1; P0 = iMage; iDotMatrix++; break;
                case 2: ADDR2 = 0; ADDR1 = 1; ADDR0 = 0; P0 = iMage; iDotMatrix++; break;
                case 3: ADDR2 = 0; ADDR1 = 1; ADDR0 = 1; P0 = iMage; iDotMatrix++; break;
                case 4: ADDR2 = 1; ADDR1 = 0; ADDR0 = 0; P0 = iMage; iDotMatrix++; break;
                case 5: ADDR2 = 1; ADDR1 = 0; ADDR0 = 1; P0 = iMage; iDotMatrix++; break;
                case 6: ADDR2 = 1; ADDR1 = 1; ADDR0 = 0; P0 = iMage; iDotMatrix++; break;
                case 7: ADDR2 = 1; ADDR1 = 1; ADDR0 = 1; P0 = iMage; iDotMatrix = 0; break;
                default: break;
        }

        ADDR3 = 1;//U3使能
        P0 = 0xFF;       
        switch (iDig)
        {
                case 0: ADDR2 = 0; ADDR1 = 0; ADDR0 = 0; P0 = LedChar; iDig++; break;
                case 1: ADDR2 = 0; ADDR1 = 0; ADDR0 = 1; P0 = LedChar; iDig++; break;
                case 2: ADDR2 = 0; ADDR1 = 1; ADDR0 = 0; P0 = LedChar; iDig++; break;
                case 3: ADDR2 = 0; ADDR1 = 1; ADDR0 = 1; P0 = LedChar; iDig++; break;
                case 4: ADDR2 = 1; ADDR1 = 0; ADDR0 = 0; P0 = LedChar; iDig++; break;
                case 5: ADDR2 = 1; ADDR1 = 0; ADDR0 = 1; P0 = LedChar; iDig = 0; break;
                default: break;
        }
       
        ADDR3 = 1;
        P0 = 0xFF;                         
        ADDR2 = 1; ADDR1 = 1; ADDR0 = 0;
        P0 = ~(1 << iLed);

        sec++;
        if (sec > 1000)
        {
                index++;
                iLed++;
                secDig++;
                sec = 0;               
        }

        if (index > 9)
                index = 0;

        if (8 == iLed)
                iLed = 0;
}方法2

#include<reg52.h>

sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

unsigned char code iMage =
{
        { 0xC3, 0xBD, 0x7E, 0x7E, 0x7E, 0x7E, 0xBD, 0xC3 },
        { 0xEF, 0xE3, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0x83 },
        { 0xC3, 0xBD, 0xBF, 0xBF, 0xCF, 0xF3, 0xFD, 0x81 },
        { 0xFF, 0xE3, 0xDD, 0xDF, 0xE3, 0xDF, 0xDD, 0xE3 },
        { 0xDF, 0xCF, 0xD7, 0xDB, 0x03, 0xDF, 0xDF, 0x07 },
        { 0x81, 0xFD, 0xFD, 0xC3, 0xBF, 0xBF, 0xBD, 0xC3 },
        { 0xC7, 0xBB, 0xFB, 0xC3, 0xBB, 0xBB, 0xBB, 0xC7 },
        { 0xFF, 0xC1, 0xDF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF },
        { 0xFF, 0xC3, 0xBD, 0xBD, 0xC3, 0xBD, 0xBD, 0xC3 },
        { 0xE3, 0xDD, 0xDD, 0xDD, 0xC3, 0xDF, 0xDD, 0xE3 }       
};//通过取模软件获取

unsigned char code LedChar[] =
{
    0xC0, 0xF9, 0xA4, 0xB0, 0x99,
    0x92, 0x82, 0xF8, 0x80, 0x90
};//数码管真值表

//首先让点阵亮,其次数码管亮,最后小灯亮,按此次序1s转换一次
void main(void)
{
        ENLED = 0;
        //ADDR3 = 0;//u4使能

        EA = 1;//中断总使能

        TMOD = 0x01;//定时器0设置模式1

        TH0 = 0xFC;
        TL0 = 0x67;//设置定时器0的初值1ms

        TR0 = 1;//启动定时器0

        ET0 = 1;//定时器0的中断使能

        while(1);//让程序停在此处
}

void interruptTimer0(void) interrupt 1
{
        static char i = 0;//点阵行数
        static char iLed = 0;//led
        static long unsigned int secDig = 0;//数码管
        static int sec = 0;
        static char index = 0;
       

        TH0 = 0xFC;
        TL0 = 0x67;//设置定时器0的初值1ms

        ADDR3 = 0;//u4使能
        P0 = 0xFF;//显示消隐
        switch (i)
        {
                case 0: ADDR3 = 0; ADDR2 = 0; ADDR1 = 0; ADDR0 = 0; P0 = iMage; i++; break;
                case 1: ADDR3 = 0; ADDR2 = 0; ADDR1 = 0; ADDR0 = 1; P0 = iMage; i++; break;
                case 2: ADDR3 = 0; ADDR2 = 0; ADDR1 = 1; ADDR0 = 0; P0 = iMage; i++; break;
                case 3: ADDR3 = 0; ADDR2 = 0; ADDR1 = 1; ADDR0 = 1; P0 = iMage; i++; break;
                case 4: ADDR3 = 0; ADDR2 = 1; ADDR1 = 0; ADDR0 = 0; P0 = iMage; i++; break;
                case 5: ADDR3 = 0; ADDR2 = 1; ADDR1 = 0; ADDR0 = 1; P0 = iMage; i++; break;
                case 6: ADDR3 = 0; ADDR2 = 1; ADDR1 = 1; ADDR0 = 0; P0 = iMage; i++; break;
                case 7: ADDR3 = 0; ADDR2 = 1; ADDR1 = 1; ADDR0 = 1; P0 = iMage; i++; break;

                case 8: ADDR3 = 1; ADDR2 = 0; ADDR1 = 0; ADDR0 = 0; P0 = LedChar; i++; break;
                case 9: if (secDig < 10); else {ADDR3 = 1; ADDR2 = 0; ADDR1 = 0; ADDR0 = 1; P0 = LedChar;} i++; break;
                case 10: if (secDig < 100); else {ADDR3 = 1; ADDR2 = 0; ADDR1 = 1; ADDR0 = 0; P0 = LedChar;} i++; break;
                case 11: if (secDig < 1000); else {ADDR3 = 1; ADDR2 = 0; ADDR1 = 1; ADDR0 = 1; P0 = LedChar;} i++; break;
                case 12: if (secDig < 10000); else {ADDR3 = 1; ADDR2 = 1; ADDR1 = 0; ADDR0 = 0; P0 = LedChar;} i++; break;
                case 13: if (secDig < 100000); else {ADDR3 = 1; ADDR2 = 1; ADDR1 = 0; ADDR0 = 1; P0 = LedChar;} i++; break;

                case 14: ADDR3 = 1; ADDR2 = 1; ADDR1 = 1; ADDR0 = 0; P0 = ~(1 << iLed); i = 0; break;

                default: break;
        }

        sec++;
        if (sec > 1000)
        {
                index++;
                iLed++;
                secDig++;
                sec = 0;               
        }

        if (index > 9)
                index = 0;

        if (8 == iLed)
                iLed = 0;
}官方答案

#include <reg52.h>

sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;

void main()
{
    EA = 1;       //使能总中断
    ENLED = 0;    //使能LED
    TMOD = 0x01;//设置T0为模式1
    TH0= 0xFC;//为T0赋初值0xFC67,定时1ms
    TL0= 0x67;
    ET0= 1;   //使能T0中断
    TR0= 1;   //启动T0
    while (1);
}
/* 定时器0中断服务函数 */
void InterruptTimer0() interrupt 1
{
    static unsigned char i = 0;//动态扫描的索引

    TH0 = 0xFC;//重新加载初值
    TL0 = 0x67;
    //以下代码完成LED点阵动态扫描刷新
    P0 = 0xFF;   //显示消隐
    switch (i)
    {
      //点阵LED部分
      case 0: ADDR3 = 0; ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=0; break;
      case 1: ADDR3 = 0; ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=0; break;
      case 2: ADDR3 = 0; ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=0; break;
      case 3: ADDR3 = 0; ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=0; break;
      case 4: ADDR3 = 0; ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=0; break;
      case 5: ADDR3 = 0; ADDR2=1; ADDR1=0; ADDR0=1; i++; P0=0; break;
      case 6: ADDR3 = 0; ADDR2=1; ADDR1=1; ADDR0=0; i++; P0=0; break;
      case 7: ADDR3 = 0; ADDR2=1; ADDR1=1; ADDR0=1; i++; P0=0; break;
      //数码管部分
      case 8:ADDR3 = 1; ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=0; break;
      case 9:ADDR3 = 1; ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=0; break;
      case 10: ADDR3 = 1; ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=0; break;
      case 11: ADDR3 = 1; ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=0; break;
      case 12: ADDR3 = 1; ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=0; break;
      case 13: ADDR3 = 1; ADDR2=1; ADDR1=0; ADDR0=1; i++; P0=0; break;
      //独立LED部分
      case 14: ADDR3 = 1; ADDR2=1; ADDR1=1; ADDR0=0; i=0; P0=0; break;
      default: break;
    }
}
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 同时点亮LED、数码管以及点阵