⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sz1.c

📁 本程序用at16实现两根线(两个i/o口)+8片74164+一片ULN2003驱动24个LED数码管,通过串口写入要显示的数,可以在很多地方应用
💻 C
字号:
//本程序用at16实现两根线(两个i/o口)+8片74164+一片ULN2003驱动24个LED数码管,通过串口写入要显示的数,可以在很多地方应用)
#include <iom16.h> //和单片机类型相对应的头文件,选择Atmega16做实验;
#include <macros.h>

void delay_1ms(void); //函数声明,本实验中会用到这两个函数
void delay_nms(unsigned int n);
void InitADC( void);
 unsigned int mm;
 int EEPROMwrite_256( int location, unsigned char byte);
 unsigned char EEPROMread_256( int location);
 
 void SpiWriteByte(unsigned char byte);
 unsigned char SpiReadByte(void);
 void InitUART( unsigned char baudrate );
unsigned char ReceiveByte( void );
void TransmitByte( unsigned char data );
unsigned char iRx=0;
void timer1_init(void);
void uart0_init(void);
void led( unsigned char ed );
//ICC-AVR application builder : 05-3-12 16:15:07
// Target : M16
// Crystal: 1.0000Mhz

#pragma interrupt_handler UART_RX_interrupt:12 UART_TX_interrupt:14
/* UART Buffer Defines */
#define UART_RX_BUFFER_SIZE 64 /* 1,2,4,8,16,32,64,128 or 256 bytes */
#define UART_RX_BUFFER_MASK 63
#define UART_TX_BUFFER_SIZE 64 /* 1,2,4,8,16,32,64,128 or 256 bytes */
#define UART_TX_BUFFER_MASK 63


static unsigned char UART_RxBuf[UART_RX_BUFFER_SIZE];
static volatile unsigned char UART_RxHead;
static volatile unsigned char UART_RxTail;
static unsigned char UART_TxBuf[UART_TX_BUFFER_SIZE];
static volatile unsigned char UART_TxHead;
static volatile unsigned char UART_TxTail;
unsigned char data=0;
unsigned char RxHead=0;
unsigned int zhongci=0;
unsigned char BUTE1=0xd8;
unsigned char BUTE2=0x34;
unsigned char keyba=0;
unsigned char keyd=0;
unsigned char keyba1=0;
int count=0;
int  ci=0;
static unsigned char xianshi[11]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0};
static unsigned char dxianshi[24];
static unsigned char pxianshi[24];
static unsigned char a[60];
static unsigned char b[60];
static unsigned char c[60];





void port_init(void)
{
 unsigned char   temp ;
 DDRA  = 0B10000000;
 PORTA = 0B10000000;
 DDRA  = 0B10000000;
 
 
 PORTB=0;
  DDRB  = 0B10110000;  // Set SCK, MOSI & SS as outputs
    PORTB =0;  // clear bits MOSI, & SCK
	SPCR=0B11010001;
	 SPSR = 0x00; 
  temp = SPSR; 
  temp = SPDR; 
	
 PORTB = 0;
 
 PORTC = 0b00000100;
 DDRC  = 0xff;
 PORTC = 0b00000100;
  
 DDRD  = 0b11111000;
 PORTD = 0b00011000;
 
}


/* initialize UART */
void InitUART( unsigned char baudrate )
	{
	
	UCSRB = 0x00; //disable while setting baud rate
	UBRR = baudrate; /* set the baud rate */
	/* enable UART receiver and transmitter, and
	receive interrupt */
	UCR = ( (1<<RXCIE) | (1<<RXEN) | (1<<TXEN) );
	
	UART_RxTail = 0;
	UART_RxHead = 0;
	UART_TxTail = 0;
	UART_TxHead = 0;
	UCSRA = 0x00;
	//UCSRC = BIT(URSEL) | 0x06;
 	//UCSRB = 0xD8;
	
	}

/* interrupt handlers */
void UART_RX_interrupt( void )
{
	
	//unsigned char tmphead;
	//data ++; /* read the received data */
	/* calculate buffer index */
	
	if ( UART_RxHead > UART_RX_BUFFER_MASK )
		{
		UART_RxHead=0;/* ERROR! Receive buffer overflow */
		}
	UART_RxBuf[UART_RxHead] = UDR; /* store received data in buffer */
	data=UART_RxBuf[UART_RxHead];
	//tmphead = ( UART_RxHead + 1 ) ;
	//UART_RxHead = tmphead; /* store new index */
	UART_RxHead++;
}

void UART_TX_interrupt( void )
{
	unsigned char tmptail;

	/* check if all data is transmitted */
	if ( UART_TxHead != UART_TxTail )
		{
		/* calculate buffer index */
		tmptail = ( UART_TxTail + 1 ) & UART_TX_BUFFER_MASK;
		UART_TxTail = tmptail; /* store new index */
		UDR = UART_TxBuf[tmptail]; // start transmition 
		}
	else
		{
		UCR &= ~(1<<UDRIE); /* disable UDRE interrupt */
		}
	}

/* Read and write functions */
unsigned char ReceiveByte( void )
	{
	unsigned char tmptail;
	//if (UART_RxHead==UART_RxTail) return 0;
	//while ( UART_RxHead == UART_RxTail ) /* wait for incomming data */
		;
	tmptail = ( UART_RxTail + 1 ) & UART_RX_BUFFER_MASK;/* calculate buffer index */
	UART_RxTail = tmptail; /* store new index */
	return UART_RxBuf[tmptail]; /* return data */
	}

void TransmitByte( unsigned char data )
	{
	unsigned char tmphead;
	/* calculate buffer index */
	tmphead = ( UART_TxHead + 1 ) & UART_TX_BUFFER_MASK; 
		/* wait for free space in buffer */

	while ( tmphead == UART_TxTail )
		;
	UART_TxBuf[tmphead] = data; /* store data in buffer */
	UART_TxHead = tmphead; // store new index 
	UCR |= (1<<UDRIE); // enable UDRE interrupt 
	}

unsigned char DataInReceiveBuffer( void )
	{
	return ( UART_RxHead != UART_RxTail ); 
		/* return 0 (FALSE) if the receive buffer is empty */
	}









void main(void) //主函数
{
unsigned int k=0;
unsigned int i=0;
	unsigned char kk=0;
	int uuu=4;
	int uuj=0;
	unsigned char uk=180;
	unsigned char jia=0;
	unsigned char mi=1;
	unsigned char san=0;
	

 InitUART(71);     

	
 MCUCR = 0x02; //TIN0 FALL
 
 TIMSK = 0x00; //timer interrupt sources
 SEI(); //re-enable interrupts
 
 WDR(); //this prevents a timout on enabling
 	WDTCR = 0x0C; //WATCHDOG ENABLED - dont forget to issue WDRs
		 
	;
	  port_init();
	 
	   PORTA = 0B10000000;
	
	  PORTC=PORTC & 0B11111011;
	  
	   delay_nms(40);
	   PORTA = 0B10000000;
	   PORTC=PORTC | 0B00000100;
	  WDR();
	  TransmitByte('o');
	 TransmitByte('k');
	 
	

 WDR();


	
	for (kk=0;kk<6;kk++)
		UART_RxBuf[kk]=0;
		UART_RxBuf[6]=1;
		UART_RxBuf[7]=2;
		for (kk=0;kk<8;kk++) dxianshi[kk]=0;
		dxianshi[0]=1;
		
	
	dxianshi[0]=4;
		dxianshi[1]=6;
  while(1) //程序一直执行该循环 
  {
  WDR( );
     
	
	if (data!=0)
	{
	
	delay_nms(100);
	k=UART_RxHead;
	
	
	
	 for(kk=0;kk<k;kk++)
	  TransmitByte(UART_RxBuf[kk]);
	 
		
		  
		  
		
		 
		
	
	
	UART_RxHead=0;
	
	data=0;
	
	}
	
	

	
	san=dxianshi[1];
	if ((UART_RxBuf[1]==0x03) && ((zhongci %3)==0))
		dxianshi[1]=10;
		
	
	///LED1........LED24拼屁股后的位选,一共24位,3个字节
	uk=1;
	for (kk=0;kk<8;kk++) pxianshi[kk]=0;
	
	jia=128;
		for (k=0;k<8;k++)
	{mi=1;
	for (kk=0;kk<8;kk++)
	{
	  
	pxianshi[k]=pxianshi[k]+((xianshi[dxianshi[kk]] & jia)*uk/mi); 
	mi=mi*2;
	}
	uk=uk*2;
	jia=jia/2;
	}
	/////////1  以下是24路扫描驱动
	jia=128;
	for (k=0;k<8;k++)
	{
	//led(0);
	led(0);
	led(pxianshi[k]);
	led(jia);
	delay_nms(200);
	jia=jia/2;
	}
	
	
	
	
	}
	
	
  WDR(); //this prevents a timout on enabling
 	//WDTCR = 0x0C; //WATCHDOG ENABLED - dont forget to issue WDRs
}
void delay_1ms(void)//1ms延时函数
{
  unsigned int i;
  for (i=0;i<2;i++)
  {
  
  } 
}
void delay_nms(unsigned int n)//延时n毫秒
{
  unsigned int i;
   
  
  for (i=0;i<n;i++)//执行n次1毫秒延时
  
  
  delay_1ms();
  
  
}
    

void led(unsigned char ed)
{


unsigned char i;
unsigned char m;
 	
	PORTD=PORTD | 0B10000000;
	  PORTC=PORTC & 0B01111111;// 1   0 置0
	
	 
	m=1;
	
	for (i=0;i<8;i++)
	{
	 if ((ed & m)==m)
	PORTC|=1<<6;
	else
	PORTC=PORTC & 0B10111111;
	
	PORTC^=BIT(7); //1  1
	
	PORTC^=BIT(7);  // 1   0
	 
	 m=m*2;
	}
	
PORTD=PORTD & 0B01111111;
}
	

 
 ///////////////////////

 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -