方法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[10][8] =
- {
- { 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[index][iDotMatrix]; iDotMatrix++; break;
- case 1: ADDR2 = 0; ADDR1 = 0; ADDR0 = 1; P0 = iMage[index][iDotMatrix]; iDotMatrix++; break;
- case 2: ADDR2 = 0; ADDR1 = 1; ADDR0 = 0; P0 = iMage[index][iDotMatrix]; iDotMatrix++; break;
- case 3: ADDR2 = 0; ADDR1 = 1; ADDR0 = 1; P0 = iMage[index][iDotMatrix]; iDotMatrix++; break;
- case 4: ADDR2 = 1; ADDR1 = 0; ADDR0 = 0; P0 = iMage[index][iDotMatrix]; iDotMatrix++; break;
- case 5: ADDR2 = 1; ADDR1 = 0; ADDR0 = 1; P0 = iMage[index][iDotMatrix]; iDotMatrix++; break;
- case 6: ADDR2 = 1; ADDR1 = 1; ADDR0 = 0; P0 = iMage[index][iDotMatrix]; iDotMatrix++; break;
- case 7: ADDR2 = 1; ADDR1 = 1; ADDR0 = 1; P0 = iMage[index][iDotMatrix]; iDotMatrix = 0; break;
- default: break;
- }
- ADDR3 = 1;//U3使能
- P0 = 0xFF;
- switch (iDig)
- {
- case 0: ADDR2 = 0; ADDR1 = 0; ADDR0 = 0; P0 = LedChar[secDig % 10]; iDig++; break;
- case 1: ADDR2 = 0; ADDR1 = 0; ADDR0 = 1; P0 = LedChar[secDig / 10 % 10]; iDig++; break;
- case 2: ADDR2 = 0; ADDR1 = 1; ADDR0 = 0; P0 = LedChar[secDig / 100 % 10]; iDig++; break;
- case 3: ADDR2 = 0; ADDR1 = 1; ADDR0 = 1; P0 = LedChar[secDig / 1000 % 10]; iDig++; break;
- case 4: ADDR2 = 1; ADDR1 = 0; ADDR0 = 0; P0 = LedChar[secDig / 10000 % 10]; iDig++; break;
- case 5: ADDR2 = 1; ADDR1 = 0; ADDR0 = 1; P0 = LedChar[secDig / 100000 % 10]; 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[10][8] =
- {
- { 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[index][i]; i++; break;
- case 1: ADDR3 = 0; ADDR2 = 0; ADDR1 = 0; ADDR0 = 1; P0 = iMage[index][i]; i++; break;
- case 2: ADDR3 = 0; ADDR2 = 0; ADDR1 = 1; ADDR0 = 0; P0 = iMage[index][i]; i++; break;
- case 3: ADDR3 = 0; ADDR2 = 0; ADDR1 = 1; ADDR0 = 1; P0 = iMage[index][i]; i++; break;
- case 4: ADDR3 = 0; ADDR2 = 1; ADDR1 = 0; ADDR0 = 0; P0 = iMage[index][i]; i++; break;
- case 5: ADDR3 = 0; ADDR2 = 1; ADDR1 = 0; ADDR0 = 1; P0 = iMage[index][i]; i++; break;
- case 6: ADDR3 = 0; ADDR2 = 1; ADDR1 = 1; ADDR0 = 0; P0 = iMage[index][i]; i++; break;
- case 7: ADDR3 = 0; ADDR2 = 1; ADDR1 = 1; ADDR0 = 1; P0 = iMage[index][i]; i++; break;
- case 8: ADDR3 = 1; ADDR2 = 0; ADDR1 = 0; ADDR0 = 0; P0 = LedChar[secDig % 10]; i++; break;
- case 9: if (secDig < 10); else {ADDR3 = 1; ADDR2 = 0; ADDR1 = 0; ADDR0 = 1; P0 = LedChar[secDig / 10 % 10];} i++; break;
- case 10: if (secDig < 100); else {ADDR3 = 1; ADDR2 = 0; ADDR1 = 1; ADDR0 = 0; P0 = LedChar[secDig / 100 % 10];} i++; break;
- case 11: if (secDig < 1000); else {ADDR3 = 1; ADDR2 = 0; ADDR1 = 1; ADDR0 = 1; P0 = LedChar[secDig / 1000 % 10];} i++; break;
- case 12: if (secDig < 10000); else {ADDR3 = 1; ADDR2 = 1; ADDR1 = 0; ADDR0 = 0; P0 = LedChar[secDig / 10000 % 10];} i++; break;
- case 13: if (secDig < 100000); else {ADDR3 = 1; ADDR2 = 1; ADDR1 = 0; ADDR0 = 1; P0 = LedChar[secDig / 100000 % 10];} 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;
- }
- }
复制代码 来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |