📄 m16pwm-led.c.bak
字号:
////////////////////////////////////////////////////////////////////////////////
//ICC-AVR application builder : 2006-8-1 上午 08:05:37
// Target : M16
// Crystal: 8.0000Mhz
// ADc2采集转把信号
////////////////////////////////////////////////////////////////////////////////
#include <iom16v.h>
#include <macros.h>
#define fre 125
#define uchar unsigned char
#define uint unsigned int
unsigned char kk;
int k;
uchar temp_data,hour_data,minut_data,second_data,second_flag;
uchar AdResult=0;
uchar LedTab[16]={0xEB,0x41,0xB3,0xBA,0x78,0xDA,0xDB,0xA8,0xFB,0xFA,
0xF9,0xFB,0xC3,0xEB,0xD3,0xD1};
uchar LedBuf[4]={0,0,0,0};
uchar LedDp[4]={0,0,0,0};
uchar UartBuf[10],UartBufCount=0;
////////////////////////////////////////////////////////////////////////////////
//function declare
void port_init(void);
void uart0_init(void);
void uart0_rx_isr(void);
void uart0_tx(uchar tdata);
void timer1_init(void);
void timer1_comp_isr(void);
void led_display(uchar delay);
void ms_delay(uint delay);
void init_devices(void);
void adc_init(void);
////////////////////////////////////////////////////////////////////////////////
void port_init(void)
{
PORTA = 0xFF;
DDRA = 0xFB; //PA2=ADC2,输入
PORTB = 0xFF;
DDRB = 0x0F; //数码管片选信号,低有效,常态为高
PORTC = 0xFF; //m103 output only
DDRC = 0x01; //PC0=数码管的DP
PORTD = 0xFF;
DDRD = 0x60;
}
//TIMER1 initialisation - prescale:1
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 1mSec
// actual value: 1.000mSec (0.0%)
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0xE0; //setup
TCNT1L = 0xC0;
OCR1AH = 0x1F;
OCR1AL = 0x40;
OCR1BH = 0x1F;
OCR1BL = 0x40;
//OCR1CH = 0x1F;
//OCR1CL = 0x40;
ICR1H = 0x1F;
ICR1L = 0x40;
TCCR1A = 0x00;
TCCR1B = 0x01; //start Timer
}
/***************************************************************************
****************************************************************************/
//UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9615 (0.2%)
// char size: 8 bit
// parity: Disabled
void uart0_init(void)
{
UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x00;
UCSRC = BIT(URSEL) | 0x06;
UBRRL = 0x33; //set baud rate lo
UBRRH = 0x00; //set baud rate hi
UCSRB = 0x98;
}
/***************************************************************************
****************************************************************************/
#pragma interrupt_handler uart0_rx_isr:12
void uart0_rx_isr(void)
{
//uart has received a character in UDR
UartBuf[UartBufCount]= UDR;
if(++UartBufCount>3)
{
UartBufCount=0;
//UartBuf[2]=Rev,Rev,Rev,Rev,Rev,Rev,LEFT_LED,RIGHT_LED
if( ((UartBuf[0]+UartBuf[1])==0xff)&& ((UartBuf[2]+UartBuf[3])==0xff) )
{
LedBuf[3]=((UartBuf[0]&0xf0)>>4)&0x0f;
LedBuf[2]=UartBuf[0]&0x0f;
}
}
}
/***************************************************************************
****************************************************************************/
void uart0_tx(uchar tdata)
{
while(!(UCSRA & (1<<UDRE) ));
UDR = tdata;
}
/***************************************************************************
A/D初始化
****************************************************************************/
void adc_init(void)
{
ADCSRA =0x0; //关闭AD
ADMUX = (1<<REFS0)|(1<<ADLAR)|(1<<MUX1); //选择外部参考电源 ADC2 左对齐
ACSR = (1<<ACD); //关闭模拟比较器
ADCSRA = (1<<ADEN)|(1<<ADIF)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS0);//中断允许 32分频
}
/***************************************************************************
A/D中断处理
****************************************************************************/
#pragma interrupt_handler Adc_isr:15
void Adc_isr(void)
{
AdResult=ADCH; //读取高位数据(左对齐)
//OCR2 = 0xff - AdResult; //更新PWM参数
LedBuf[1]=((AdResult&0xf0)>>4)&0x0f;
LedBuf[0]=AdResult&0x0f;
}
#pragma interrupt_handler timer1_comp_isr:7
void timer1_comp_isr(void)
{
//compare occured TCNT1=OCR1
uchar tt;
if(++k>=fre)
{
k=0;
for(tt=0;tt<4;tt++)
{
LedDp[tt]=0;//temp
}
//UartBufCount=0;
uart0_tx(AdResult);
uart0_tx(0xff-AdResult);
uart0_tx(0x03);
uart0_tx(0xfc);
LedDp[second_data%4]=1;
if(++second_data>=60)
{
second_data=0;
if(++minut_data>=60)
{
minut_data=0;
if(++hour_data>=24)
{
hour_data=0;
}
}
}
PORTD^=0x60;
}
}
//led display
void led_display(uchar delay)
{
int j,k;
for(j=0;j<4;j++)
{
//if(data>15)data=15;
PORTB = ~(0x08>>j);
PORTA = LedTab[(LedBuf[j]&0x0f)];
if(LedDp[j])PORTC|=0x01;
else PORTC&=0xfe;
ms_delay(delay);
}
}
void ms_delay(uint delay)
{
int d1,d2;
for(d1=0;d1<delay;d1++)
{
for(d2=0;d2<1000;d2++);
}
}
//call this routine to initialise all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
uart0_init();
timer1_init();
adc_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x10; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialised
}
////////////////////////////////////////////////////////////////////////////////
void main()
{
int i,adc,led;
init_devices();
PORTD=0x20;
while(1)
{
//display second flag
if(++led>500)
{
PORTD ^=0x60;
led=0;
}
if(++adc>=100)
{
ADCSRA |=(1<<ADSC); //启动AD转换
adc=0;
}
led_display(1);
}
}
////////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -