|
發布時間: 2018-1-6 19:28
正文摘要:這個程序中是鍵盤連接P1.0-P1.7的時候用的,而我的電路因為某些原因鍵盤連接的是P1.1-P1.7和P5.4,求助大佬這部分程序應該怎么改 |
| 建議7個按鍵都換個引腳,如果不想換的話就定義一個類似于“anjian 5=P4^5”的,然后把那個P1口控制不了的功能接P4^5 |
| 才接觸,學習了 |
wulin 發表于 2018-1-6 20:31 還沒試,先感謝一下大佬 ![]() |
110011 發表于 2018-1-6 20:26 用的是stc的15f2k16s2,有p5.4 |
le51 發表于 2018-1-6 19:52 用的是stc的15f2k16s2,p1.0是pwm輸出口,要用到 |
|
異組端口組成4*4矩陣鍵盤的端口狀態讀寫方法 #include <AT89X51.H> #define uint unsigned int //宏定義數據類型uint #define uchar unsigned char //宏定義數據類型uchar sbit code0=P3^0; //定義4*4鍵盤端口 sbit code1=P3^1; sbit code2=P3^2; sbit code3=P3^3; sbit code4=P3^4; sbit code5=P3^5; sbit code6=P2^2; sbit code7=P2^4; uchar key=0xff; //鍵值變量初始值 void PX(uchar i) //寫入8位數據 { code0=i&0x01;i>>=1; code1=i&0x01;i>>=1; code2=i&0x01;i>>=1; code3=i&0x01;i>>=1; code4=i&0x01;i>>=1; code5=i&0x01;i>>=1; code6=i&0x01;i>>=1; code7=i&0x01; } uchar PD() //讀取8位數據 { uchar i; i=code7; i=(i<<1)|code6; i=(i<<1)|code5; i=(i<<1)|code4; i=(i<<1)|code3; i=(i<<1)|code2; i=(i<<1)|code1; i=(i<<1)|code0; return i; } void key_scan() //矩陣鍵盤掃描函數 { uchar temp1,temp2,temp3; //臨時變量 static bit sign=0; //按鍵自鎖標志 static uint count=0; //消抖計數變量 PX(0xf0); //先給矩陣端口賦一個初值0xf0 if(PD()!=0xf0) //判斷矩陣端口不等于所賦初值,說明有健按下 { if(sign==0) //如果按鍵自鎖標志為0 { count++; //消抖計數 if(count>=1000) //消抖計數自>=200,估算主循環周期調整 { //摒棄Delay延時方式, count=1000; //防止溢出 sign=1; //按鍵自鎖標志置1,鍵不抬起,按其他鍵無效 temp1=PD(); //temp1保存矩陣端口高4位變化 PX(0x0f); //再給矩陣端口賦值0x0f temp2=PD(); //temp2保存矩陣端口低4位變化 temp3=temp2|temp1; //temp3=高4位+低4位 key=temp3; //保存鍵值 } } } else //按鍵抬起 { sign=0; //按鍵自鎖標志清0 count=0; //消抖計數清0 } } void main() { while(1) { key_scan(); //鍵盤掃描 P1=key; //LED低電平亮顯示鍵值 } } |
| 單片機哪來的P5.4啊 |
| 我想問一下你的P1.0怎么用的 |
| 首先在函數聲明時,應該先要對P5.4進行聲明和定義,sbit “某一位”=P5^4;然后具體程序具體看 |