各位UU们帮我看看这个题目

用51单片机编写一个广告灯函数。所谓广告灯:先D1和D3同时亮;延时800ms后,D2和D4继续亮;以此类推,D5和D7点亮,延时800ms后D6和D8点亮。如此周而复始。要求:800ms是准确的,必须使用计时器T1,方式1来实现。按下某个按键K4,蜂鸣器响一声,广告灯开始启动,再次按下该按键,蜂鸣器响一声,广告灯反向启动。按键必须是用外中断1来实现。

不知道你到底要怎么样,单片的问题跑C#问?当然语言无所谓,具体实现各自语言各自实现,我们描述思路就好
当然,反向启动(这个意思我不太清楚)我也不打算深究。我只描述思路
这类玩意类似十字路口交通灯控制,思路有2种
1.状态机思路---定时改变状态,然后根据状态操作,这种大多数人都可以弄,只是弄清楚状态机(状态机实现到不困难只是思路要清晰,你可以用啥泳道图,时序图,条件迁移图去帮助分析和实现)
2.三角函数周期波控制----------------为了描述这个,我们先拿一个点说,假设一个控制点亮灭是周期的,我们当然可以用一个波函数去控制它,比如
点1状态=sin(i) 然后不停更改i,取求状态,当他1时点亮他,当他-1时熄灭他
为啥要用这个呢?因为这样可以引入相位值。 比如你的题目:D1和D3是一个相位,D2和D4其实就是另一个相位(这个相位其实就是D1那组相位平移后的描述)
这样状态变更就只是一串和时间相关的函数,而反向到容易了(在波形控制体系离,你想反向,只需简单降sin变成cos,或者把相位整体平移半周期)