![]() |
發布時間: 2022-2-18 21:56
正文摘要:這是我寫的代碼,想讓它按下key1顯示8個6,按下key2顯示123456,按下key3從10變到0。現在發現一個問題,就是打開單片機沒按任何按鍵就從10變到0。按復位鍵也沒用,問一下這是那個地方有問題 單片機源程序如下 ... |
各位好: 剛巧早日看到這標題, 我也是初學單片機, 見這題目, 我按照原同學思路及要求修改如下, 多謝指正 #include <reg52.h> #include <intrins.h> #define SMG_duan P0 //定義數碼管段碼 為 P0端口 #define SMG_wei P2 //定義數碼管位碼 為 P2端口 sbit key1 = P3^0; //定義 key1~key3 輸入為 P3.0~P3.2 端口 sbit key2 = P3^1; sbit key3 = P3^2; char Wei[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; char Duan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void delayxms(unsigned int x) //這延時函數是原同學的設計 { unsigned char i, j; while(x>0) { _nop_(); i = 2; j = 199; do { while (--j); } while (--i); x--; } } void main() { unsigned char a; unsigned int b; while(1) { if(key1 == 0) // key1被按下時執行 { SMG_duan = 0x00; delayxms(20); while(!key1); // key1放開時顯示 SMG_duan = Duan[6]; // 顯示 66666666 SMG_wei = 0X00; } if(key2 == 0) // key2被按下時執行 { SMG_duan = 0x00; delayxms(20); while(!key2); // key2放開時顯示 while(key1!=0 && key2!=0 && key3!=0) // 此處原程序有錯 while(1)會進入死循環, 所以我検查這 { // 三個按鍵作為退出條件 for(a=0; a<6; a++) { SMG_duan = Duan[a+1]; SMG_wei = Wei[a]; delayxms(1); //顯示 123456 } } } if(key3 == 0) // key3被按下時執行 { SMG_duan = 0x00; delayxms(20); while(!key3); // key3放開時顯示 b = 500; while(b--) { for(a=0; a<=1; a++) { SMG_duan = Duan[a]; SMG_wei = Wei[7-a]; delayxms(1); // 先用動態型式顯示 10 } } for(a=0; a<=9; a++) // 此處我曾經用a=9;a>0;a-- 但出現循環, 原因我定了 { // a為uchar, 所以沒有負數, 永遠為0, for為死循環 SMG_duan = Duan[9-a]; SMG_wei = Wei[7]; // 再用靜態型式顯示 9~0 delayxms(1000); } } } } */*** 這個程序我是用普中開發板通過, 所以程序有些部份需配合開發板設計 ***/ */*** 這個程序我設計是先按下, 放手后執行顯示 ***/ |
當你按下K2后,就一直在里面循環里。 while(1) { for(a=0;a<6;a++) { DU=1; P0=D[a+1]; DU=0; P0=0xff; WE=1; P0=W[a]; WE=0; delayxms(1); } } |
lkc8210 發表于 2022-2-19 00:10 好的,謝謝 |
Proteus仿真沒有樓主說的問題 懷疑是KEY3焊接時對地短路了 KEY2的顯示代碼有問題,沒有成功消影 |