24c02程序
- 格式:doc
- 大小:59.00 KB
- 文档页数:9
/*
按下4×4键盘任意一个键,记下数码管显示的值。复位单片机后数码管显示刚才显示的值
学习IIC接口的EEPROM读写:IIC接口的时序比较复杂,对初学者难度较大,要对照at24c02资料的时序图认真研究才明白
*/
#include
sbit speaker=P3^7;
sbit led_k=P1^4;
/////////////////键盘
sbit v1=P2^0;
sbit v2=P2^1;
sbit v3=P2^2;
sbit v4=P2^3;
sbit h1=P2^4;
sbit h2=P2^5;
sbit h3=P2^6;
sbit h4=P2^7;
/////////////////显示
sbit shu1=P1^3;/*第1位数码管共阴端*/
sbit shu2=P1^2;/*第2位数码管共阴端*/
sbit shu3=P1^1;/*第3位数码管共阴端*/
sbit shu4=P1^0;/*第4位数码管共阴端*/
////////////////24c02
sbit sda=P1^6;
sbit scl=P1^5;
void start();
void delay1();
unsigned int read(unsigned int word_address);
void write(unsigned int word_address,da);
void delayms(unsigned int i);
unsigned char yima[]={0xeb,0x88,0xb3,0xba,0xd8,0x7a,0x7b,0xa8,0xfb,0xfa};/*译码表,此表数据和硬件相关*/
unsigned int b=0;/*要显示的数据*/
unsigned int b_count=0;/*扫描次数*/
void delayms(unsigned int i);
unsigned char keyboar();
void t0()interrupt 1 using 1 /*中断程序负责显示b的值 */
{
unsigned char a1=0,a2=0,a3=0,a4=0;
static int k=0;
/*数码管扫描显示*/
a1=b/1000;/*取b的千位*/
a2=b%1000/100;/*取b的百位*/
a3=b%100/10;/*取b的十位*/
a4=b%10;/*取b的个位*/
if(k==0){shu4=1;shu1=0;shu2=0;shu3=0;P0=yima[a1];}
else if(k==1){shu4=0;shu1=1;shu2=0;shu3=0;P0=yima[a4];}
else if(k==2){shu4=0;shu1=0;shu2=1;shu3=0;P0=yima[a3];}
else if(k==3){shu4=0;shu1=0;shu2=0;shu3=1;P0=yima[a2];}
k++;
if(k>3)k=0;
TH0=240;
}
main()
{
//write(1,60);
unsigned char b_tem;
b=read(1); //读取eeprom地址为1的数据并赋值给b,定时中断程序把b显示在数码管
speaker=0;/*关闭蜂鸣器电源,否则蜂鸣器会发热*/
led_k=0;//关闭led
EA=1;/*开全局中断 */
TR0=1;/*定时器0开始计数 */
ET0=1;/*定时器0开中断 */
TMOD=0X01;/*定时器0工作在方式1:16位计数模式 */
while(0)
{
}
while(1)
{
b_tem=keyboar();/*把按键的代表的值给b */
if(b_tem<17) {
if(b!=b_tem) //当按下的按键与上次按下的不同时,执行写EERPOM。
{
delayms(30);
b=b_tem;
write(1,b);/*把b的值写到24c02的地址为1的空间 */
}
}
}
}
void delayms(unsigned int i)
{
unsigned int j;
for(;i>0;i--)
for(j=100;j>0;j--);
}
unsigned char keyboar()/*线反转法 */
{
static unsigned int a=0;
unsigned char a1=0,b1=0;
/*行线为输入线,列线为输出线 */
v1=v2=v3=v4=0;
h1=h2=h3=h4=1;
if(P2<0xf0)/*检查行是否有按键按下 */
{
delayms(10);
if(P2<0xf0)
{
/*行线为输入线,列线为输出线 */
v1=v2=v3=v4=0;
h1=h2=h3=h4=1;
a1=P2;
/*行线为输出线,列线为输入线 */
h1=h2=h3=h4=0;
v1=v2=v3=v4=1;
b1=P2;
a=a1|b1; /*与0x03相或是为了屏蔽p2.0和p2.1的影响*/
}
}
if (a==0xe7){return 7;}//chu
else if(a==0xeb){return 8;}
else if(a==0xed){return 9;}
else if(a==0xee){return 13;}
else if(a==0xd7){return 4;}//
else if(a==0xdb){return 5;}
else if(a==0xdd){return 6;}
else if(a==0xde){return 12;}
else if(a==0xb7){return 1;}//-
else if(a==0xbb){return 2;}
else if(a==0xbd){return 3;}
else if(a==0xbe){return 11;}
else if(a==0x77){return 0;}//+
else if(a==0x7b){return 15;}
else if(a==0x7d){return 16;}
else if(a==0x7e){return 10;}
else return 17;//cuo wu
}
unsigned int read(unsigned int word_address) //EEPROM读函数,参数为eepro内的单元地址,返回相应的读取数据
{unsigned int i=0,m=0,j=0,k=0,read_d=0xa1,write=0xa0,b=0,da2=0;
bit a=1,c=0;
start();
j=0;
while(1)//device address
{
k=(write<
if(k>1)b=1;
else b=0;
sda=b;
delay1();
scl=1; delay1();
scl=0;
delay1();
sda=1;
if(sda==0)break;
}
//sda=1;//check ack
//a=sda;
scl=1;
delay1();
scl=0;
j=0;
while(1)//word address
{
k=(word_address<
if(k>1)b=1;
else b=0;
sda=b;
delay1();
scl=1;
delay1();
scl=0;
delay1();
sda=1;
if(sda==0)break;
}
//sda=1;//check ack
//a=sda;
scl=1;
delay1();
scl=0;
start();
j=0;
for(i=0;i<8;i++)
{
k=(read_d<
if(k>1)b=1;