第47节:操作AT24C02利用定时器延时改善数码管的闪烁
时间:11-22
来源:互联网
点击:
- r=1;
- delay_short(15);
- eeprom_sda_dr_sr=1;
- }
- unsigned char read24(void)//读取一个字节的时序
- {
- unsigned char outdata,tempdata;
- outdata=0;
- eeprom_sda_dr_sr=1; //51单片机的IO口在读取数据之前要先置一,表示数据输入
- delay_short(2);
- for(tempdata=0;tempdata<8;tempdata++)
- {
- eeprom_scl_dr=0;
- delay_short(2);
- eeprom_scl_dr=1;
- delay_short(2);
- outdata<=1;
- if(eeprom_sda_dr_sr==1)outdata++;
- eeprom_sda_dr_sr=1; //51单片机的IO口在读取数据之前要先置一,表示数据输入
- delay_short(2);
- }
- return(outdata);
- }
- void write24(unsigned char dd) //发送一个字节的时序
- {
- unsigned char tempdata;
- for(tempdata=0;tempdata<8;tempdata++)
- {
- if(dd>=0x80)eeprom_sda_dr_sr=1;
- else eeprom_sda_dr_sr=0;
- dd<=1;
- delay_short(2);
- eeprom_scl_dr=1;
- delay_short(4);
- eeprom_scl_dr=0;
- }
- }
- unsigned char read_eeprom(unsigned int address) //从一个地址读取出一个字节数据
- {
- unsigned char dd,cAddress;
- cAddress=address; //把低字节地址传递给一个字节变量。
- EA=0; //禁止中断
- start24(); //IIC通讯开始
- write24(0xA0); //此字节包含读写指令和芯片地址两方面的内容。
- //指令为写指令。地址为"000"的信息,此信息由A0,A1,A2的引脚决定
- ack24(); //发送应答信号
- write24(cAddress); //发送读取的存储地址(范围是0至255)
- ack24(); //发送应答信号
- start24(); //开始
- write24(0xA1); //此字节包含读写指令和芯片地址两方面的内容。
- //指令为读指令。地址为"000"的信息,此信息由A0,A1,A2的引脚决定
- ack24(); //发送应答信号
- dd=read24(); //读取一个字节
- ack24(); //发送应答信号
- stop24();//停止
- EA=1; //允许中断
- delay_timer(2); //一气呵成的定时器延时方式,在延时的时候还可以动态扫描数码管
- return(dd);
- }
- void write_eeprom(unsigned int address,unsigned char dd) //往一个地址存入一个字节数据
- {
- unsigned char cAddress;
- cAddress=address; //把低字节地址传递给一个字节变量。
- EA=0; //禁止中断
- start24(); //IIC通讯开始
- write24(0xA0); //此字节包含读写指令和芯片地址两方面的内容。
- //指令为写指令。地址为"000"的信息,此信息由A0,A1,A2的引脚决定
- ack24(); //发送应答信号
- write24(cAddress); //发送写入的存储地址(范围是0至255)
- ack24(); //发送应答信号
- write24(dd);//写入存储的数据
- ack24(); //发送应答信号
- stop24();//停止
- EA=1; //允许中断
- delay_timer(4); //一气呵成的定时器延时方式,在延时的时候还可以动态扫描数码管
- }
- unsigned int read_eeprom_int(unsigned int address) //从一个地址读取出一个int类型的数据
- {
- unsigned char ucReadDataH;
- unsigned char ucReadDataL;
- unsigned intuiReadDate;
- ucReadDataH=read_eeprom(address); //读取高字节
- ucReadDataL=read_eeprom(address+1);//读取低字节
- uiReadDate=ucReadDataH;//把两个字节合并成一个int类型数据
- uiReadDate=uiReadDate<8;
- uiReadDate=uiReadDate+ucReadDataL;
- return uiReadDate;
- }
- void write_eeprom_int(unsigned int address,unsigned int uiWriteData) //往一个地址存入一个int类型的数据
- {
- unsigned char ucWriteDataH;
- unsigned char ucWriteDataL;
- ucWriteDataH=uiWriteData>>8;
- ucWriteDataL=uiWriteData;
- write_eeprom(address,ucWriteDataH); //存入高字节
- write_eeprom(address+1,ucWriteDataL); //存入低字节
- }
- void display_service(void) //显示的窗口菜单服务程序
- {
- switch(ucWd)//本程序的核心变量,窗口显示变量。类似于一级菜单的变量。代表显示不同的窗口。
- {
- case 1: //显示P--1窗口的数据
- if(ucWd1Update==1)//窗口1要全部更新显示
- {
- ucWd1Update=0;//及时清零标志,避免一直进来扫描
- ucDigShow8=12;//第8位数码管显示P
- ucDigShow7=11;//第7位数码管显示-
- ucDigShow6=1; //第6位数码管显示1
- ucDigShow5=10;//第5位数码管显示无
- //先分解数据
- ucTemp4=uiSetData1/1000;
- ucTemp3=uiSetData1%1000/100;
- ucTemp2=uiSetData1%100/10;
- ucTemp1=uiSetData1%10;
- //再过渡需要显示的数据到缓冲变量里,让过渡的时间越短越好
- if(uiSetData1<1000)
- {
- ucDigShow4=10;//如果小于1000,千位显示无
- }
- else
- {
AT24C02定时器延时数码 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)