在fpga上怎么写一个20个led灯闪烁的程序

在fpga上怎么写一个20个led灯闪烁的程序,第1张

module ceshi2(clk,rst,led); //记得改变模块名,跟你的工程名相同

input rst,clk;

output [20:0]led;

//////////////////////基于verilog编写

reg[20:0]led;

reg[25:0]i;

always@(posedge clk or negedge rst)//50m的时钟,20ns的周期,要制造05s间隔

begin

if(!rst)

i<=25'd0;

else if(i==25'd24999999) //05s间隔变换,记数25000000个周期

i<=25'd0;

else

i<=i+1'b1;

end

always@(posedge clk or negedge rst) //控制灯的闪烁

begin

if(!rst)

led<=20'b1111_1111_1111_1111_1111;

else if(i==25'd24999999)

led<=~led;

else

led<=led;

end

endmodule

      ORG   0000H      ; 闪烁 流水灯

        AJMP   MIN0

        ORG   0050H

MIN0:   MOV   R0,#00H

        MOV   DPTR,#TAB

DD1:    MOV   A, R0

        MOV   R2, #10   ; 闪烁次数

        MOVC  A,@A+DPTR

DD2:    MOV   P1, A

        ACALL DELAY1

        MOV   P1, #0FFH

        ACALL DELAY1

        DJNZ  R2, DD2

        INC   R0

        CJNE  R0, #08H, DD1

        JMP   MIN0

DELAY1: MOV R5,#2       ; 延时时间可以改

    D1: MOV R6,#100     

    D2: MOV R7,#250

    D3: DJNZ R7,D3

        DJNZ R6,D2

        DJNZ R5,D1

        RET                   

TAB:  DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH, 7FH 

      END

我写的这个程序应该可以,按一下灯亮,再按一下灯灭

#include "REG52H"

sbit LED1_01 = P1^1; //LED灯

sbit KEY0_01 = P1^2; //按键

void Delay_1ms(unsigned int Time)

{

unsigned int x, y;

for(x = Time; x > 0; x--)

for(y = 120; y > 0; y--);

}

int main(void)

{

LED1_01 = 1; //打开LED灯点亮

while(1)

{

if(KEY0_01 == 0) //检测按键是否按下

{

Delay_1ms(10); //延时去抖动

if(KEY0_01 == 0) //确定按键按下

{

LED1_01 = ~ LED1_01; //取反LED灯 [ 亮 灭 ] }

while(KEY0_01 == 0); //检测松手

}

}

}

你的图里有A/D转换器

AD转换函数ADC_DISC

#include <REGX51H>

#include"defh"

#include"libh"

sbit adc_cs=P1^0;

sbit adc_rd=P1^1;

sbit adc_wr=P1^2;

/ADC0804启动转换函数/

INT8U start_ad()

{

INT8U

temp;

adc_cs=0;

adc_wr=1;

delay(1);

adc_wr=0;

delay(1);

adc_wr=1;

delay(1); //启动AD

adc_rd=1;

delay(1);

adc_rd=0;

delay(1);

temp=P2;

delay(1);

adc_rd=1;

delay(1);

//读取数据

return

temp;

}

用这个程序。

LZ 要是 懂汇编的话,就能知道这是为什么了。

事实上,LZ 的程序是个单次系统,结果应该如同LZ 所说的一样,一个回合后就结束了。

可是,实际使用中,产品都是循环系统,不做单次系统,而很多新手在编程序的时候,也会经常遗漏循环语句,导致循环系统变成了单次系统。于是软件制作方(如KEIL)就在软件上增加了一个功能,编译的时候,将整个程序的外沿,套上一个死循环,保证不出现单次系统。

LZ可以通过查看编译时的 反汇编窗口,里面的汇编程序中,主函数是多了一个循环语句的。

#include <reg51h>

sbit P0_0=P0^0;

sbit key=P0^1;

void delay1s();

unsigned char k,led;

void main( )

{

TMOD=0X10;

led=1;

while(1)

{

if(key)

{

if (led=1){led=0}else{led=1;}

}

if(led==1)

{

P0_0=0;

delay1s();

P0_0=1;

delay1s();

}

else{P0_0=0;}

}

}

void delay1s()

{

unsigned char i;

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

{

TH1=0X3C;

TL1=0XB0;

TR1=1;

while(!TF1);

TF1=0;

}

}

以上只是一种解决方案,很不完善。最好是利用中断来改变led的值来进行状态切换。

以上就是关于在fpga上怎么写一个20个led灯闪烁的程序全部的内容,包括:在fpga上怎么写一个20个led灯闪烁的程序、求计时器控制4个LED灯滚动闪烁的汇编语言程序、汇编语言或C语言编写一个控制灯闪烁的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: https://www.outofmemory.cn/zz/9425183.html

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

发表评论

登录后才能评论

评论列表(0条)

保存