按键亮灯和跑马灯程序

合集下载

跑马彩灯控制方案

跑马彩灯控制方案

跑马彩灯控制方案简介跑马彩灯是一种常见的装饰灯具,通过控制跑马灯的亮灭、颜色和亮度变化,可以创造出各种炫目的灯光效果。

在节日庆典、宴会场所、夜市、景区等场合,跑马彩灯常常被用于增添气氛。

本文档将介绍一种基于Arduino控制器的跑马彩灯控制方案。

材料准备要实现跑马彩灯控制方案,需要以下材料: 1. Arduino UNO控制器:用于控制跑马彩灯的亮灭和灯光效果。

2. 杜邦线:用于连接Arduino控制器和彩灯。

3. 跑马彩灯电源:用于给彩灯供电。

4. 跑马彩灯:可以根据需求选择适合的跑马彩灯。

硬件连接首先,将Arduino控制器和彩灯电源通过杜邦线连接起来。

将Arduino的GND引脚连接到彩灯电源的负极,并将Arduino的5V引脚连接到彩灯电源的正极。

接下来,将彩灯的控制引脚(通常为数据引脚)连接到Arduino的数字引脚。

具体连接方式取决于所使用的跑马彩灯。

通常,彩灯的控制引脚通过杜邦线连接到Arduino的数字引脚2。

连接完成后,确保所有线路连接牢固可靠,并避免出现短路情况。

软件编程跑马彩灯控制方案使用Arduino编程语言进行编程。

以下是控制彩灯的示例代码:// 跑马彩灯控制示例代码// 定义彩灯控制引脚int ledPin = 2;void setup() {// 设置彩灯引脚为输出模式pinMode(ledPin, OUTPUT);}void loop() {// 点亮彩灯digitalWrite(ledPin, HIGH);// 延时一段时间delay(500); // 延时时间可根据需要进行调整// 熄灭彩灯digitalWrite(ledPin, LOW);// 延时一段时间delay(500); // 延时时间可根据需要进行调整}在上述代码中,我们首先定义了控制彩灯的引脚为数字引脚2。

在setup()函数中,我们将该引脚设置为输出模式。

然后,在loop()函数中,我们通过digitalWrite()函数控制彩灯的亮灭。

msp430Led按键控制灯亮程序

msp430Led按键控制灯亮程序

