![]() |
發布時間: 2018-3-23 16:26
正文摘要:新手,沒有太多的黑幣,抱歉了! 如圖,想做一個多路開關玩,手頭有拆機的MCU,請高手幫忙設計程序。 1、KEY1~7分別控制LED1~7; 2、當任意一個KEY按下后對應LED點亮,但其它LED滅; 4、需要在關機斷電時記錄最 ... |
511386807 發表于 2018-3-24 14:28 師傅,幫忙看看我的代碼哪里有問題。 加入存儲后,按鈕無法控制LED了,不加就可以,但是不能存儲。 |
#include "STC_IAP_EEPROM.h" #include "common.h" #define uchar unsigned char #define uint unsigned int /*=================DF¶¨òåÏà1Ø================*/ #define FLAG_EPPROM_ADDR 0 //EPPROMÄú′æ3õê¼»ˉ±êÖ¾μØÖ· #define MODE_EPPROM_ADDR 8 //êäèëí¨μà′æ′¢μØÖ· #define OUTMODE_EPPROM_ADDR 12 //êä3öí¨μà′æ′¢μØÖ· void RecoverParam(void) { unsigned char temp; temp = Byte_Read(FLAG_EPPROM_ADDR); if(temp == 0x5a) { mode = Byte_Read(MODE_EPPROM_ADDR); if(mode>5) mode=0; } } void UpdateSaveParam(void) { Sector_Erase(FLAG_EPPROM_ADDR); //2á3yÕû¸öéèÇø Byte_Program(FLAG_EPPROM_ADDR, 0x5a); //½« DEBUG_DATA D′èë EEPROM Byte_Program(MODE_EPPROM_ADDR, mode); } //5msÑóê± void Delay5Ms(void) { unsigned int TempCyc = 60552; while(TempCyc--); } //400msÑóê± void Delay400Ms(void) { unsigned char TempCycA = 5; unsigned int TempCycB; while(TempCycA--) { TempCycB=44269; while(TempCycB--); } UpdateSaveParam(); } //-------------------------------------í¨μàêäèëÑ¡Ôñé趨oˉêy¿aê¼---------------------------------------// void key_scan() { static bit KEY_MODE1_sign,KEY_MODE2_sign,KEY_MODE3_sign,KEY_MODE4_sign,KEY_MODE5_sign; //¾2ì¬Î»±äá¿°′¼ü×ÔËø±êÖ¾ static uint count1,count2,count3,count4,count5; //¾2쬼Æêy±äá¿ if(KEY_MODE1==0) //¼ì2a°′¼ü1°′Ï { if(KEY_MODE1_sign==0) { count1++; //Ïû¶¶¼Æêy1×Ô+1 if(count1>=1000) //°′Ö÷Ñ-»·ÖüÆú100~2000μ÷Õû { KEY_MODE1_sign=1; //°′¼ü1×ÔËø±êÖ¾ÖÃ1 K1=0;K2=K3=K4=K5=1; //led1è¡·′ } } } else //°′¼ü1ì§Æe { KEY_MODE1_sign=0; //°′¼ü1×ÔËø±êÖ¾Çå0 count1=0; //Ïû¶¶¼Æêy1Çå0 } if(KEY_MODE2==0) //¼ì2a°′¼ü2°′Ï { if(KEY_MODE2_sign==0) { count2++; //Ïû¶¶¼Æêy1×Ô+1 if(count2>=1000) //°′Ö÷Ñ-»·ÖüÆú100~2000μ÷Õû { KEY_MODE2_sign=1; //°′¼ü2×ÔËø±êÖ¾ÖÃ1 K2=0;K1=K3=K4=K5=1; //led2è¡·′ } } } else //°′¼ü2ì§Æe { KEY_MODE2_sign=0; //°′¼ü2×ÔËø±êÖ¾Çå0 count2=0; //Ïû¶¶¼Æêy1Çå0 } if(KEY_MODE3==0) //¼ì2a°′¼ü3°′Ï { if(KEY_MODE3_sign==0) { count3++; //Ïû¶¶¼Æêy1×Ô+1 if(count3>=1000) //°′Ö÷Ñ-»·ÖüÆú100~2000μ÷Õû { KEY_MODE3_sign=1; //°′¼ü1×ÔËø±êÖ¾ÖÃ3 K3=0;K2=K1=K4=K5=1; //led3è¡·′ } } } else //°′¼ü1ì§Æe { KEY_MODE3_sign=0; //°′¼ü1×ÔËø±êÖ¾Çå0 count3=0; //Ïû¶¶¼Æêy1Çå0 } if(KEY_MODE4==0) //¼ì2a°′¼ü2°′Ï { if(KEY_MODE4_sign==0) { count4++; //Ïû¶¶¼Æêy1×Ô+1 if(count4>=1000) //°′Ö÷Ñ-»·ÖüÆú100~2000μ÷Õû { KEY_MODE4_sign=1; //°′¼ü2×ÔËø±êÖ¾ÖÃ1 K4=0;K1=K3=K2=K5=1; //led4è¡·′ } } } else //°′¼ü4ì§Æe { KEY_MODE4_sign=0; //°′¼ü4×ÔËø±êÖ¾Çå0 count4=0; //Ïû¶¶¼Æêy1Çå0 } if(KEY_MODE5==0) //¼ì2a°′¼ü2°′Ï { if(KEY_MODE5_sign==0) { count5++; //Ïû¶¶¼Æêy1×Ô+1 if(count5>=1000) //°′Ö÷Ñ-»·ÖüÆú100~2000μ÷Õû { KEY_MODE5_sign=1; //°′¼ü5×ÔËø±êÖ¾ÖÃ1 K5=0;K1=K3=K2=K4=1; //led5è¡·′ } } } else //°′¼ü5ì§Æe { KEY_MODE5_sign=0; //°′¼ü5×ÔËø±êÖ¾Çå0 count5=0; //Ïû¶¶¼Æêy1Çå0 } UpdateSaveParam(); } /************Ö÷3ìDò************/ void main() { RecoverParam(); key_scan(); } |
沒有EEProm沒法實現記憶功能 |
511386807 發表于 2018-3-24 14:28 關鍵是,不會寫。 ![]() |
每次有按鍵按下時,將當前的狀態寫入EEPROM中,每次程序啟動時,從EEPROM讀取就行。 |