|
- #include <reg52.h>
- #include <led.h>
- u8 T0RH = 0; //T0 重载值的高字节
- u8 T0RL = 0; //T0 重载值的低字节
- u8 flag = 0;//
- void led_show()
- {
- u8 l_cnt = 0;
- u8 r_cnt = 0;
- bit led_flag = 0;//控制左右移位标志位
-
- while(1)
- {
- if(flag == 100)//改变flag的大小,可控制等的移动速度
- {
- if(led_flag == 0)
- {
- flag = 0;
- P0 = ~(0x01 << l_cnt);
- l_cnt++;
- if(l_cnt >= 8)
- {
- l_cnt = 0;
- led_flag = 1;
- }
- }
- else if(led_flag == 1)
- {
- flag = 0;
- P0 = ~(0x80 >> r_cnt);
- r_cnt++;
- if(r_cnt >= 8)
- {
- r_cnt = 0;
- led_flag = 0;
- }
- }
- }
- }
- }
- void main()
- {
- ConfigTimer0(1);//定时1ms
-
- while(1)
- {
- led_show();
- }
- }
- /* 配置并启动 T0, ms-T0 定时时间 */
- void ConfigTimer0(u16 ms)
- {
- u32 tmp; //临时变量
-
- EA = 1;
- tmp = 11059200 / 12; //定时器计数频率
- tmp = (tmp * ms) / 1000; //计算所需的计数值
- tmp = 65536 - tmp; //计算定时器重载值
- tmp = tmp + 12; //补偿中断响应延时造成的误差
- T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节
- T0RL = (unsigned char)tmp;
- TMOD &= 0xF0; //清零 T0 的控制位
- TMOD |= 0x01; //配置 T0 为模式 1
- TH0 = T0RH; //加载 T0 重载值
- TL0 = T0RL;
- ET0 = 1; //使能 T0 中断
- TR0 = 1; //启动 T0
- }
- /* T0 中断服务函数,执行 100ms 定时 */
- void InterruptTimer0() interrupt 1
- {
- TH0 = T0RH; //重新加载重载值
- TL0 = T0RL;
-
- flag++;
- }
复制代码
使用定时器来实现左右循环移动的流水灯,请各位帮忙指点
|
|