1.Led灯控制程序#include "msp430g2553.h"void main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD; //关闭看门狗//P1DIR = 0x41;//P1OUT = 0x41; //程序点亮led1//P1DIR |=BIT0+BIT6;//P1OUT |=BIT0+BIT6; //程序点亮led2P1DIR |=BIT0;P1OUT |=BIT0;P1DIR |=BIT6;P1OUT &=~BIT6;while(1){P1OUT ^=BIT0;P1OUT ^=BIT6;__delay_cycles(1000000);} //led交替亮,持续1s2.Led按键控制灯亮#include "msp430g2553.h"void main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;//关闭看门狗P1DIR &=~BIT3;P1DIR |=BIT0;P1IES |=BIT3;P1IE |=BIT3;_EINT();_BIS_SR(LPM0_bits+GIE);}#pragma vector=PORT1_VECTOR__interrupt void PORT1_ISR(void){int i;char pushkey;pushkey=P1IFG&BIT3;//第三位中断标志位for(i=0;i<1000;i++)//短暂延时软件去抖if((P1IN&pushkey)==pushkey){P1IFG=0;//中断标志清零return;}if(P1IFG&BIT3)//判断按键是否按下{P1OUT^=BIT0;}P1IFG=0;return;}3.矩阵键盘和数码管程序#include <msp430g2553.h>#include"Key&Display.h"//unsigned char Receive(void);void main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;Init_4lines_Mode();//初始化4线工作模式Send_Command(CH452_RESET);//CH452芯片内部复位Send_Command(KeyDisplay_ON);//允许显示驱动并启动键盘扫描//开中断,P2.0接CH452的DOUT引脚,当有键按下时,DOUT上产生由高到低的脉冲// P2SEL &= ~(BIT6+BIT7);P2IE|=BIT0;P2IES|=BIT0;P2IFG&=~BIT0;_EINT();while(1){}}//中断处理函数#pragma vector = PORT2_VECTOR//中断处理程序,接收到DOUT脉冲信号时,运行之__interrupt void Port2(void){unsigned char Keyvalue;Send_Command(CH452_GET_KEY);//单片机向CH452发送读取按键代码命令Keyvalue=Key_Read();// Keyvalue=Receive();switch(Keyvalue){case 0x40://按键K0按下{Send_Command( NDis1); //第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis00);//第0位数码管显示0break;}case 0x41://按键K1按下{Send_Command( NDis1); //第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis01);//第0位数码管显示1break;}case 0x42://按键K2按下{Send_Command( NDis1); //第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis02);//第0位数码管显示2break;}case 0x43://按键K3按下{Send_Command( NDis1);//第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis03);//第0位数码管显示3break;}case 0x48://按键K4按下{Send_Command( NDis1);//第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis04);//第0位数码管显示4break;}case 0x49://按键K5按下{Send_Command( NDis1);//第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis05);//第0位数码管显示5break;}case 0x4A://按键K6按下{Send_Command( NDis1);//第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis06);//第0位数码管显示6break;}case 0x4B://按键K7按下{Send_Command( NDis1);//第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis07);//第0位数码管显示7break;}case 0x50://按键K8按下{Send_Command( NDis1);//第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis08);//第0位数码管显示8break;}case 0x51://按键K9按下{Send_Command( NDis1);//第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis09);//第0位数码管显示9break;}case 0x52://按键K10按下{Send_Command(Dis00);//第0个数码管显示字符"0"Send_Command(Dis11);//第1个数码管显示字符"1"break;}case 0x53://按键K11按下{Send_Command(Dis01);//第0个数码管显示字符"1"Send_Command(Dis11);//第1个数码管显示字符"1"break;}case 0x58://按键K12按下{Send_Command(Dis02);//第0个数码管显示字符"2"Send_Command(Dis11);//第1个数码管显示字符"1"break;}case 0x59://按键K13按下{Send_Command(Dis03);//第0个数码管显示字符"3"Send_Command(Dis11);//第1个数码管显示字符"1"break;}case 0x5A://按键K14按下{Send_Command(Dis04);//第0个数码管显示字符"4"Send_Command(Dis11);//第1个数码管显示字符"1"break;}case 0x5B://按键K15按下{Send_Command(Dis05);//第0个数码管显示字符"5"Send_Command(Dis11);//第1个数码管显示字符"1"break;}default:break;}P2IFG&=~BIT0;}4.红灯0.2秒闪一次,绿灯0.8秒闪一次#include <msp430g2553.h>void main(void){WDTCTL = WDTPW + WDTHOLD; // Stop WDT BCSCTL1 &=~XTS; //配置时钟BCSCTL3 |=LFXT1S_2;IFG1 &=OFIFG;P1DIR |=BIT0+BIT6; // P1.0,P1.6 output P1OUT &=~BIT0; // P1.0,P1.6置0 P1OUT &=~BIT6;TACCR0 = 12000-1; //1秒定时,产生中断TACCR1 = 2400; //频率0.2*12000,定时0.2秒TACCR2 = 9600; //定时0.8秒TACTL = TASSEL_1 + MC_1+TAIE; // ACLK, 增计数模式TACCTL1 |=CCIE; // TACCR1中断使能TACCTL2 |=CCIE; // TACCR1中断使能_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt}// Timer_A3 Interrupt Vector (TA0IV) handler#pragma vector=TIMER0_A1_VECTOR__interrupt void Timer_A(void){switch( TA0IV ){case 2: P1OUT ^= BIT0; // 捕获/比较寄存器TACCR1break;case 4: P1OUT ^= BIT6;break; // 捕获/比较寄存器TACCR2case 10: break; // 未使用,计数达到TACCRO时执行中断,即1秒执行一次}}5.PMW波控制led灯亮度#include "msp430g2553.h"void main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;P1DIR |=BIT6; //方向寄存器P1SEL |=BIT6; //功能寄存器TACTL=TASSEL_2+MC_1+ID_0; //定时器A控制寄存器选择增计数模式TACCTL1 |=OUTMOD_3; //捕获/比较控制寄存器TACCR0=1000-1;TACCR1=10;_BIS_SR(CPUOFF);}。

单片机 跑马灯实验精选全文

单片机 跑马灯实验精选全文

可编辑修改精选全文完整版实验一跑马灯实验一、实验内容1、基本的流水灯根据图1电路,编写一段程序,使8个发光二极管D1、D2、D3、D4、D5、D6、D7、D8顺序(正序)点亮:先点亮D1,再点亮D2、D3……D8、D1……,循环点亮。

每点亮一个LED,采用软件延时一段时间。

2、简单键控的流水灯不按键,按正序点亮流水灯;按下K1不松手,按倒序点亮流水灯,即先点亮D8,再顺序点亮D7、D6……D1、D8……。

松手后,又按正序点亮流水灯。

3、键控的流水灯上电,不点亮LED,按一下K1键,按正序点亮流水灯。

按一下K2键,按倒序点亮流水灯,按一下K3键,全部关闭LED。

二、实验方案1、总体方案设计考虑到K4键未被使用,所以将实验内容中的三项合并到一个主函数中:K4键代替实验内容第二项中的K1键;单片机一开机即执行实验内容第一项;K1、K2、K3键实现实验内容第三项。

所用硬件:AT89C52、BUTTON、LED-BLUE、电源输入:P2.0-K1;P2.1-K2;P2.2-K3;P2.3-K4。

低电平有效输出:P0.0~P0.7-D0~D7。

