📄 leson4.c
字号:
#include <io2313v.h>
#include <macros.h>
#define uint unsigned int
#define uchar unsigned char
uchar rdata;
void WDT_off(void)
{
//__disable_interrupt();
//__watchdog_reset();
//#asm("cli");
SREG &= ~0x80;
// Clear WDRF in MCUSR
MCUSR &= ~0x08;
// Write logical one to WDCE and WDE
// Keep old prescaler setting to prevent unintentional time-out
WDTCSR |= 0x18;
// Turn off WDT
WDTCSR = 0x00;
SREG |= 0x80;
//#asm("sei");
//__enable_interrupt();
}
void USART_Init(unsigned int baud)
{
/* Set baud rate */
UBRRH = (unsigned char)(baud>>8);
UBRRL = (unsigned char)baud;
/* Enable receiver and transmitter */
UCSRB = 0x18;
/* Set frame format: 8data, 2stop bit */
UCSRC = 0x0E;
//U2X=0;
}
void USART_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer */
while ( !( UCSRA & (UCSRA&0x20)) );
/* Put data into buffer, sends the data */
UDR = data; //Transmit 8 data bits
}
/*
void USART_Transmit( unsigned int data )
{
//Wait for empty transmit buffer
while (!( UCSRA & (1<<UDRE)));
// Copy 9th bit to TXB8
UCSRB &= ~(1<<TXB8);
if ( data & 0x0100 )
UCSRB |= (1<<TXB8);
// Put data into buffer, sends the data
UDR = data; //Transmit 9 data bits
}
*/
unsigned char USART_Receive( void )
{
// Wait for data to be received
while ( !(UCSRA & (UCSRA&0x80)) );
//Get and return received data from buffer
return UDR; //Receive 8 data bits
}
/*
unsigned int USART_Receive( void )
{
unsigned char status, resh, resl;
// Wait for data to be received
while ( !(UCSRA & (1<<RXC)) );
// Get status and 9th bit, then data
// from buffer
status = UCSRA;
resh = UCSRB;
resl = UDR;
// If error, return -1
if ( status & (1<<FE)|(1<<DOR)|(1<<UPE) )
return -1;
// Filter the 9th bit, then return
resh = (resh >> 1) & 0x01;
return ((resh << 8) | resl); //Receive 9 data bits
}
*/
void delayms(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<1141;j++);
}
}
void delayus(uint us)
{
uint i;
for(i=0;i<us;i++)
{
NOP();NOP();NOP();NOP();
}
}
void senddata(uint data) // dm13a(led 驱动子程序)
{
uchar i;
for(i=0;i<16;i++)
{
PORTD&=~0x10;
NOP();
if(data&0x8000)
PORTD|=0x20; //置位操作
else
PORTD&=~0x20; //清零操作
NOP();
PORTD|=0x10;
NOP();
data=data<<1;
}
PORTD|=0x08;
NOP();
PORTD&=~0x08;
//PORTD|=(1<<PORTD5); //置位操作
//PORTD&=~(1<<PORTD5); //清零操作
}
void main()
{
DDRD|=0x38;
DDRB|=0x40;
WDT_off();
USART_Init(9600);
PORTB&=0xBF;
delayms(20);
delayms(20);
delayms(20);
USART_Receive();
rdata=UDR;
switch(rdata)
{
case 55:goto start1;break;
case 66:goto start2;break;
case 77:goto start3;break;
case 88:goto start4;break;
}
while(1)
{
uchar i;
uchar h;
uint j=0x0001;
uint k=0xffff;
uint m=0x4000;
uint n=0xffff;
start1:
for(i=0;i<16;i++)
{
senddata(j);
delayms(20); //左到右逐渐亮
j=j<<1;
j=j+1;
}
start2:
for(i=0;i<15;i++) //左到右逐渐灭
{
if((i>5)&&(i<10))
{
for(h=0;h<20;h++)
{
senddata(k);
delayus(800);
senddata(0x00);
delayus(200);
}
k=k<<1;
}
else if(i>10)
{
for(h=0;h<20;h++)
{
senddata(k);
delayus(600);
senddata(0x00);
delayus(400);
}
k=k<<1;
}
else
{
senddata(k);
delayms(20);
k=k<<1;
}
}
start3:
for(i=0;i<16;i++) //右到左逐渐亮
{
senddata(m);
delayms(20);
m=m>>1;
m=m+0x4000;
}
start4:
for(i=0;i<16;i++) //右到左逐渐灭
{
if((i>5)&&(i<10))
{
for(h=0;h<20;h++)
{
senddata(n);
delayus(800);
senddata(0x00);
delayus(200);
}
n=n>>1;
}
else if(i>10)
{
for(h=0;h<20;h++)
{
senddata(n);
delayus(600);
senddata(0x00);
delayus(400);
}
n=n>>1;
}
else
{
senddata(n);
delayms(20);
n=n>>1;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -