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语言编写一个控制灯闪烁的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)