|
- #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++;
- }
復制代碼
使用定時器來實現左右循環移動的流水燈,請各位幫忙指點
|
-
-
LED流水燈.rar
2019-11-8 15:24 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
55.06 KB, 下載次數: 5, 下載積分: 黑幣 -5
|