当前位置:首页 > 单片机 > 单片机
[导读] 电路:P0.0、P0.1 分别外接一个 LED,输出高电平时,LED 发光。   P2.0 外接一个按键。请“不用延时程序”写个这样的程序:当按键不按的时候,LED(D1)先以1秒的时间快闪三下,然后再以3秒的时间慢

电路:P0.0、P0.1 分别外接一个 LED,输出高电平时,LED 发光。
   P2.0 外接一个按键。
请“不用延时程序”写个这样的程序:
当按键不按的时候,LED(D1)先以1秒的时间快闪三下,然后再以3秒的时间慢闪三下。
若按下按键后,LED(D2)先以1秒的时间快闪三下,然后再以3秒的时间慢闪三下。
是不用“不用延时程序”写的哦。(*^__^*)……

问题补充: 请用C语言写。
当按键按下、松开,都应该立即转到相应的 LED 先以1秒的时间快闪三下,然后再以3秒的时间慢闪三下。


;============================================
最佳答案:“不用延时程序”,就是要求用定时器控制时间,这和时钟程序的思路是相同的。
下列程序,已经调试成功:
//-----------------------------------------------
#include

unsigned char n_25ms, M1_n, M2_n, Last_p2, in_p2;
unsigned char code O_c[] = {
0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00,
0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00};
bit TT_f;
//-----------------------------------------------
void main()
{
P0 = 0;
TMOD = 0x01;
TH0 = (65536 - 12500) / 256;//12.5ms@12MHz
TL0 = (65536 - 12500) % 256;
TR0 = 1;
ET0 = 1;
EA = 1;
n_25ms = 0;
M1_n = 0;
TT_f = 0;
Last_p2 = P2;
while(1) ;
}
//-----------------------------------------------
void T0_INT() interrupt 1
{
TH0 = (65536 - 12500) / 256;//12.5ms@12MHz
TL0 = (65536 - 12500) % 256;
n_25ms++;
//**********************************按键检测与状态的变换
in_p2 = 8;
if (P2 == 255) in_p2 = 0;
M2_n = 8;
if (TT_f) M2_n *= 3;
if (P2 != Last_p2) {
Last_p2 = P2;
n_25ms = M2_n;
M1_n = 0;
TT_f = 0;
}
//**********************************
if (n_25ms == M2_n) { //如果到预定的时间
n_25ms = 0; //清零
M1_n++; //输出下一个数据
if (M1_n == 8) { //输出8个了?
M1_n = 0; //清零
TT_f = ~TT_f; //变更状态
}
P0 = O_c[M1_n + in_p2];//输出数据
}
}
//-----------------------------------------------
注意,P0口需要加上上拉电阻。
;============================================

;============================================
后记:

这个题目的要求有些令人费解,即要有定时中断,还有按键的检测,按键不变时,输出还要有两种花样。

有人给出了如下的建议:
-------------------------------------------------
用定时器吗!你先做出1秒的基准,3个基准就是3秒。
主函数用:
if(按键标志位位0) {
for(循环3次) {点亮LED1,一秒后,灭LED1}
for(循环3次) {等3秒,点亮LED1,3秒后,灭LED1}
else {
for(循环3次) {点亮LED1,一秒后,灭LED1}
for(循环3次) {等3秒,点亮LED2,3秒后,灭LED2}
}
没有写定时程序,自己写吧
回答者: ---------- | 四级 | 2011-9-29 11:19
-------------------------------------------------
这个回答,缺少按键变化时,“即时”更改显示位置的功能,LED 闪烁的也明显不对。
这个回答,在主程序里面,放了这么多的循环!呵呵,这也太占用 CPU 的资源了。
这个回答,可以到原题网址看到原文。

做而论道写的程序,思路和定时时钟、定时的交通灯,基本一致。
在中断函数中,仅仅用下面几行,就进行了按键检测与状态的变换:

//**********************************按键检测与状态的变换
in_p2 = 8;
if (P2 == 255) in_p2 = 0;
M2_n = 8;
if (TT_f) M2_n *= 3;
if (P2 != Last_p2) {
Last_p2 = P2;
n_25ms = M2_n;
M1_n = 0;
TT_f = 0;
}
//**********************************

这些程序,每隔 12.5ms 才执行一遍,执行时,也用不上几十微秒,对系统资源的占用,是很微小的。
这样,主函数,就几乎可用全部的时间,执行各种程序。

做而论道编写的程序,完全没有使用那么多的循环,同样可以满足题目的要求,大家可以自己实验。

上述的程序是如何解释的,这就不好说了,读者的水平参差不齐,有缘者自己领会吧。
;============================================


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