焊接资讯

您现在的位置是:首页 > led灯 > 正文

led灯

包含led灯流水灯程序switch语句的词条

工品易达2022-11-13led灯14

单片机流水灯用switch语句,灯不亮,程序哪里错了?求大佬们讲解。

首先Kay里面,按键抬起检测是while(Key==0);不要无休止的i++;造成状态不确定

其次,A1() A2()等都是死循环,进去就出不来了

还有dat2就没用

单片机流水灯编程

/*********************************************************

程序功能:用固定频率的方波驱动蜂鸣器,共16种音调;在蜂鸣器

发出不同音调的同时,LED发光以二进制数字形式指示

当前音调的编号(1~16)

----------------------------------------------------------

测试说明:聆听蜂鸣器发声的音调变化。

**********************************************************/

#include msp430.h

#include "BoardConfig.h"

uchar step = 0xff;

/************************主函数************************/

void main( void )

{

uchar i;

WDTCTL = WDTPW + WDTHOLD; //关狗

BoardConfig(0xb0); //关数码管、流水灯和电平转换

/*------选择系统主时钟为8MHz-------*/

BCSCTL1 = ~XT2OFF; //打开XT2高频晶体振荡器

do

{

IFG1 = ~OFIFG; //清除晶振失败标志

for (i = 0xFF; i 0; i--); //等待8MHz晶体起振

}

while ((IFG1 OFIFG)); //晶振失效标志仍然存在?

BCSCTL2 |= SELM_2 + SELS; //MCLK和SMCLK选择高频晶振

TACCTL0 |= CCIE; //使能比较中断

TACTL |= TASSEL_2 + ID_3 ; //计数时钟选择SMLK=8MHz,1/8分频后为1MHz

TBCCR0 = 4096*2 - 1; //周期两秒

TBCCTL0 |= CCIE;

TBCTL |= TBSSEL_1 + ID_3 + MC_1; //时钟源ACLK/8,up mode

P6DIR |= BIT7; //蜂鸣器对应IO设置为输出

P2DIR = 0xff;

P2OUT = 0xff;

_EINT();

LPM1;

}

/*******************************************

函数名称:Timer_A

功 能:定时器A的中断服务函数,在这里驱动

蜂鸣器发声

参 数:无

返回值 :无

********************************************/

#pragma vector=TIMERA0_VECTOR

__interrupt void Timer_A (void)

{

P6OUT ^= BIT7; // Toggle P6.7

}

/*******************************************

函数名称:Timer_B

功 能:定时器B的中断服务函数,在这里更改

蜂鸣器发声频率

参 数:无

返回值 :无

********************************************/

#pragma vector=TIMERB0_VECTOR

__interrupt void Timer_B (void)

{

if(step == 0xff) //up mode

TACTL |= MC_1;

step++;

switch(step)

{

case 0: TACCR0 = 5000; P2OUT = ~1; break; // 100Hz

case 1: TACCR0 = 2500; P2OUT = ~2; break; // 200Hz

case 2: TACCR0 = 1250; P2OUT = ~3; break; // 400Hz

case 3: TACCR0 = 625; P2OUT = ~4; break; // 800Hz

case 4: TACCR0 = 500; P2OUT = ~5; break; // 1KHz

case 5: TACCR0 = 250; P2OUT = ~6; break; // 2KHz

case 6: TACCR0 = 167; P2OUT = ~7; break; // 3KHz

case 7: TACCR0 = 125; P2OUT = ~8; break; // 4KHz

case 8: TACCR0 = 100; P2OUT = ~9; break; // 5KHz

case 9: TACCR0 = 83; P2OUT = ~10; break; // 6KHz

case 10: TACCR0 = 71; P2OUT = ~11; break; // 7KHz

case 11: TACCR0 = 63; P2OUT = ~12; break; // 8KHz

case 12: TACCR0 = 56; P2OUT = ~13; break; // 9KHz

case 13: TACCR0 = 50; P2OUT = ~14; break; // 10KHz

case 14: TACCR0 = 33; P2OUT = ~15; break; // 15KHz

case 15: TACCR0 = 25; P2OUT = ~16; break; // 20KHz

case 16: step = 0xff; // 循环播放

}

}

单片机流水灯switch语句有问题,为什么灯不亮?

你这程序并不是switch语句有问题,而是你的3个子程序A1、A2、A3中都用了while(1)语句,这是无限循环的,只允许在主程序中用,而不允许在子程序里再用,那样会在子程序中无限循环了。按键子程序同样是while语句用的不对。修改好下,而且声明变量 i 时初值不能为1,应该是0。

3个子程序去掉while语句,以A1为例

用汇编语言编流水灯,有8个LED灯,LED1~LED8 灯按顺序点亮,每个等亮一秒转到下个灯,一直循环亮

这个流水灯是很普通的一种花样,假设LED接P1口,程序如下:

ORG 0000H

LJMP MAIN

0RG 000BH

LJMP T0ISR

ORG 0030H

MAIN:

MOV TMOD,#01H

MOV TH0,#HIGH(65536-50000) ;50毫秒定时

MOV TL0,#LOW(65536-50000)

SETB TR0

SETB ET0

SETB EA

MOV A,#0FEH

MOV P1,A

MOV R2,#20

SJMP $

T0ISR:

CLR TR0

MOV TH0,#HIGH(65536-50000)

MOV TL0,#LOW(65536-50000)

SETB TR0

DJNZ R2,T0E ;1秒未到直接退出

MOV R2,#20

RL A

MOV P1,A ;1秒一变的花样流水灯。

T0E:

RETI

END

单片机 怎么把led , 流水灯 , 按键 在一起实现?

你这种LED流水灯程序单片机占用资源太大了,你写个按键估计都不能用,单片机大部分时间在软件延时上面,你可以用定时器定时使用switch语句控制LED流水灯,在主程序里面执行按键扫描,这样单片机执行起来一点压力都没有,也不会占用单片机资源。

关于led灯流水灯程序switch语句和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。微信号:ymsc_2016

发表评论

评论列表

  • 这篇文章还没有收到评论,赶紧来抢沙发吧~