LED组连线采用共阳极,低电平有效软件设计:软件延时采用延时函数delay(t),可调整延迟时间:void delay(uint t){uint i;while(t--)for(i=0;i<1000;i++){if(P2!=oldK&&P2!=K[0])break;//按下了其他键退出循环}}由于涉及到按键变化所以要设置一个变量oldK保留按键键值,要在延时程序中检测是否按键,当按键后立即设置oldK的值。

按键判断采用在while循环中利用条件语句判断P2的值然后执行该键对应的代码段,达到相应的响应。

为了让K4键的效果优化,即状态变化从当前已亮灯开始顺序点亮或逆序点亮,利用全局变量n来记录灯号,利用算法即可实现。

主要算法:1、全局变量的定义:uchar D[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0X7f};//单个LED亮uchar AllOff=0xff;//LED全灭uchar AllOn=0x00;//LED全亮uchar K[]={0xff,0xfe,0xfd,0xfb,0xf7};//按键开关uchar oldK;//记录已按键int n;2、顺序、逆序点亮流水灯:void forward(){for(n=0;n<=7;n++){out=D[n];delay(15);if(P2!=oldK&&P2!=K[0])break;}out=AllOff;}void backward(){for(n=7;n>=0;n--){out=D[n];delay(15);if(P2!=oldK&&P2!=K[0])break;}out=AllOff;}3、实验内容第二项流水灯灯亮顺序变换:void hold(){n=8;while(1){if(P2==K[4]){//一直按着K4键,逆序点亮跑马灯oldK=K[4];if(n==-1)n=7; //D0灯亮后点亮D7while(n>=0){out=D[n];n--;if(delay4(15))break;}}if(P2==K[0]){//未按下K4键,一直正序点亮跑马灯oldK=K[0];if(n==8)n=0;//D7灯亮后点亮D0while(n<=7){out=D[n];n++;if(delay4(15))break;}}if(P2!=K[4]&&P2!=K[0]){//按下了其他键,退出hold函数break;}}}4、对应实验内容第一项,开机顺序点亮流水灯:while(1){//开机即正序点亮流水灯forward();if(P2!=K[0]){break;}}2、实验原理图图2-1 实验原理图3、程序流程图图2-2 程序流程图三、源程序#include"reg51.h"#define uchar unsigned char#define uint unsigned int#define out P0uchar D[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0X7f};//单个LED亮uchar AllOff=0xff;//LED全灭uchar AllOn=0x00;//LED全亮uchar K[]={0xff,0xfe,0xfd,0xfb,0xf7};//按键开关uchar oldK;//记录已按键int n;//记录当前亮的灯号void delay(uint t){uint i;while(t--)for(i=0;i<1000;i++){if(P2!=oldK&&P2!=K[0])break;//按下了其他键退出循环}}void delay10ms(){uint i;for(i=0;i<10000;i++);}void forward(){for(n=0;n<=7;n++){out=D[n];delay(15);if(P2!=oldK&&P2!=K[0])break;}out=AllOff;}void backward(){for(n=7;n>=0;n--){out=D[n];delay(15);if(P2!=oldK&&P2!=K[0])break;}out=AllOff;}int delay4(uint t){uint i;while(t--)for(i=0;i<1000;i++){if(P2!=oldK){ //按键变化退出循环return 1;}}return 0;}void hold(){n=8;while(1){if(P2==K[4]){//一直按着K4键,逆序点亮跑马灯oldK=K[4];if(n==-1)n=7; //D0灯亮后点亮D7while(n>=0){n--;if(delay4(15))break;}}if(P2==K[0]){//未按下K4键,一直正序点亮跑马灯oldK=K[0];if(n==8)n=0;//D7灯亮后点亮D0while(n<=7){out=D[n];n++;if(delay4(15))break;}}if(P2!=K[4]&&P2!=K[0]){//按下了其他键,退出hold函数break;}}}void main(){oldK=K[0];while(1){//开机即正序点亮流水灯forward();if(P2!=K[0]){break;}}while(1){out=AllOff;if((P2&0x0f)!=0x0f){//检测有键按下delay10ms();//延时10ms再去检测//P2.0_K1键按下正序点亮流水灯if(P2==K[1]){oldK=K[1];while(1){forward();if(P2!=K[1]&&P2!=K[0]){//按下了其他键,退出break;}}}//P2.1_K2键按下逆序点亮流水灯if(P2==K[2]){while(1){backward();if(P2!=K[2]&&P2!=K[0]){//按下了其他键,退出break;}}}//P2.2_K3键按下关闭全部LEDif(P2==K[3]){oldK=K[3];out=AllOff;}//P2.3_K4键按下长按逆序点亮流水灯,不按正序点亮流水灯,直到其他键按下停止if(P2==K[4]){hold();}}}}四、实验结果1、基本的流水灯:开机后即重复顺序点亮流水灯,等待其他按键。

11.2 跑马灯控制程序设计

11.2 跑马灯控制程序设计
厦电气门控大制学实物践理训与练M机O电OC工课程程学团院队
二、跑马灯控制程序设计 结合顺序控制设计法来设计跑马灯控制程序。
首先来看一下该任务的控制要求: 要求通过启动按钮SB1使得8盏灯按照L0、L1~L7的 顺序亮,每隔1S亮一盏灯;再按L7、L6~L1、L0的 顺序灭,每隔1S灭一盏灯;如此循环,直至按下停 止按钮SB2,全部灯熄灭,停止工作。
下面我们按步来看一下程序的编写: (2)S1步:S1步是起始步,表示程序开始运行,满足 转换条件SB1可以进入S2步。SB1为启动按钮I0.0,按 下后程序开始运行,S2步激活。我们使用M0.0来指示 启停状态,M0.0为1表示启动,M0.0为0表示停止。这 段程序比较简单,使用置位线圈指令,当I0.0按下, 使M0.0置位为1。
厦电气门控大制学实物践理训与练M机O电OC工课程程学团院队
(4)S3步和S4步
S3步负责控制左移,S4步负责控制右移,这两步 是密切相关的。由于操作对象是MW20,是一个字的存 储空间,所以我们要选择字的移位指令。如图蓝色圈 中所示,使用移位脉冲T1,T1每1S产生一个下降沿, 检测这个下降沿使移位指令产生移位。如图红色圈中 所示,在写入初值后,一次移一位,先左移,就会看 到MB20的各个位,从M20.0至M20.7依次变1;等M20.7 变1了,再右移,一次移一位,就会看到MB20的各个 位,从M20.7至M20.0依次变0。
厦电气门控大制学实物践理训与练M机O电OC工课程程学团院队
第二项工作是为移位对象写入初值,有的同学要 问了,移位对象不是输出Q0.0至Q0.7吗?应该这么说 ,控制Q0.0至Q0.7是我们的目的,怎么来达到这个目 的呢?为了避免直接控制输出所带来的误操作,我们 要使用一个中间存储空间MW20来作为移位对象,将移 位后的结果通过MB20来传送到QB0。我们来看看这个 MW20的空间,MW20包含MB20和MB21两个字节,给这个 空间填入初值W#16#FF,这时MB20的各个位为0,MB21 的各个位为1。

依次逐个亮灯并且每次只能亮一个灯的跑马灯程序

依次逐个亮灯并且每次只能亮一个灯的跑马灯程序

依次逐个亮灯并且每次只能亮⼀个灯的跑马灯程序#include "REG52.H"#define const_time_level_01_08 200 //第1个⾄第8个LED跑马灯的速度延时时间void initial_myself();void initial_peripheral();void delay_short(unsigned int uiDelayShort);void delay_long(unsigned int uiDelayLong);void led_flicker_01_08(); //第1个⾄第8个LED跑马灯程序,逐个亮且每次只能亮⼀个void hc595_drive(unsigned char ucLedStatusTemp08_01);void led_updata(); //LED更新函数void T0_time(); //定时中断函数sbit hc595_sh_dr=P3^6; //上升沿时,数据寄存器数据移位sbit hc595_st_dr=P3^5; //上升沿时移位寄存器的数据进⼊数据寄存器,下降沿时数据不变。

当移位结束后,会产⽣⼀个正脉冲,⽤于更新显⽰数据。

sbit hc595_ds_dr=P3^4; //串⾏数据输⼊端,级联的话接上⼀级的Q7unsigned char ucLed_dr1=0; //代表8个灯的亮灭状态,0灭,1亮unsigned char ucLed_dr2=0;unsigned char ucLed_dr3=0;unsigned char ucLed_dr4=0;unsigned char ucLed_dr5=0;unsigned char ucLed_dr6=0;unsigned char ucLed_dr7=0;unsigned char ucLed_dr8=0;unsigned char ucLed_updata=0; //刷新变量。

跑马灯课程设计

跑马灯课程设计

摘要:本设计使用89C51芯片,利用P0的8个端口连接8个发光二极管,通过P0.0到P0.7的值控制“跑马灯”的亮灭,以达到显示效果。

设计的中断程序要对多个按键动作进行响应,灯光变换的花样有4种,用4个按键k0,k1,k2,k3切换。

按下k1键,程序作左向流水灯; 按下k2按键程序作右向流水灯; 按下k3键为亮点向中间移动; 按下k4键为执行亮点向两边移动。

浏览了网上的各种作品及代码,通过各种实现代码的比较,和各种优化,总结出本程序,以较优秀的代码实现各种可控的“跑马”功能。

引言:本设计用4个开关按键控制8个发光二极管,组成为一排跑马灯进行各种样式的亮灯形式,在中断程序中处理多个按键动作的响应,以控制一排跑马灯的工作。

1设计概述本程序设计意在展示跑马灯的色彩样式及“跑马”变换效果,如果将跑马灯做大,会有很高的观赏价值。

我查阅书籍资料,浏览网上的各种作品及代码,通过各种实现代码的比较,和各种优化,总结出本程序,以较优秀的代码实现各种可控的“跑马”功能。

本设计的中断程序要对多个按键动作进行响应,灯光变换的花样有4种,用4个按键k1,k2,k3,k4切换。

进入程序后,程序作双向流水灯;按下k1键,程序作左向流水灯; 按下k2按键程序作右向流水灯; 按下k3键为亮点向中间移动; 按下k4键为执行亮点向两边移动。

2硬件电路设计及描述本设计使用89C51芯片,利用P0的8个端口连接8个发光二极管,通过P0.0到P0.7的值控制“跑马灯”的亮灭,以达到显示效果,连接图如图1所示。

图1:硬件电路连接图1利用P1.0到P1.3这4个端口作为4个控制开关的输入,控制开关连接INT0中断,按键触发中断响应以停止“跑马灯”当前的执行样式,进而改变跑马灯的显示样式。

图2:硬件电路连接图2综上所述,总体的电路连接如图3:图3:总体硬件电路连接图3软件设计流程及描述主程序的设计思路为,开始时执行左右流水灯,在中断服务程序中,首先读取按键状态,然后延时10ms,再次读取按键状态。

两个按键控制三个led的c语言程序

两个按键控制三个led的c语言程序

两个按键控制三个led的c语言程序以两个按键控制三个LED的C语言程序在嵌入式系统中,控制LED灯是一个常见的任务。

我们可以使用C 语言编写程序来实现这一功能。

本文将介绍如何使用两个按键来控制三个LED灯的亮灭。

我们需要准备一些硬件设备。

我们需要一个嵌入式开发板,上面有三个LED灯和两个按键。

这些LED灯和按键通常都有对应的引脚,我们需要将它们连接到开发板上。

接下来,我们可以开始编写C语言程序。

我们可以使用一个循环来不断检测按键的状态,并根据按键的状态来控制LED灯的亮灭。

我们需要定义LED灯和按键的引脚号码。

我们可以使用宏定义来给它们命名,这样可以方便我们在程序中使用。

```c#define LED1_PIN 2#define LED2_PIN 3#define LED3_PIN 4#define BUTTON1_PIN 5#define BUTTON2_PIN 6```接下来,我们需要初始化引脚的状态。

LED灯的引脚需要设置为输出模式,而按键的引脚需要设置为输入模式。

```cpinMode(LED1_PIN, OUTPUT);pinMode(LED2_PIN, OUTPUT);pinMode(LED3_PIN, OUTPUT);pinMode(BUTTON1_PIN, INPUT);pinMode(BUTTON2_PIN, INPUT);```然后,我们可以进入一个无限循环,不断检测按键的状态,并根据按键的状态来控制LED灯的亮灭。

```cwhile(1) {if(digitalRead(BUTTON1_PIN) == HIGH) {digitalWrite(LED1_PIN, HIGH);digitalWrite(LED2_PIN, LOW);digitalWrite(LED3_PIN, LOW);} else if(digitalRead(BUTTON2_PIN) == HIGH) {digitalWrite(LED1_PIN, LOW);digitalWrite(LED2_PIN, HIGH);digitalWrite(LED3_PIN, LOW);} else {digitalWrite(LED1_PIN, LOW);digitalWrite(LED2_PIN, LOW);digitalWrite(LED3_PIN, HIGH);}}```在上面的代码中,我们使用digitalRead函数来读取按键的状态,如果按键被按下,该函数将返回HIGH,否则返回LOW。

汇编按键控制led灯亮灭编写程序 概述

汇编按键控制led灯亮灭编写程序 概述

汇编按键控制led灯亮灭编写程序概述1. 引言1.1 概述本文旨在介绍使用汇编语言编写程序,以实现按键控制LED灯亮灭的功能。

通过该实验,我们可以深入了解汇编语言的基本原理和操作方法,并学会将其应用于具体的电路控制中。

1.2 文章结构本文主要分为四个部分,分别是引言、汇编按键控制LED灯亮灭编写程序、程序测试与调试过程及结果分析以及总结和展望。

在引言部分,我们将简要介绍文章的背景和目的,为读者提供整个实验的概览。

接下来的部分将逐步介绍硬件准备工作、程序设计思路、关键代码解读与实现步骤等内容。

随后,我们将介绍测试环境搭建、测试过程记录以及结果分析与优化方案等内容。

最后,在总结和展望部分,我们将对整个实验进行总结,并提出改进方向和未来发展方向。

1.3 目的本文的目的是帮助读者了解如何使用汇编语言编写按键控制LED灯亮灭的程序,通过这一示例项目引导读者熟悉汇编语言的基础知识,并培养其分析和解决问题的能力。

通过实验过程,读者可以了解硬件准备工作、程序设计思路以及测试调试过程,并能够根据实际需求进行结果分析和优化方案的提出。

此外,本文还展望了未来发展方向,希望读者能够在此基础上进一步探索和应用汇编语言的相关知识。

以上是文章“1. 引言”部分的内容,旨在概述本文的背景、结构和目的。

如果需要更加详细的内容,请继续阅读后续章节。

2. 汇编按键控制LED灯亮灭编写程序:2.1 完成硬件准备工作:在开始编写汇编程序之前,首先需要进行硬件准备工作。

我们将使用一个单片机来控制LED灯的亮灭,并通过按键来触发控制操作。

为此,我们需要将LED与单片机的输出引脚连接,并将按键与单片机的输入引脚连接。

确保电路连接正确无误后,我们可以开始进行程序设计。

2.2 程序设计思路:在本部分中,我们将介绍如何使用汇编语言设计一个按键控制LED灯亮灭的程序。

该程序的基本原理是通过检测按键状态来改变LED的亮度状态,即当按键被按下时,LED亮起;当按键未被按下时,LED熄灭。

4p口32个灯作跑马灯依次全亮依次全灭

4p口32个灯作跑马灯依次全亮依次全灭
LCALL DELAY ;(2)延时一段时间
CLR P1.7 ;(3)点亮灯
LCALL DELAY ;(4)延时一段时间
SETB P1.7 ;(5)熄灭灯
SETB P3.0 ;(1)熄灭灯
LCALL DELAY ;(2)延时一段时间
CLR P1.2 ;(5)熄灭灯
CLR P1.3 ;(1)熄灭灯
LCALL DELAY ;(2)延时一段时间
CLR P1.3 ;(3)点亮灯
LCALL DELAY ;(4)延时一段时间
CLR P1.3 ;(5)熄灭灯
CLR P1.4 ;(1)熄灭灯
LCALL DELAY ;(2)延时一段时间
CLR P0.0 ;(3)点亮灯
LCALL DELAY ;(4)延时一段时间
SETB P0.0 ;(5)熄灭灯
CLR P1.0 ;(1)熄灭灯
LCALL DELAY ;(2)延时一段时间
SETB P0.3 ;(5)熄灭灯
SETB P0.2 ;(1)熄灭灯
LCALL DELAY ;(2)延时一段时间
CLR P0.2 ;(3)点亮灯
LCALL DELAY ;(4)延时一段时间
SETB P0.2 ;(5)熄灭灯
SETB P0.1 ;(1)熄灭灯
LCALL DELAY ;(2)延时一段时间
CLR P0.1 ;(3)点亮灯
LCALL DELAY ;(4)延时一段时间
SETB P0.1 ;(5)熄灭灯
SETB P0.0 ;(1)熄灭灯
SETB P1.1 ;(1)熄灭灯
LCALL DELAY ;(2)延时一段时间
CLR P1.1 ;(3)点亮灯

(四)开关控制的跑马灯以及流水灯电路图以及程序

(四)开关控制的跑马灯以及流水灯电路图以及程序

(四)开关控制的跑马灯以及流⽔灯电路图以及程序电路图:⽬的:K1 开始跑马灯左->右K2 停⽌K3 跑马灯右-> 左K4 流⽔灯参考程序:#include<reg52.h>#include<intrins.h>#define uchar8 unsigned char#define uint16 unsigned int#define LED P1sbit key1=P2^0;sbit key2=P2^1;sbit key3=P2^2;sbit key4=P2^3;/*****************************/// 函数名称: DelayMS( )// 函数功能:延时// ⼊⼝函数:延时毫秒// 出⼝函数:⽆/************************* void DelayMs(uint16 val){uint16 i,j;for( i=0;i<val;i++)for(j=0;j<113;j++);}/****************************/// 函数名称: keyscan( )// 函数功能:检测按键// ⼊⼝函数:⽆// 出⼝函数: keyscan_num/*****************************/uchar8 keyscan(){uchar8 keyscan_num,temp;P2=0xff; // 置电平temp=P2; // 读P2⼝电平,送⼊ temp 中(因为这时候可能改变按键了)// if(~(temp&0xff)) 不会⽤,先不看,⽤下⾯的if(temp!=0xff) // 说明有键按下{if(key1==0){keyscan_num=1;}else if(key2==0){keyscan_num=2;}else if(key3==0){keyscan_num=3;}else if(key4==0){keyscan_num=4;}else{keyscan_num=2;}}return keyscan_num;}void main(){uchar8 key_num , temp , i ;while(1){key_num = keyscan(); // 将按键扫描的键值送⼊ key_num 中switch(key_num){case1: goto function0;case2: goto function1;case3: goto function2;case4: goto function3;default: break ;}function0: // 跑马灯从左向右⾛temp=0x01; // 0000 0001for(i=0;i<8;i++){LED= ~temp;DelayMs(1000);temp=temp<<1;}key_num = keyscan(); // 将按键扫描的键值送⼊ key_num 中switch(key_num){case1: goto function0;case2: goto function1;case3: goto function2;case4: goto function3;default: goto function0;break ;}function1: //停⽌LED=0xff;key_num = keyscan(); // 将按键扫描的键值送⼊ key_num 中switch(key_num){case1: goto function0;case2: goto function1;case3: goto function2;case4: goto function3;default: goto function1;break ;}function2: // 从右向左temp=0x80; // 1000 0000for(i=0;i<8;i++){LED= ~temp;DelayMs(1000);temp=temp>>1;}key_num = keyscan(); // 将按键扫描的键值送⼊ key_num 中switch(key_num){case1: goto function0;case2: goto function1;case3: goto function2;case4: goto function3;default: goto function2;break ;}function3: // 流⽔灯LED=0xff ; // 这⾥端⼝全被设置为 1111 1111 ,相当于全灭for(i=0;i<8;i++){LED=LED<<1; // 选择了左移循环DelayMs(1000);}key_num = keyscan(); // 将按键扫描的键值送⼊ key_num 中switch(key_num){case1: goto function0;case2: goto function1;case3: goto function2;case4: goto function3;default: goto function3;break ;}}}分析以及相关疑点:1、按键按下,是遵循实验现象了,但是不太好,按其他键不能⽴即响应,当然我们不要求2、实际⽤弹性开关,⽐较好,具体⾃⼰体会,⼀按下松开对程序没影响,。

IO基础学习之跑马灯

IO基础学习之跑马灯

程序1:流水灯之从右到左跑马灯#include <msp430g2553.h>void main(void){ unsigned int i;char j,k;WDTCTL = WDTPW + WDTHOLD; // 停止看门狗//系统时钟默认DCO(内部数字控制振荡器)(约1.1MHz,可设置)P1DIR = 0xff; // 设置P1口为输出while(1){k=1;for (j=0;j<8;j++) //循环8次,即P10~~P17轮流闪亮{ P1OUT=~k; //反相输出,低电平有效for(i=65535;i>0;i--); // 延时k=k<<1; //左移一位}}}核心程序分析:while(1){k=1;for (j=0;j<8;j++) //循环8次,即P1.0~~P1.7轮流闪亮{ P1OUT=~k; //反相输出,低电平有效for(i=65535;i>0;i--); // 延时k=k<<1; //左移一位}}关键在于理解低电平点亮,为了保证电位为零,先设置一个临时变量,然后逐步左移,保证电位为零的位只有一个,而且可以逐步移动。

这个程序关键步骤也可以写成这样的:while(1){temp=0xfe;P1OUT=temp;for(i=65535;i>0;i--); // 延时for (j=1;j<8;j++) //循环7次,即P1.0~~P1.7轮流闪亮{int a,b;a=temp<<j;b=temp>>(8-j);P1OUT=a|b; //低电平有效for(i=65535;i>0;i--); // 延时}}另外一种写法:while(1){P1OUT=0xfe;for(i=65535;i>0;i--); // 延时while( P1OUT!=0x7f ){P1OUT<<=1;P1OUT|=0x01;for(i=65535;i>0;i--); // 延时}}当然还可以采用数组(位表)赋值,开关语句赋值的方法。

MSP430F6638_按键LED跑马灯程序

MSP430F6638_按键LED跑马灯程序
MSP430F6638_LED跑马灯
张立为
版本管理
修改记录
版本号. V01
作者 张立为
描述
修改日期 2012-11-2 2012 11 2
审核记录
版本号.
职务
签名
修改日期
轮廓
GPIO的基本概念 LED跑马灯硬件实现 LED跑马灯简单软件编程实现

GPIO基本概念

GPIO——通用输入输出
设VDD为I/O口高电平电压,对于MSP430F6638平 设VDD为I/O口高电平电压 对于MSP430F6638平 台是3.3V,通常,2mA的正向电流 IF足以让LED发光, 此时下列根据公式 LED的正向压降VF约为1 2V(具 此时下列根据公式,LED的正向压降VF约为1.2V(具 体参数参照购买的LED发光管datasheet)所以,取 LED限流电阻阻值为:

配置寄存器法跑马灯
#define P3P4_BASE_Address 0x0220 #define define BIT1 (0x0002) BIT1 (0x0002) #define BIT2 (0x0004) #define BIT3 (0x0008) #define P4DIR (*((volatile #define P4DIR ( ((volatile unsigned char unsigned char*)(P3P4 )(P3P4_BASE_Address + 0x05))) BASE Address + 0x05))) #define P4OUT void main(void) { volatile unsigned int i; volatile unsigned int count=0; P4DIR |= BIT1 + BIT2 + BIT3; // P4.1,P4.2,P4.3 set as output while(1) // continuous loop { P4OUT ^= BIT1 + BIT2 + BIT3; // XOR P4.1,P4.2,P4.3 for(i=20000;i>0;i--); // Delay } } (*((volatile unsigned char*)(P3P4_BASE_Address + 0x03)))

单片机跑马灯程序

单片机跑马灯程序

单片机跑马灯程序*******************************************************************;此程序是用单片机的p1 口接八个led 灯作跑马灯试验,八个led 依次亮了又熄灭,形成漂亮;的跑马灯。

本人已经试验成功。

;单片机教程网51hei 原创;该8 路单片机跑马灯程序代码简单,电路也容易搭建,只需把led 接在p1 口上就可以了,希望大家能试验成功顺利的完成跑马灯报告;****************************************** *************************org 0000hajmp start;跳转到程序开始org 0030h;定义起始汇编地址start:mova,#0ffh ;clr c ;mov r2,#08h ;循环八次。

loop: rlc a ;带进位左移。

mov p1,a ;此时led 灯开始有反映了。

call delay ;延时djnz r2,loop ;循环(djnz 条件判断)movr2,#07h ;loop1: rrc a ;带进位右移mov p1,a ;此时led 灯开始有反映了。

call delay ;延时djnz r2,loop1 ;反复循环jmp start ;回到程序的开头delay: mov r3,#20 ;延时子程序d1: mov r4,#20d2: mov r5,#248djnz r5,$djnzr4,d2 单片机论坛51hei/bbs/ 有更多的跑马灯流水灯试验---------3 路单片机跑马灯程序---------------------------------------ORG 0000HLJMPMAINORG 030HMAIN: MOV P1,#0DBH ;化为2 进制为11011011--0 状态时led灯亮ACALL DELay MOV P1,#06DH ;化为2 进制为01101101ACALL DELay;MOV P1,#0B6H ;化为2 进制为10110110ACALL DELayAJMP MAINdelay: movr7,#255d1: mov r6,#255d2: djnz r6,d2djnz r7,d1retendtips:感谢大家的阅读,本文由我司收集整编。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
j=0x0001<<(8*i);
GpioDataRegs.GPADAT.all=j;
delay_loop(); // // Delay 1[s]
}
for(i=1;i<8;i++)
{
j=0x1000>>(8*i); // The seventh led to first one lights by turns
SysCtrlRegs.HISPCP.all = 0x0001; //HSPCLK=150M/2=75M
SysCtrlRegs.LOSPCP.all = 0x0002; //LSPCLK=150M/4=37.5M
SysCtrlRegs.PCLKCR.bit.EVAENCLK=1; //使能EVA的时钟
a>>16;
GpioDataRegs.GPADAT.all=a;
}
2
#include "DSP281x_Device.h" // DSP281x Headerfile Include File
#include "DSP281x_Examples.h" // DSP281x Examples Include File
{
InitSysCtrl();//系统初始化
DINT;//关中断
InitPieCtrl();//初始化PIE
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();//初始化PIE中断矢量表
Gpio_select();//初始化GpioGpioDataRegs.GPACLEAR.all=0xFFFF; // All GpioAx to OFF
EDIS;
}
//编写函数InitGpio()2812的T1PWM引脚和IO是复用的,需设定一下T1PWM这个引脚,使它的功能是输出PWM而不是普通的IO口。
void InitGpio(void)
{
EALLOW;
GpioMuxRegs.GPAMUX.bit.T1PWM_GPIOA6=1; //将GPIOA6脚功能设置为T1PWM,而不是普通的IO口
GpioMuxRegs.GPAQUAL.all = 0x0000; //设置输入采样限定值(不限制)
EDIS;
}
/*延时*/
void delay_loop()
{
short i;
for (i = 0; i < 1000; i++)
}
3
/*定时器T1产生一个不对称的PWM波形,频率为1KHz,占空比为40%。*/
/*要求:*/
/*利用DSP2812实现*/
/*1、确定CPU时钟100M(外部使用20MHZ晶振)*/
/*2、GPIOA0-7接8个LED灯*/
/*3、GPIOA8-15接8个按键*/
/*每一秒读取按键的值,并点亮相应的灯*/
viod Initsystem()
{
EALLOW;
SysCtrlReg.WDCR=0x0068;
SysCtrlRegs.PLLCR =0x0a;
for(i= 0; i< 5000; i++);
GpioMuxRegs.GPAMUX.all = 0x0000;
GpioMuxRegs.GPFDIR.all= 0x00ff;
EDIS;
}
void ConfigCpuTimer(uint16 a)
{
CpuTimer0Regs.PRD.all = a;
// Prototype statements for functions found within this file.
Uint16 j=0x0001;
short i ;
void Gpio_select(void);
void delay_loop(Uint16 loop_time);
void main(void)
/*初始化PIE中断矢量表*/
InitPieVectTable();
EALLOW;
PieVectTable.TINT0 = &ISRTimer0;
EDIS;
ConfigCpuTimer(100000000);
StartCpuTimer0();
/*开中断*/
IER |= 0x01;
PieCtrl.PIEIER1.bit.INTx7=1;
CpuTimer0Regs.TCR.bit.TIE = 1;
CpuTimer0.InterruptCount = 0;
}
void main()
{
Initsystem();
InitCPUtimer0();
DINT;
IER = 0x0000;
IFR = 0x0000;
/*初始化PIE*/
InitPieCtrl();
CpuTimer0Regs.TPR.all = 0;
CpuTimer0Regs.TPRH.all = 0;
CpuTimer0Regs.TCR.bit.TSS = 1;
CpuTimer0Regs.TCR.bit.TRB = 1;
CpuTimer0Regs.TCR.bit.SOFT = 1;
CpuTimer0Regs.TCR.bit.FREE = 1;
GpioDataRegs.GPADAT.all=j;
delay_loop(); // Delay 1[s]
}
}
}
void Gpio_select(void)
{
EALLOW;
GpioMuxRegs.GPAMUX.all = 0x0000; //设置GPIO为I/O功能
GpioMuxRegs.GPADIR.all = 0xFFFF; //设置GPIO为输出
GpioDataRegs.GPADAT.all=j; // First led light ON
delay_loop(); // Delay 1[s]
while(1) //
{
for(i=1;i<8;i++) // The second led to eighth one lights by turns
EINT; //使能中断
for(;;)
}
void InitSysCtrl(void)
{
Uint16 i;
EALLOW;
SysCtrlRegs.WDCR= 0x0068; //禁止开门狗
SysCtrlRegs.PLLCR = 0xA; //初始化PLL模块,系统时钟30M*10/2=150M
for(i= 0; i< 5000; i++);//延时,使得PLL初始化成功
EvaRegs.T1CON.bit.TENABLE=0; //暂时禁止定时器操作,等到全部设定完毕,再启动定时器
//设置GPTCONA
EvaRegs.GPTCONA.bit.TCOMPOE=1; //定时器比较输出T1PWM或者T2PWM由各自的定时器比较逻辑驱动
EvaRegs.GPTCONA.bit.T1PIN=1; //定时器1的比较输出极性是低电平有效
EDIS;
}
//初始化EV
void InitEva(void)
{
//设置定时器控制寄存器T1CON
EvaRegs.T1CON.bit.TMODE=2; //因为要产生不对称的PWM波形,所以将T1的计数方式设定为连续增模式
EvaRegs.T1CON.bit.TPS=1; //这个位是T1输入时钟预定标位,则,T1CLK=HSPCLK/2=75/2=37.5M
#include "DSP281x_Device.h" // DSP281x Headerfile Include File
#include "DSP281x_Examples.h" // DSP281x Examples Include File
void InitEva(void)
//系统时钟初始化{Fra bibliotekInitSysCtrl();/*初始化系统*/
DINT; /*关中断*/
IER = 0x0000;
IFR = 0x0000;
InitPieCtrl(); /*初始化PIE控制寄存器*/
InitPieVectTable(); /*初始化PIE矢量表*/
InitGpio(); /*初始化GPIO*/
InitEva(); /*初始化EV*/
EINT; // Enable Global interrupt INTM
ERTM;// Enable Global realtime interrupt DBGM
}
interrupt void ISRTimer0(void)
{
uint32 a;
PieCtrl.PIEACK.bit.ACK7=1;
a=GpioDataRegs.GPADAT.all;
//设置T1PR和T1CMP
EvaRegs.T1PR=37499;
EvaRegs.T1CMPR=15000; //15000/37500=40%
EvaRegs.T1CNT=0;
EvaRegs.T1CON.bit.TENABLE=1; //启动定时器操作,开始产生PWM波
}
// Main函数
void main(void)
相关文档
最新文档