用C语言怎么编写7段LED的显示程序

用C语言怎么编写7段LED的显示程序,第1张

C语言写LED数码管显示程序与汇编是一致的,将显示的基本内容定义在一个数组中就可以了,比如:

#include<reg51h>

#define uchar unsigned char

uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};

sbit rstkey=P2^2;

sbit speaker=P2^0;

void delay()//延时约400毫秒

{

uchar i,j;

for(i=0;i<200;i++)

for(j=0;j<250;j++);

}

main()

{

uchar i,key;

P2=0xff;

while(1)

{

i=0;

P1=table[i];

while(1)

{

key=P3;

if(key!=0)break;

}

switch(key)

{

case 0x01:i=1;break;

case 0x02:i=2;break;

case 0x04:i=3;break;

case 0x08:i=4;break;

case 0x10:i=5;break;

case 0x20:i=6;break;

case 0x40:i=7;break;

case 0x80:i=8;break;

default:break;

}

P1=table[i];//显示按下抢答器的号

P0=key;//显示按下键号的LED

while(1)

{

if(rstkey==0)break;//主持人按下复位键则重新开始

speaker=~speaker;//否则蜂鸣器报警

delay();

}

}

}

下面是一段示例代码,使用 C 语言编写,可以在 AT89C51 微控制器上运行:

#include <reg51h>

sbit LED1 = P2 ^ 0;

sbit LED2 = P2 ^ 1;

sbit LED3 = P2 ^ 2;

sbit LED4 = P2 ^ 3;

void delay(unsigned int time) {

while (time--);

}

void main() {

while (1) {

LED1 = 1;

delay(50000);

LED2 = 1;

delay(50000);

LED3 = 1;

delay(50000);

LED4 = 1;

delay(50000);

LED4 = 0;

delay(50000);

LED3 = 0;

delay(50000);

LED2 = 0;

delay(50000);

LED1 = 0;

delay(50000);

}

}

上述代码实现了四个 LED 灯逐个亮起来然后再逐个灭掉的效果。其中,sbit 定义了四个位于 P2 口的 LED 灯,而 delay 函数则是一个延时函数,可以用来控制 LED 灯亮起和灭掉的时间。

注意:在编译运行上述代码前,请确保你已经安装了编译器和相应的驱动软件,并且按照规定的方式将代码下载到 AT89C51 微控制器上。

位申明LED,再用for语句写个延时函数,主函数如下

while(1)

{

led1=1;

delay(10);

led1=0;

delay(10)

led2=1;

delay(10);

led2=0;

delay(10);

led3=1;

delay(10);

led3=0;

delay(10);

}

开关控制指示灯显示

MY8255_A EQU 0A860H;8255A口地址

MY8255_B EQU 0A861H;8255B口地址

MY8255_C EQU 0A862H;8255C口地址

MY8255_MODE EQU 0A863H;8255控制口地址

CODE SEGMENT

ASSUME CS:CODE

START: MOV DX,MY8255_MODE

MOV AL,82H

OUT DX,AL ;将控制字82H写入8255控制口,A口方式0输出,B口方式0输入, C口未用到。

A1: MOV DX,MY8255_B

IN AL,DX ;读8255 B口内容

MOV DX,MY8255_A

OUT DX,AL ; 将前面读到的B口内容送到A口,即A口内容=B口内容

CALL BREAK ;调用子程序BREAK

JMP A1;跳转到A1

BREAK PROC NEAR ;BREAK子程序

MOV AH,1

INT 16H

JZ RETURN ;读按键字符,ZF=1,则返回;ZF=0,则AL=字符

MOV AX,4C00H

INT 21H ;返回DOS 

RETURN:RET

BREAK ENDP

CODE ENDS 

END START

;流水灯显示

MY8255_A EQU 0b860H;8255A口地址

MY8255_B EQU 0b861H;8255B口地址

MY8255_C EQU 0b862H;8255C口地址

MY8255_MODE EQU 0b863H;8255控制口地址

DATA SEGMENT

LA DB ;留出1个字节

LB DB ;留出1个字节

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA

MOV DS,AX

MOV DX,MY8255_MODE

MOV AL,80H

OUT DX,AL ;控制字80H送入8255控制口,A口、B口都是方式0输出,C口未用到。

MOV DX,MY8255_A

MOV AL,7FH

OUT DX,AL ;将7FH送入A口

MOV LA,AL ;将7FH送入LA存储单元

MOV DX,MY8255_B

MOV AL,0FEH

OUT DX,AL ;将FEH送入B口

MOV LB,AL ;将FEH送入LB存储单元

CALL DALLY

A1: MOV AL,LA

ROR AL,1 ;LA内容循环右移1次

MOV LA,AL

MOV DX,MY8255_A

OUT DX,AL ;将循环右移后的LA内容送A口,其目的是让A口连接的LED灯依次向右循环点亮

MOV AL,LB

ROL AL,1 ;LB内容循环左移1次

MOV LB,AL

MOV DX,MY8255_B

OUT DX,AL ;将循环左移后的LB内容送B口,其目的是让B口连接的LED灯依次向左循环点亮

CALL DALLY ;延时,让一个LED灯发光稳定之后再点亮另一个

CALL BREAK ;调用BREAK子程序,看是否有键按下

JMP A1 ;跳转到A1

DALLY: MOV CX,3FFH ;延时子程序

D1: MOV AX,0FFFFH

D2: DEC AX

JNZ D2

LOOP D1

RET

BREAK PROC NEAR ;是否有键按下

MOV AH,06H

MOV DL,0FFH

INT 21H

JE RETURN ;若无,则转RETURN

MOV AX,4C00H

INT 21H ;返回DOS

RETURN:RET

BREAK ENDP

CODE ENDS

END START

以上就是关于用C语言怎么编写7段LED的显示程序全部的内容,包括:用C语言怎么编写7段LED的显示程序、编写一段程序,要求用at89c51控制四个led灯,是他们逐个亮以后在逐个灭、单片机3个led灯循环点亮程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存