第47节:操作AT24C02利用定时器延时改善数码管的闪烁
时间:11-22
来源:互联网
点击:
- //按键去抖动延时计数器
- unsigned char ucKeyLock2=0; //按键触发后自锁的变量标志
- unsigned intuiKeyTimeCnt3=0; //按键去抖动延时计数器
- unsigned char ucKeyLock3=0; //按键触发后自锁的变量标志
- unsigned intuiVoiceCnt=0;//蜂鸣器鸣叫的持续时间计数器
- unsigned charucVoiceLock=0;//蜂鸣器鸣叫的原子锁
- unsigned char ucDigShow8;//第8位数码管要显示的内容
- unsigned char ucDigShow7;//第7位数码管要显示的内容
- unsigned char ucDigShow6;//第6位数码管要显示的内容
- unsigned char ucDigShow5;//第5位数码管要显示的内容
- unsigned char ucDigShow4;//第4位数码管要显示的内容
- unsigned char ucDigShow3;//第3位数码管要显示的内容
- unsigned char ucDigShow2;//第2位数码管要显示的内容
- unsigned char ucDigShow1;//第1位数码管要显示的内容
- unsigned char ucDigDot8;//数码管8的小数点是否显示的标志
- unsigned char ucDigDot7;//数码管7的小数点是否显示的标志
- unsigned char ucDigDot6;//数码管6的小数点是否显示的标志
- unsigned char ucDigDot5;//数码管5的小数点是否显示的标志
- unsigned char ucDigDot4;//数码管4的小数点是否显示的标志
- unsigned char ucDigDot3;//数码管3的小数点是否显示的标志
- unsigned char ucDigDot2;//数码管2的小数点是否显示的标志
- unsigned char ucDigDot1;//数码管1的小数点是否显示的标志
- unsigned char ucDigShowTemp=0; //临时中间变量
- unsigned char ucDisplayDriveStep=1;//动态扫描数码管的步骤变量
- unsigned char ucWd1Update=1; //窗口1更新显示标志
- unsigned char ucWd2Update=0; //窗口2更新显示标志
- unsigned char ucWd3Update=0; //窗口3更新显示标志
- unsigned char ucWd4Update=0; //窗口4更新显示标志
- unsigned char ucWd=1;//本程序的核心变量,窗口显示变量。类似于一级菜单的变量。代表显示不同的窗口。
- unsigned intuiSetData1=0;//本程序中需要被设置的参数1
- unsigned intuiSetData2=0;//本程序中需要被设置的参数2
- unsigned intuiSetData3=0;//本程序中需要被设置的参数3
- unsigned intuiSetData4=0;//本程序中需要被设置的参数4
- unsigned char ucTemp1=0;//中间过渡变量
- unsigned char ucTemp2=0;//中间过渡变量
- unsigned char ucTemp3=0;//中间过渡变量
- unsigned char ucTemp4=0;//中间过渡变量
- unsigned char ucDelayTimerLock=0; //原子锁
- unsigned intuiDelayTimer=0;
- unsigned char ucCheckEeprom=0;//检查EEPROM芯片是否正常
- unsigned char ucEepromError=0; //EEPROM芯片是否正常的标志
- unsigned char ucEepromLock=0;//原子锁
- unsigned intuiEepromCnt=0; //间歇性蜂鸣器报警的计时器
- //根据原理图得出的共阴数码管字模表
- code unsigned char dig_table[]=
- {
- 0x3f,//0 序号0
- 0x06,//1 序号1
- 0x5b,//2 序号2
- 0x4f,//3 序号3
- 0x66,//4 序号4
- 0x6d,//5 序号5
- 0x7d,//6 序号6
- 0x07,//7 序号7
- 0x7f,//8 序号8
- 0x6f,//9 序号9
- 0x00,//无 序号10
- 0x40,//- 序号11
- 0x73,//P 序号12
- };
- void main()
- {
- initial_myself();
- delay_long(100);
- initial_peripheral();
- while(1)
- {
- key_service(); //按键服务的应用程序
- display_service(); //显示的窗口菜单服务程序
- eeprom_alarm_service(); //EEPROM出错报警
- }
- }
- void eeprom_alarm_service(void) //EEPROM出错报警
- {
- if(ucEepromError==1) //EEPROM出错
- {
- if(uiEepromCnt
- {
- ucEepromLock=1;//原子锁加锁
- uiEepromCnt=0; //计时器清零
- ucEepromLock=0;//原子锁解锁
- ucVoiceLock=1;//原子锁加锁,保护主函数与中断函数的共享变量uiVoiceCnt
- uiVoiceCnt=const_voice_short; //蜂鸣器声音触发,滴一声就停。
- ucVoiceLock=0;//原子锁解锁,保护主函数与中断函数的共享变量uiVoiceCnt
- }
- }
- }
- //AT24C02驱动程序
- void start24(void)//开始位
- {
- eeprom_sda_dr_sr=1;
- eeprom_scl_dr=1;
- delay_short(15);
- eeprom_sda_dr_sr=0;
- delay_short(15);
- eeprom_scl_dr=0;
- }
- void ack24(void)//确认位时序
- {
- eeprom_sda_dr_sr=1; //51单片机在读取数据之前要先置一,表示数据输入
- eeprom_scl_dr=1;
- delay_short(15);
- eeprom_scl_dr=0;
- delay_short(15);
- //在本驱动程序中,我没有对ACK信号进行出错判断,因为我这么多年一直都是这样用也没出现过什么问题。
- //有兴趣的朋友可以自己增加出错判断,不一定非要按我的方式去做。
- }
- void stop24(void)//停止位
- {
- eeprom_sda_dr_sr=0;
- eeprom_scl_d
AT24C02定时器延时数码 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)