ATmega128(EEPROM)
//在LED數(shù)碼管上顯示讀出的數(shù)據(jù),可用復(fù)位鍵刷新顯示
//編譯環(huán)境 AVR Studio 4.17/AVR GCC
//系統(tǒng)時(shí)鐘7.3728MHZ,設(shè)置熔絲位為外部高頻石英晶體振蕩,啟動(dòng)時(shí)間4.1ms
//***********************************************************************
//包含文件
//***********************************************************************
#include
#include
#define F_CPU7372800// 單片機(jī)主頻為7.3728MHz,用于延時(shí)子程序
#include
#include <avr/io.h>
#include
#include interrupt.h> //中斷信號(hào)頭文件
//***********************************************************************
//定義變量區(qū)
//***********************************************************************
#define Data_IO PORTA //數(shù)碼管數(shù)據(jù)口
#define Data_DDR DDRA //數(shù)碼管數(shù)據(jù)口方向寄存器
#define D_LE0 PORTD &= ~(1 << PD4) //數(shù)碼管段控制位為0,鎖存端口數(shù)據(jù)
#define D_LE1 PORTD |= (1 << PD4) //數(shù)碼管段控制位為1,鎖存器輸出與端口一致
#define W_LE0 PORTD &= ~(1 << PD5) //數(shù)碼管位控制位為0
#define W_LE1 PORTD |= (1 << PD5) //數(shù)碼管位控制位為1
#define delay_us(x) _delay_us(x) //AVR GCC延時(shí)函數(shù) x(us)
#define delay_ms(x) _delay_ms(x) //AVR GCC延時(shí)函數(shù) x(ms)
#define uchar unsigned char
#define uint unsigned int
//***********************************************************************
//共陰數(shù)碼管顯示的斷碼表0~F
//***********************************************************************
uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uint A1,A2,A3; //定義的變量,顯示數(shù)據(jù)處理
//***********************************************************************
//IO端口初始化
//***********************************************************************
void system_init()
{
Data_IO=0xFF; //數(shù)據(jù)口為輸出
Data_DDR=0xFF;
PORTD=0xFF; //74HC573的控制口,設(shè)置為輸出
DDRD=0xFF;
PORTB=0XFF;
DDRB=0XFF;
}
//*************************************************************************
//74HC573控制數(shù)碼管動(dòng)態(tài)掃描顯示函數(shù),顯示采集到的溫度
//*************************************************************************
void Display_EEPROM(void)
{
uchar i,j;
system_init();
j=0x01; //此數(shù)據(jù)用來(lái)控制位選
for(i=0;i<5;i++) //用后3位數(shù)碼管來(lái)顯示
{
D_LE1;
W_LE1;
Data_IO=~j;
W_LE0;
j=(j<<1);
Data_IO=0x00;
D_LE0;
delay_ms(1);
}
D_LE1;
W_LE1;
Data_IO=~j;
W_LE0;
j=(j<<1);
Data_IO=table[A1];
D_LE0;
delay_ms(1);
D_LE1;
W_LE1;
Data_IO=~j;
W_LE0;
j=(j<<1);
Data_IO=table[A2];
D_LE0;
delay_ms(1);
D_LE1;
W_LE1;
Data_IO=~j;
W_LE0;
j=(j<<1);
Data_IO=table[A3];
D_LE0;
delay_ms(1);
D_LE1;
W_LE1;
Data_IO=0xff;
W_LE0;
}
//*************************************************************************
//數(shù)據(jù)處理函數(shù)
//*************************************************************************
void data_do(uchar temp_d)
{
uint A2t;
A1=temp_d/100; //分出百,十,和個(gè)位
A2t=temp_d%100;
A2=A2t/10;
A3=A2t%10;
}
//***********************************************************************
// EEPROM讀取函數(shù)*/
// addr:地址;number:長(zhǎng)度;p_buff:讀出數(shù)據(jù)存放指針
//***********************************************************************
void eprom_read(unsigned int addr, unsigned char number, unsigned char *p_buff) {
while(EECR & (1 << EEWE)); //等待前面的寫完成
EEARH = 0x00; //寫高字節(jié)地址
while(number --) {
EEARL = addr ++; //寫地址低字節(jié)
EECR |= (1 << EERE); //讀允許位置1
*p_buff++ = EEDR; //讀出EEDR中的數(shù)據(jù)
}
}
//***********************************************************************
// EEPROM寫入函數(shù)
// addr:地址;number:長(zhǎng)度;p_buff:寫入數(shù)據(jù)存放指針
//***********************************************************************
void eprom_write(unsigned int addr, unsigned char number, unsigned char *p_buff) {
EEARH = 0x00;
while(number --) {
while(EECR & (1 << EEWE)); //等待前面的寫完成
EEARL = addr ++; //寫地址
EEDR = *p_buff ++; //寫數(shù)據(jù)到EEDR
EECR |= (1 << EEMWE); //主機(jī)寫入允許位
EECR&=~(1<
}
}
//***********************************************************************
// 主函數(shù)
//***********************************************************************
int main(void)
{
unsigned char temp;
system_init(); //系統(tǒng)初始化
eprom_read(0x10, 0x01, &temp);//讀出記錄
delay_ms(10);
temp ++; //計(jì)數(shù)值加1
eprom_write(0x10, 0x01, &temp);//寫入記錄
delay_ms(10);
while (1)
{
data_do(temp); //每啟動(dòng)一次temp加1,記錄到EEPROM中
Display_EEPROM();//顯示計(jì)數(shù)值
}
}
評(píng)論