#include <iom16.h>
#include <intrinsics.h>
#include <intrinsics.h>
#define uchar unsigned char
#define uint unsigned int
__flash uchar seg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
__flash uchar tab[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
__flash uchar tab[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
#define EEWE 1
#define EERE 0
#define EEMWE 2
#define EERE 0
#define EEMWE 2
#define k1 PIND_Bit4 //地址變化鍵
#define k2 PIND_Bit5 //數據變化鍵
#define k3 PIND_Bit6 //地址寫入
#define k4 PIND_Bit7 //地址讀出
#define k2 PIND_Bit5 //數據變化鍵
#define k3 PIND_Bit6 //地址寫入
#define k4 PIND_Bit7 //地址讀出
uint val; //顯示的存儲數值
uchar address,data; //存儲地址和數值
void delay(uint k) //延遲函數
{
uint i,j;
for(i=0;i<k;i++)
for(j=0;j<1140;j++);
}
void key1()
{
static uchar i,j;
if(k1==0)
{
if(i==0)
{
j++;
if(j>3)
{
if(k1==0)
{
i=1;j=0;
address++;
}
}
}
}
else
{
i=0;j=0;
}
}
{
static uchar i,j;
if(k1==0)
{
if(i==0)
{
j++;
if(j>3)
{
if(k1==0)
{
i=1;j=0;
address++;
}
}
}
}
else
{
i=0;j=0;
}
}
void key2()
{
static uchar i,j;
if(k2==0)
{
if(i==0)
{
j++;
if(j>3)
{
if(k2==0)
{
i=1;j=0;
data++;
}
}
}
}
else
{
i=0;j=0;
}
}
void show_val(uint k) //顯示數值函數
{
static uchar i=0,j;
uchar ss[6];
do
{
ss[i]=k%10;
i++;
}while(k/=10);
for(j=0;j<i;j++)
{
PORTA=seg[ss[j]];
PORTC=tab[j];
delay(1);
PORTA=0xff;
PORTC=0xff;
}
i=0;
}
{
static uchar i=0,j;
uchar ss[6];
do
{
ss[i]=k%10;
i++;
}while(k/=10);
for(j=0;j<i;j++)
{
PORTA=seg[ss[j]];
PORTC=tab[j];
delay(1);
PORTA=0xff;
PORTC=0xff;
}
i=0;
}
void show_address(uint k) //顯示數值函數
{
static uchar i=0,j;
uchar ss[6];
do
{
ss[i]=k%10;
i++;
}while(k/=10);
for(j=0;j<i;j++)
{
PORTA=seg[ss[j]];
PORTC=tab[j+3];
delay(1);
PORTA=0xff;
PORTC=0xff;
}
i=0;
}
{
static uchar i=0,j;
uchar ss[6];
do
{
ss[i]=k%10;
i++;
}while(k/=10);
for(j=0;j<i;j++)
{
PORTA=seg[ss[j]];
PORTC=tab[j+3];
delay(1);
PORTA=0xff;
PORTC=0xff;
}
i=0;
}
void show_data(uint k) //顯示數值函數
{
static uchar i=0,j;
uchar ss[6];
do
{
ss[i]=k%10;
i++;
}while(k/=10);
for(j=0;j<i;j++)
{
PORTA=seg[ss[j]];
PORTC=tab[j+6];
delay(1);
PORTA=0xff;
PORTC=0xff;
}
i=0;
}
{
static uchar i=0,j;
uchar ss[6];
do
{
ss[i]=k%10;
i++;
}while(k/=10);
for(j=0;j<i;j++)
{
PORTA=seg[ss[j]];
PORTC=tab[j+6];
delay(1);
PORTA=0xff;
PORTC=0xff;
}
i=0;
}
#include "1602.h"
void port_init() //端口初始化
{
PORTA=0xff;
DDRA=0xff;
PORTB=0xff;
DDRB=0xff;
PORTC=0xff;
DDRC=0xff;
PORTD=0xff;
DDRD=0x0f;
}
{
PORTA=0xff;
DDRA=0xff;
PORTB=0xff;
DDRB=0xff;
PORTC=0xff;
DDRC=0xff;
PORTD=0xff;
DDRD=0x0f;
}
void write_EEPROM(uchar address,uchar data) //寫入EEPROM函數
{
while(EECR&(1<<EEWE)); //等待變成0
EEAR=address;
EEDR=data;
EECR|=(1<<EEMWE); //
EECR|=(1<<EEWE); //
}
{
while(EECR&(1<<EEWE)); //等待變成0
EEAR=address;
EEDR=data;
EECR|=(1<<EEMWE); //
EECR|=(1<<EEWE); //
}
uchar receive_EEPROM(uchar address) //讀取EEPROM操作
{
while(EECR&(1<<EEWE)); //檢查寫操作位是否正在進行,如果不在進行則進行讀取
EEAR=address;
EECR|=(1<<EERE); //設置為讀狀態
return EEDR;
}
{
while(EECR&(1<<EEWE)); //檢查寫操作位是否正在進行,如果不在進行則進行讀取
EEAR=address;
EECR|=(1<<EERE); //設置為讀狀態
return EEDR;
}
void key3()
{
static uchar i,j;
if(k3==0)
{
if(i==0)
{
j++;
if(j>3)
{
if(k3==0)
{
i=1;j=0;
write_EEPROM(address,data);
}
}
}
}
else
{
i=0;j=0;
}
}
void key4()
{
static uchar i,j;
if(k4==0)
{
if(i==0)
{
j++;
if(j>3)
{
if(k4==0)
{
i=1;j=0;
val=receive_EEPROM(address);
}
}
}
}
else
{
i=0;j=0;
}
}
{
static uchar i,j;
if(k4==0)
{
if(i==0)
{
j++;
if(j>3)
{
if(k4==0)
{
i=1;j=0;
val=receive_EEPROM(address);
}
}
}
}
else
{
i=0;j=0;
}
}
void main()
{
port_init();
{
port_init();
write_EEPROM(address,data);
val=receive_EEPROM(address);
while(1)
{
show_val(val); //顯示數據值
show_address(address); //顯示數據地址
show_data(data); //顯示需要寫入的數據地址
key1(); //改變數據地址
key2(); //改變準備寫入的數據值
key3(); //把數據寫入地址中
key4(); //讀出地址值
}
}
val=receive_EEPROM(address);
while(1)
{
show_val(val); //顯示數據值
show_address(address); //顯示數據地址
show_data(data); //顯示需要寫入的數據地址
key1(); //改變數據地址
key2(); //改變準備寫入的數據值
key3(); //把數據寫入地址中
key4(); //讀出地址值
}
}