我在尝试写一个C51程序来使整个LED点阵都亮起来,但是我的亮度相比运行示例代码的亮度差得很远。下面是单片机示例代码:
- #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; //使能 U4,选择 LED 点阵
- ADDR3 = 0; //因为需要动态改变 ADDR0-2 的值,所以不需要再初始化了
- 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)
- {
- case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=0x00; break;
- case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=0x00; break;
- case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=0x00; break;
- case 3: ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=0x00; break;
- case 4: ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=0x00; break;
- case 5: ADDR2=1; ADDR1=0; ADDR0=1; i++; P0=0x00; break;
- case 6: ADDR2=1; ADDR1=1; ADDR0=0; i++; P0=0x00; break;
- case 7: ADDR2=1; ADDR1=1; ADDR0=1; i=0; P0=0x00; break;
- default: break;
- }
- }
复制代码 这是我写的代码,区别主要在用了for循环- #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 addr2[] = {0,0,0,0,1,1,1,1};
- unsigned char code addr1[] = {0,0,1,1,0,0,1,1};
- unsigned char code addr0[] = {0,1,0,1,0,1,0,1};
- void main()
- {
- EA = 1;
- ENLED = 0;
- ADDR3 = 0;
- TMOD = 0x01;
- TH0 = 0xFC;
- TL0 = 0x67;
- ET0 = 1;
- TR0 = 1;
- while(1);
- }
- void InterruptTimer0() interrupt 1
- {
- unsigned char i = 0;
- TH0 = 0xFC;
- TL0 = 0x67;
- P0 = 0xFF;
- for (i=0; i<8; i++){
- ADDR0 = addr0[i];
- ADDR1 = addr1[i];
- ADDR2 = addr2[i];
- P0 = 0x00;
- }
- P0 = 0xFF;
- }
复制代码
希望能有大神指点指点
|