完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
/*******************************************************************************
标题: EEPROM读写试验(按钮输入) * ******************************************************************************** * 此例程学员更进一步地熟悉并掌握(存储芯片AT2402)的操作,有保存和读取操作 * 了解掌握I2C总线接口的工作原理及一般编程方法。 * * 跳线操作:P0(JP10)连 数码管(JP12) * P1(JP8 )连 独立按键(JP5) * * 具体操作: 第1个按钮保存 第2个按钮读取 * 第3个按钮减减 第4个按钮加数 * * 希望学员认真体会消化此例程,试着用别的资源来操作EEPROM! * ********************************************************************************/ #include #include #define AT24C02 0xa0 //AT24C02 地址 //else IO ***it LS138A=P2^2; //译码器端 ***it LS138B=P2^3; ***it LS138C=P2^4; ***it K1 = P1^0; //保存 ***it K2 = P1^1; //读取 ***it K3 = P1^2; //+数据 ***it K4 = P1^3; //-数据 void delay(unsigned int i); //此表为 LED 的字模, 共阴数码管 0-9 - unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; unsigned char Count1; unsigned long D[16], LedOut[5],LedNumVal; unsigned int idata USEC; void system_ini() { TMOD|= 0x11; TH1 = 0xfe; //11.0592 TL1 = 0x33; TR1 = 1; IE =0x8A; } main() { unsigned char i; unsigned char pDat[8]; system_ini(); while(1) { //========================IIC 读取 if(K2 == 0) //第二个按钮读取数据 { IRcvStr(AT24C02, 0 , &pDat[0], 8); for (i=0; i<4; i++) { D[14+i]=pDat[i*2+0]+pDat[i*2+1]*0x100; Count1 = D[14]; } } //========================IIC 保存 if(K1 == 0) //第一个按钮保存数据 { D[14]= Count1; for (i=0; i<4; i++) { pDat[i*2+0]=D[14+i]; pDat[i*2+1]=D[14+i]>>8; } ISendStr(AT24C02, 0 , &pDat[0], 8); } /********以下将2402中保存的数据送到LED数码管显示*************/ LedNumVal=Count1; LedOut[0]=Disp_Tab[LedNumVal%10000/1000]; LedOut[1]=Disp_Tab[LedNumVal%1000/100]; LedOut[2]=Disp_Tab[LedNumVal%100/10]|0x80; LedOut[3]=Disp_Tab[LedNumVal%10]; for(i=0; i<4; i++) { P0 = LedOut[i]; switch(i) { case 0:LS138A=0; LS138B=0; LS138C=0; break; case 1:LS138A=1; LS138B=0; LS138C=0; break; case 2:LS138A=0; LS138B=1; LS138C=0; break; case 3:LS138A=1; LS138B=1; LS138C=0; break; case 4:LS138A=0; LS138B=0; LS138C=1; break; } delay(100); } // LS138A=1; LS138B=1; LS138C=1; } } void delay(unsigned int i) { char j; for(i; i > 0; i--) for(j = 200; j > 0; j--); } /************************************* [ t1 (0.5ms)中断] 中断中做 PWM 输出 ------------1000/(0.02ms*250)=200Hz *************************************/ void T1zd(void) interrupt 3 //3 为定时器1的中断号 1 定时器0的中断号 0 外部中断1 2 外部中断2 4 串口中断 { TH1 = 0xfe; //12M TL1 = 0x33; if(USEC++==200) { USEC=0; if (K3) Count1++; //改变数据 if (K4&Count1!=0) Count1--; } } 、、//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /******************************************************************************* 标题: EEPROM读写试验(按钮输入) * ******************************************************************************** * 此例程学员更进一步地熟悉并掌握(存储芯片AT2402)的操作,有保存和读取操作 * 了解掌握I2C总线接口的工作原理及一般编程方法。 * * 跳线操作:P0(JP10)连 数码管(JP12) * P1(JP8 )连 独立按键(JP5) * * 具体操作: 第1个按钮保存 第2个按钮读取 * 第3个按钮减减 第4个按钮加数 * * 希望学员认真体会消化此例程,试着用别的资源来操作EEPROM! * ********************************************************************************/ #include #include #define AT24C02 0xa0 //AT24C02 地址 //else IO ***it LS138A=P2^2; //译码器端 ***it LS138B=P2^3; ***it LS138C=P2^4; ***it K1 = P1^0; //保存 ***it K2 = P1^1; //读取 ***it K3 = P1^2; //+数据 ***it K4 = P1^3; //-数据 void delay(unsigned int i); //此表为 LED 的字模, 共阴数码管 0-9 - unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; unsigned char Count1; unsigned long D[16], LedOut[5],LedNumVal; unsigned int idata USEC; void system_ini() { TMOD|= 0x11; TH1 = 0xfe; //11.0592 TL1 = 0x33; TR1 = 1; IE =0x8A; } main() { unsigned char i; unsigned char pDat[8]; system_ini(); while(1) { //========================IIC 读取 if(K2 == 0) //第二个按钮读取数据 { IRcvStr(AT24C02, 0 , &pDat[0], 8); for (i=0; i<4; i++) { D[14+i]=pDat[i*2+0]+pDat[i*2+1]*0x100; Count1 = D[14]; } } //========================IIC 保存 if(K1 == 0) //第一个按钮保存数据 { D[14]= Count1; for (i=0; i<4; i++) { pDat[i*2+0]=D[14+i]; pDat[i*2+1]=D[14+i]>>8; } ISendStr(AT24C02, 0 , &pDat[0], 8); } /********以下将2402中保存的数据送到LED数码管显示*************/ LedNumVal=Count1; LedOut[0]=Disp_Tab[LedNumVal%10000/1000]; LedOut[1]=Disp_Tab[LedNumVal%1000/100]; LedOut[2]=Disp_Tab[LedNumVal%100/10]|0x80; LedOut[3]=Disp_Tab[LedNumVal%10]; for(i=0; i<4; i++) { P0 = LedOut[i]; switch(i) { case 0:LS138A=0; LS138B=0; LS138C=0; break; case 1:LS138A=1; LS138B=0; LS138C=0; break; case 2:LS138A=0; LS138B=1; LS138C=0; break; case 3:LS138A=1; LS138B=1; LS138C=0; break; case 4:LS138A=0; LS138B=0; LS138C=1; break; } delay(100); } // LS138A=1; LS138B=1; LS138C=1; } } void delay(unsigned int i) { char j; for(i; i > 0; i--) for(j = 200; j > 0; j--); } /************************************* [ t1 (0.5ms)中断] 中断中做 PWM 输出 ------------1000/(0.02ms*250)=200Hz *************************************/ void T1zd(void) interrupt 3 //3 为定时器1的中断号 1 定时器0的中断号 0 外部中断1 2 外部中断2 4 串口中断 { TH1 = 0xfe; //12M TL1 = 0x33; if(USEC++==200) { USEC=0; if (K3) Count1++; //改变数据 if (K4&Count1!=0) Count1--; } } /////////////////////////////////////////////////////////////////// while(1) { //========================IIC 读取 if(K2 == 0) //第二个按钮读取数据 { IRcvStr(AT24C02, 0 , &pDat[0], 8); for (i=0; i<4; i++) { D[14+i]=pDat[i*2+0]+pDat[i*2+1]*0x100; Count1 = D[14]; } } //========================IIC 保存 if(K1 == 0) //第一个按钮保存数据 { D[14]= Count1; for (i=0; i<4; i++) { pDat[i*2+0]=D[14+i]; pDat[i*2+1]=D[14+i]>>8; } ISendStr(AT24C02, 0 , &pDat[0], 8); } 这部分有人能解释一下么 ? |
|
相关推荐
2个回答
|
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
494 浏览 0 评论
使用Keil建立完整的工程,并使用外部中断0触发数码管显示903
1050 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-使用AHT20进行环境监测之AHT20传感器介绍
1151 浏览 0 评论
887 浏览 0 评论
928 浏览 1 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11840 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-2 06:59 , Processed in 0.578607 second(s), Total 77, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号