📄 delay.c
字号:
#include "avr/io.h"
#include "util/delay.h"
#define uchar unsigned char
#define uint unsigned int
#define xtal 8
//****************此函数是在8M条件下得出的准1ms延时**********************//
//****************当使用4M时延时翻倍,因而减半参数即可*******************//
void delay1ms(uchar y)
{
asm volatile("push r22"::);
asm volatile("push r23"::);
asm volatile("d1: ldi r23,205"::);
asm volatile("d2: ldi r22,12"::);
asm volatile("d3: dec r22"::);
asm volatile("brne d3"::);
asm volatile("dec r23"::);
asm volatile("brne d2"::);
asm volatile("dec r24"::);
asm volatile("brne d1"::);
asm volatile("pop r23"::);
asm volatile("pop r22"::);
}
//****************此函数是在8M条件下得出的准1us延时**********************//
//****************当使用4M时延时翻倍,因而减半参数即可*******************//
void delay1us(unsigned char x)
{
asm volatile("dus: dec r24" ::);
asm volatile("nop" ::);
asm volatile("nop" ::);
asm volatile("nop" ::);
asm volatile("nop" ::);
asm volatile("nop" ::);
asm volatile("brne dus" ::);
}
//****************此函数是在8M条件下得出的准1s延时**********************//
//****************当使用4M时延时翻倍,因而减半参数即可*******************//
void delay1s(uchar z)
{
asm volatile("push r22"::);
asm volatile("push r23"::);
asm volatile("push r25"::);
asm volatile("ds0: ldi r25,250"::);
asm volatile("ds1: ldi r23,248"::);
asm volatile("ds2: ldi r22,42"::);
asm volatile("ds3: dec r22"::);
asm volatile("brne ds3"::);
asm volatile("dec r23"::);
asm volatile("brne ds2"::);
asm volatile("dec r25"::);
asm volatile("brne ds1"::);
asm volatile("dec r24"::);
asm volatile("brne ds0"::);
asm volatile("pop r25"::);
asm volatile("pop r23"::);
asm volatile("pop r22"::);
}
//网上精确延时1MS
void delay_1ms(void)
{
uint i;
for(i=0;i<(unsigned int)(xtal*143-2);i++);
}
//网上精确延时MS级别
void delay_ms(uint num)
{
uint i;
for(i=0;i<num;i++) delay_1ms();
}
//网上精确延时us级别
void shortdelay(unsigned char tt)
{
asm("_L2: subi R16,1");
asm(" nop");
asm(" brne _L2");
asm(" nop");
asm(" ret");
}
void delayms(uint t)
{uint i;
for(i=0;i<t;i++)
_delay_loop_2(8 * 250); //此处8表示8MHZ,可以根据频率更改; t=999时十分接近1s;
}
void delayus(uint t)
{t=t*2;
while(--t>0); //接近于1us ,t=100,为99us,误差已经很小了
}
int main(void)
{
DDRB=0XFF;
PORTB=0X00;
while(1)
{
//delayms(999);
shortdelay(200);
PORTB=PORTB+1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -