請問您在程序運行到哪您松開的按鍵? 看下面的片段
if((P1 & 0XF0) != 0XF0) /*如果有p1的電平發生變化,就掃描出是哪個鍵*/
{
keycode = key_scan();
P0 = disp_code[keycode];
}
程序一旦進入此 if 語句就必然執行顯示程序,P0口就必然被刷新,如果不巧您在此段程序中松開的按鍵,那顯示的是啥?
② 單片機行列式鍵盤程序問題
從代碼可知,p2高4位被設置為輸出,低4位被設置為輸入;
所以,要讀入數據時得先向低4位寫入數據 1,也就是
P2=key_scen[] 中的 xxxx 1111;
如果有鍵入(其實就是把對應引腳電平拉低為 0),那麼P2的低4位會有變化,即不再是 1111 了,其中的位會有0值出現;
在有鍵入的同時,此刻讀取P2的值就與給P2的輸出值是有不同的;
P2&0xf,就是先讀取P2值,然後去掉高4位,保留低4位,注意了,此處的運算結果並不是保存回 P2,而是暫時存在內部隱含寄存器中;
③ C語言編程:從鍵盤上給一個四行四列的行列式賦值,賦值後按四行四列形式輸出這個行列式。
#include <stdio.h>
int main() {
int i, j, max,min ;
int a[4][4];
for(i=0; i<4; i++) {
for(j=0; j<4; j++) {
scanf("%d", &a[i][j]);
if(i==0 && j==0) {
max = a[0][0];
min = a[0][0];
} else {
if (max < a[i][j]) max = a[i][j];
if (min > a[i][j]) min = a[i][j];
}
}
}
//Print
for(i=0; i<4; i++) {
for(j=0; j<4; j++) {
printf("%d ", a[i][j]);
}
printf("\n");
}
printf("The Max value is : %d\n", max);
printf("The Min value is : %d\n", min);
return 0;
}
④ 單片機的行列式鍵盤的工作原理是怎樣的
原理:
當鍵盤上沒有鍵閉合時,所有的行線和列線斷開,列線都呈高電平。當行列式鍵盤上某一個鍵閉合時,則該鍵所對應的列線與行線短路。此時列線的電平由相應的行線的電位所決定。
⑤ 如何用c++編程設計求行列式的值
設計一個類,計算行列式的值,行列式的階數由鍵盤輸入。要求該類可以作為其他類的基類(可繼承,用常數列可以替換某列)。
顯示信息為:請輸入行列式的階數(1-20):3
請選擇輸入行列式個元素的方式
1.鍵盤輸入
2.隨機函數自動產生請選擇:2隨機數的位數(1-5):2
行列式:x
x
xx
x
xx
x
x行列式:abc行列式的值:abc=
⑥ 求51單片機行列式鍵盤源程序
#include <AT89X52.H>
#include<stdio.h>
unsigned char code table[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共陽數碼管顯示0~F
void delay() //延時子程序
{
unsigned char n, m;
for (n = 100; n > 0; n--)
for (m = 300; m > 0; m--);
}
void display(unsigned char S) //顯示子程序
{
P0 = table[S]; //數碼管是P0口驅動的
delay();
P2 = 0x7f; //數碼管選通開關(P2.7選通 也就是數碼管的第八位 (從左到右順序))
}
unsigned char Keycan(void) //按鍵掃描程序 P1.0--P1.3為行線 P1.4--P1.7為列線
{
unsigned char rcode, ccode;
P1 = 0xF0; // 發全0行掃描碼,列線輸入
if((P1&0xF0) != 0xF0) // 若有鍵按下
{
delay();// 延時去抖動
if((P1&0xF0) != 0xF0)
{ rcode = 0xFE; // 逐行掃描初值
while((rcode&0x10) != 0)
{
P1 = rcode; // 輸出行掃描碼
if((P1&0xF0) != 0xF0) // 本行有鍵按下
{
ccode = (P1&0xF0)|0x0F;
do{;}while((P1&0xF0) != 0xF0); //等待鍵釋放
return ((~rcode) + (~ccode)); // 返回鍵編碼
}
else
rcode = (rcode<<1)|0x01; // 行掃描碼左移一位
}
}
}
return 0; // 無鍵按下,返回值為0
}
void KeyDispaly(unsigned char key)
{
switch(key)
{
case 0x11: display(0); break;
case 0x21: display(1); break;
case 0x41: display(2); break;
case 0x81: display(3); break;
case 0x12: display(4); break;
case 0x22: display(5); break;
case 0x42: display(6); break;
case 0x82: display(7); break;
case 0x14: display(8); break;
case 0x24: display(9); break;
case 0x44: display(10); break;
case 0x84: display(11); break;
case 0x18: display(12); break;
case 0x28: display(13); break;
case 0x48: display(14); break;
case 0x88: display(15); break;
default: break;
}
}
int main(void)
{
unsigned char Key;
while(1)
{
Key = Keycan();
KeyDispaly(Key);
}
return 0;
}
⑦ 單片機行列式按鍵
現在的筆記本鍵盤一般都是16+8的方式,即16個pin輸出,對應列;8個輸入pin腳,對應行。
鍵盤輸入與輸出的結構如下:
普通鍵盤結構及工作原理
鍵盤一般有獨立式和行列式(矩陣式)兩種。當然還有其它的結構,比如交 互式結構等等,不過其它的結構比較少用,在這里就不介紹了。在中穎的單片機 中,有些單片機的LCD 驅動引腳的SEGMENT 口可以共享按鍵掃描口,當選擇為按 鍵掃描口時,可以使用這些口來掃描按鍵,所以在外部電路可以連接LCD 和按鍵 矩陣,採用分時掃描進行處理。
⑧ 單片機中的4×4矩陣鍵盤的鍵值怎麼求
單片機書上應該有講的哦,多查資料。
既然是4x4,即4行4列了,共需要8個I/O口,有8bit數據(如高四位為行4bit,低四位為列4bit)位:xxxx xxxx。還要結合你的程序來編碼鍵值,如果有鍵按下了,查詢所有按鍵的所連接的I/O口電平狀態,每個按鍵需要兩個I/O口,一端連接行(行4bit之一),一端連接列(列4bit之一);若此時按鍵的電平狀態為0010 0001,即十六進制數據0x21,按下的按鍵所對應的鍵值編碼即為0x21。當然為了使用方便,在確定了按下按鍵的編碼後,可對其賦值,我要將它賦值為數字鍵8,方便後續編程使用。例:
//獲取鍵值編碼,由於確定哪個按鍵按下
uchar keyscan(void)//鍵盤掃描函數,使用行列反轉掃描法
{
uchar cord_h,cord_l;//行列值
P3=0x0f; //行線輸出全為0
cord_h=P3&0x0f; //讀入列線值
if(cord_h!=0x0f) //先檢測有無按鍵按下
{
delay(100); //去抖
if(cord_h!=0x0f)
{
cord_h=P3&0x0f; //讀入列線值
P3=cord_h|0xf0; //輸出當前列線值
cord_l=P3&0xf0; //讀入行線值
return(cord_h+cord_l);//鍵盤最後組合碼值
}
}return(0xff); //返回該值
}
while(1)
{
key=keyscan();//調用鍵盤掃描,
//keyVal=0~15表示按鍵對應的功能
switch(key)
{
case 0x7e:keyVal=0;break;//0 按下相應的鍵顯示相對應的碼值
case 0x7d:keyVal=1;break;//1
case 0x7b:keyVal=2;break;//2
case 0x77:keyVal=3;break;//3
case 0xbe:keyVal=4;break;//4
case 0xbd:keyVal=5;break;//5
case 0xbb:keyVal=6;break;//6
case 0xb7:keyVal=7;break;//7
case 0xde:keyVal=8;break;//8
case 0xdd:keyVal=9;break;//9
case 0xdb:keyVal=10;break;//a
case 0xd7:keyVal=11;break;//b
case 0xee:keyVal=12;break;//c
case 0xed:keyVal=13;break;//d
case 0xeb:keyVal=14;break;//e
case 0xe7:keyVal=15;break;//f
}
⑨ 單片機4*4行列式鍵盤程序! 動態顯示,開始時,顯示「——」,按鍵後顯示相應鍵值(00—15)
/*行線接P1.0-P1.3,列線接P1.4-P1.7。
根據掃描鍵盤返回的鍵值編碼查鍵值編碼表,從而得到鍵值並送數碼管顯示。
開機時,數碼管顯示「-」。
當鍵按下時,數碼管顯示按下鍵的鍵值,蜂鳴器響一聲。*/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit BEEP = P3^6; //蜂鳴器驅動線
uchar key;
unsigned char code disp_code[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};
unsigned char code key_code[]={
0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,
0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77 };
/**********************************************************
延時子函數
**********************************************************/
void delayms(uint ms)
{
uchar t;
while(ms--)
{
for(t = 0; t < 120; t++);
}
}
/**********************************************************
x*0.14MS 延時子函數
**********************************************************/
void delay0(uchar x)
{
uchar i;
while(x--)
{
for (i = 0; i<13; i++) {;}
}
}
/**********************************************************
蜂鳴器驅動子函數
**********************************************************/
void beep()
{
uchar i;
for (i=0;i<180;i++)
{
delay0(5);
BEEP=!BEEP; //BEEP取反
}
BEEP=1; //關閉蜂鳴器
delayms(250); //延時
}
/**********************************************************
鍵盤掃描子函數
**********************************************************/
uchar keyscan()
{
uchar scan1,scan2,keycode,j;
P1=0xf0;
scan1=P1;
if((scan1&0xf0)!=0xf0) //判鍵是否按下
{
delayms(30); //延時30ms
scan1=P1;
if((scan1&0xf0)!=0xf0) //二次判鍵是否按下
{
P1=0x0f;
scan2=P1;
keycode=scan1|scan2; //組合成鍵編碼
for(j=0;j<=15;j++)
{
if(keycode== key_code[j]) //查表得鍵值
{
key=j;
return(key);
}
}
}
}
else P1=0xff;
return (16);
}
/**********************************************************
判鍵是否按下子函數
**********************************************************/
void keydown()
{
P1=0xf0;
if((P1&0xf0)!=0xf0)
{
keyscan();
P0=disp_code[key];
beep();
}
}
/**********************************************************
主函數
**********************************************************/
main()
{
P0 = 0xbf;
P2 = 0x7f; //數碼管顯示"-"
P1 = 0xff;
while(1)
{
keydown();
}
}
/*********************************************************/