}
void leddis_update(void) {
/*最低位数码管,第四个数码管*/ if(point==0)
HC_595_OUT(table[led_buffer[3]]|(1< HC_595_OUT(table[led_buffer[3]]); led0_en(); delay_nus(60); led0_dis(); if(point==1) HC_595_OUT(table[led_buffer[2]]|(1< HC_595_OUT(table[led_buffer[2]]); led1_en(); delay_nus(60); led1_dis(); if(point==2) HC_595_OUT(table[led_buffer[1]]|(1< HC_595_OUT(table[led_buffer[1]]); led2_en(); delay_nus(60); led2_dis(); /*最高位数码管,第一个数码管*/ if(point==3) HC_595_OUT(table[led_buffer[0]]|(1< HC_595_OUT(table[led_buffer[0]]); led3_en(); delay_nus(60); led3_dis(); } void display_led(unsigned int data) { if(data>9999) { HC_595_OUT(0xFF);//当计数大于9999时,四个数码管同时输出8 PORTB|=((1<<4)|(1<<5)|(1<<6)|(1<<7)); } else if(data>999) { led_buffer[0]=data/1000; led_buffer[1]=(data00)/100; led_buffer[2]=(data0)/10; led_buffer[3]=data; leddis_update(); } else if(data>99) { led_buffer[0]=data/1000; //关闭最高位的那个数码管 led_buffer[1]=(data00)/100; led_buffer[2]=(data0)/10; led_buffer[3]=data; leddis_update(); } else if(data>9) { led_buffer[0]=data/1000; led_buffer[1]=16; led_buffer[2]=(data0)/10; led_buffer[3]=data; leddis_update(); } else { led_buffer[0]=data/1000; led_buffer[1]=16; led_buffer[2]=16; led_buffer[3]=data; leddis_update(); } } volatile unsigned int countnum=0; void timer1_init(void) { TCCR1B = 0x00; //stop TCNT1H = 0x8F; //setup TCNT1L = 0x81; OCR1AH = 0x70; OCR1AL = 0x7F; OCR1BH = 0x70; OCR1BL = 0x7F; OCR1CH = 0x70; OCR1CL = 0x7F; ICR1H = 0x70; ICR1L = 0x7F; TCCR1A = 0x00; TCCR1B = 0x04; //start Timer } #pragma interrupt_handler timer1_ovf_isr:15 void timer1_ovf_isr(void) { TCNT1H = 0x8F; //reload counter high value TCNT1L = 0x81; //reload counter low value countnum++; if(countnum>9999) countnum=0; } void init_devices(void) { CLI(); //disable all interrupts timer1_init(); TIMSK = 0x04; //timer interrupt sources SEI(); //re-enable interrupts } /**************************************************************************** 函数功能:主程序 入口参数: 出口参数: ****************************************************************************/ void main(void) { init_devices(); HC_595_init(); adc_init(); SEI();//开全局中断变量 display(0); while(1) { delay(); display_led(adc_rel/1024.0*5*1000); } } 3、对EEPROM进行读写操作程序 /************************************************ 文件:main.c 用途: 注意:内部8M晶振 ************************************************/ #include \/*向EEPROM里面写入数据 输入量:地址,数据*/ void EEPROM_write(unsigned int uiAddress,unsigned char ucData) { while(EECR&(1< EECR |=(1< /*从EEPROM指定的地址里面读出相应的数据*/ unsigned char EEPROM_read(unsigned int uiAddress) { while(EECR&(1< return EEDR; //返回读入EEDR里面的数据 } void main(void) { unsigned char temp=123; unsigned char data; HC_595_init(); EEPROM_write(0x01,temp); data=EEPROM_read(0x01); while(1) { Seg7_Led_display(data); //调用显示函数将写入的数据又读出来 } } 文件: eeprom12.rar 大小: 40KB 下载: 下载 4、定时器0(轮循方式)程序 /*定时器0和2(均为八位的定时计数器)有四种工作模式,此例是工作在普通模式。 在此模式下,计数器不断的累加,当计数到最大值0xff后返回到0x00重新开始,在TCNT0 为0 的同时,T/C溢出标志TOV0置位*/ //使用轮循方式,当TIFR溢出时,uc_led加1,输出到led时期发光 //TIFR中断标志寄存器 #include //设置数码管输出高电平 DDRE|=1<<2; PORTE|=1<<2; DDRA=0XFF; PORTF=0XFF; TCNT0=0X00;//设定定时计数器的初值为0 TCCR0=0X05;//使用1024分频(共有7种时钟) uc_led=0; k=0; while(1) { while(!(TIFR&0X01));//循环检测TIFR中的溢出标志是否有效 //PORTA=uc_led; uc_led++; if(uc_led==255) {uc_led=0; k++; if(k==255) k=0; PORTA=k; } TIFR|=0X01; //写1到TIFR的TOV0位清除溢出标志为TOV0 } }

