📄 sz1.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 + -