单片机c语言编了个流水灯,用按键怎么实现它暂停。

单片机c语言编了个流水灯,用按键怎么实现它暂停。,第1张

实现流水灯的方式有很多种(中断,定时器,延时等等),看用哪种方式,最简单的是延时做流水灯,那么在死循环里面增加按键检测,判断出有按键按下来时,再进入死循环,程序不往下走就可以暂停,再按跌出死循环。

#include //51系列单片机定义文件

#define uchar unsigned char //定义无符号字符

#define uint unsigned int //定义无符号整数

void delay(uint); //声明延时函数

void main(void)

{

uint i;

uchar temp;

uint Flag1=0;  按键标志位bai

uint Flag2=0;

while(1)

{

Flag1 = keyscan();

if(Flag1==1)(Flag2=~Flag2); //如果一旦检测到一次按键扫描就把标志位2 打开;再次就关闭;

if(Flag2==1)// 如果标志位打开就开始流水灯

{

temp=0x01;

for(i=0;i<8;i++) //8个流水灯逐个闪动

{

P1=~temp;

delay(100); //调用延时函数

temp<<=1;

}

}

扩展资料:

单片机编程就是硬件是单片机,基于单片机进行的程序开发,在有周围外设支持的情况下,用软件来控制的部分通过单片机编程来实现。单片机能识别的语言是硬件语言即汇编,因此编程就是围绕汇编来实现,有直接用汇编程序来编写的,但是较难调试的编写,特别是一上规模就更不易实现,因此常用高级语言来写然后通过编译器转化成汇编。

参考资料来源:百度百科-单片机C语言编程

// 功能 :p0口八个灯作3路跑马灯

#include<reg51h>

#define uchar unsigned char

#define uint unsigned int

#define led_data P0 //数据口定义

//延时程序

void delay(uint a)

{

uint i,j;

for(i=a;i>0;i--)

{

for(j=4000;j>0;j--) ;

}

}

//主程序

void main()

{

while(1)

{

led_data=0xdb;

delay(5); //延时一段

led_data=0x6d;

delay(5); //延时一段

led_data=0xb6;

delay(5); //延时一段

}

}

; 功能 :p0口八个灯作3路跑马灯;

LED_DATA EQU P0 ;数据口定义

ORG 0000H

LJMP MAIN

ORG 030H

MAIN: MOV LED_DATA,#0DBH ;11011011--零为亮

ACALL DELAY ;延时一段

MOV LED_DATA,#06DH ;01101101

ACALL DELAY ;延时一段

MOV LED_DATA,#0B6H ;10110110

ACALL DELAY ;延时一段

AJMP MAIN ;跳转回主程序

DELAY: MOV R7,#255 ;延时子程序

D1: MOV R6,#255

D2: DJNZ R6,D2

DJNZ R7,D1

RET END

51单片机用汇编语言编写流水灯程序,就是控制多个LED ,使其在特定时间间隔内,只有一个LED 发光,其他熄灭,用这种方式顺序移动点亮LED的位置,就形成了流水灯的效果。以下是程序:

;假设晶振12MHZ,P1控制8个LED低电平亮

;启动入口========================

ORG 0000H ;复位启动

AJMP START ;

ORG 001BH ;T1中断

AJMP T1INT ;

;定义变量========================

YSJS EQU 30H;延时计数器

LED EQU 31H;LED控制缓冲器

;主程序==========================

START: MOV LED,#0FEH ;初始化数据

MOV YSJS,#0 ;

;

MOV TMOD,#10H ;定时器1工作于方式1,16位定时器

MOV TL1,#0B0H ;设置定时初值

MOV TH1,#3CH ;定时时间=50mS

SETB ET1 ;使能定时器1中断

SETB TR1 ;启动定时器1

SETB EA ;开总中断

MOV P1,LED ;初始化流水灯

;

LOOP: JMP LOOP ;循环等待中断

;

;

T1INT: PUSH PSW ;定时器1中断程序

PUSH ACC ;保护现场

;

MOV TH1,#3CH ;定时时间=50mS

MOV TL1,#0B0H ;

INC YSJS ;

PUSH ACC ;保护ACC

MOV A,YSJI ;

CJNE A,#2,QT1 ;50mS2=100mS

MOV P1,LED ;

MOV A,LED ;

RL A ;累加器A的值循环左移1位

MOV LED,A ;

MOV YSJS,#0 ;

;

QT1: POP ACC ;恢复现场

POP PSW ;

RETI ;返回主程序

END ;汇编程序结束

KEYFX EQU P10 ;方向控制键

KEYKM EQU P11 ;速度控制键

FX BIT 00H ;方向标志

SPEED BIT 01H ;速度标志

ORG 0000H

LJMP MAIN

ORG 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 R2,#2

MOV A,#0FEH ;灯初始化

CLR FX

CLR SPEED

MOV SPEED,#2

LOOP:

JB KEYFX,LOOP1 ;方向键按下否

JNB KEYFX,$

CPL FX

SJMP LOOP

LOOP1:

JB KEYKM,LOOP ;速度键按下否

JNB KEYKM,$

CPL SPEED

SJMP LOOP

T0ISR:

CLR TR0

MOV TH0,#HIGH(65536-50000)

MOV TL0,#LOW(65536-50000)

SETB TR0

JB FX,T001

RL A ;左循环

SJMP T002

T001:

RR A ;右循环

T002:

DJNZ R2,T0E

JB SPEED,T003

MOV R2,#2 ;快速

SJMP T0E

T003:

MOV R2,#10 ;慢速

T0E:

RETI

END

以上就是关于单片机c语言编了个流水灯,用按键怎么实现它暂停。全部的内容,包括:单片机c语言编了个流水灯,用按键怎么实现它暂停。、单片机程序设计:24位流水灯、c51单片机中如何用汇编语言编写流水灯等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9472499.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存