/***4×4矩陣按鍵構(gòu)架——火柴天堂作品-20110921***/
10年的思南網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。營銷型網(wǎng)站建設(shè)的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整思南建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)從事“思南網(wǎng)站設(shè)計”,“思南網(wǎng)站推廣”以來,每個客戶項目都認(rèn)真落實執(zhí)行。
/***源程序默認(rèn)硬件環(huán)境:52單片機(jī),12MHz晶振,P1口 4×4矩陣鍵盤,詳細(xì)布局如下***/
/* 默認(rèn)矩陣布局,按鍵掃描方式1使用
P0 P1 P2 P3
│ │ │ │
P4─┼──┼──┼──┤ S1 S2 S3 S4
│ │ │ │
P5─┼──┼──┼──┤ S5 S6 S7 S8
│ │ │ │
P6─┼──┼──┼──┤ S9 S10 S11 S12
│ │ │ │
P7─┴──┴──┴──┘ S13 S14 S15 S16
*/
#include"reg52.h" //包含52頭文件
#define TRUE 1 //定義布爾量'1':真
#define FALSE 0 //定義布爾量'0':假
#define uchar unsigned char //定義 無符號字符型數(shù)據(jù) 簡稱
#define uint unsigned int //定義 無符號整型數(shù)據(jù) 簡稱
#define KeyPort P1
#define Key1Value 1
#define Key2Value 2
//uchar code KeyCodeList[16]={0xee,0xed,0xeb,0xe7,0xde,0xdd,0xeb,0xe7,0xbe,0xbd,0xbb,0xb7,0x7e,0x7d,0x7b,0x77};//按鍵代碼列表,按鍵掃描方式2使用,可按需要隨意修改順序
uchar KeyScan() //按鍵掃描函數(shù)(方式1,需配合源程序矩陣布局,返回值0表示無按鍵,1-16為對應(yīng)按鍵),缺點:無法掃描組合鍵(同時按2個按鍵以上)
{
uchar temp_h,temp_l,scan_value,i;
KeyPort=0xf0; //設(shè)置低4位為0(掃描線),準(zhǔn)備讀取高4位(返回線)狀態(tài)
if(KeyPort==0xf0) return 0; //若高4位狀態(tài)不變,表示無按鍵,返回?zé)o按鍵 鍵值0
temp_h=~KeyPort4; //若高4位狀態(tài)改變,表示有按鍵,讀取高4位,并將結(jié)果轉(zhuǎn)成正邏輯(按鍵對應(yīng) 行線 為 1 )存在temp_h低位上
KeyPort=0x0f; //設(shè)置高4位為0(掃描線),準(zhǔn)備讀取低4位(返回線)狀態(tài)
temp_l=~(KeyPort|0xf0); //讀取低4位,并將結(jié)果轉(zhuǎn)成正邏輯(按鍵對應(yīng) 列線 為 1 )存在temp_l低位上
while(i4) //將 按鍵行線號 轉(zhuǎn)成數(shù)值
{
if((temp_hi)==0x01) break; //讀取按鍵行線號
i++;
}
if(i==4) return 0; //若讀取出錯,返回?zé)o按鍵
temp_h=i; //將 按鍵行線數(shù)值 結(jié)果存于 temp_h
i=0;
while(i4) //將 按鍵列線號 轉(zhuǎn)成數(shù)值
{
if((temp_li)==0x01) break; //讀取按鍵列線號
i++;
}
if(i==4) return 0; //若讀取出錯,返回?zé)o按鍵
temp_l=i; //將 按鍵列線號 結(jié)果存于 temp_l
scan_value=(temp_h2)+temp_l+1; //合并行列線數(shù)值,并轉(zhuǎn)成按鍵值,每條行線鍵值差為 4(temp_h2),按鍵值從1開始(+1,0為無按鍵 鍵值)
return scan_value; //返回 按鍵值
}
/*
uchar KeyScan() //按鍵掃描函數(shù)(方式2,需配合 按鍵代碼列表 數(shù)組 進(jìn)行 鍵值 查詢,返回值0表示無按鍵,1-16為代碼表順序?qū)?yīng)按鍵),缺點:無法掃描組合鍵
{
uchar temp,i;
KeyPort=0xf0; //設(shè)置低4位為0(掃描線),準(zhǔn)備讀取高4位(返回線)狀態(tài)
if(KeyPort==0xf0) return 0; //若高4位狀態(tài)不變,表示無按鍵,返回?zé)o按鍵 鍵值0
temp=KeyPort|0x0f; //若高4位狀態(tài)改變,表示有按鍵,讀取高4位,并將結(jié)果存于 temp 的高4位
KeyPort=0x0f; //設(shè)置高4位為0(掃描線),準(zhǔn)備讀取低4位(返回線)狀態(tài)
temp=(KeyPort|0xf0); //讀取低4位,并將結(jié)果存于 temp 的低4位
while(i16) //將按鍵行列線代碼轉(zhuǎn)換成鍵值
{
if(temp==KeyCodeList[i]) break; //將 行列線 代碼與 按鍵代碼表 進(jìn)行對比,若一致則結(jié)束對比
i++; //進(jìn)行下一個對比
}
if(i==16) return 0; //若查詢出錯,或 行列線代碼 不在 按鍵代碼表中,返回?zé)o按鍵 鍵值0
return i+1; //返回按鍵值1~16(按鍵代碼列表中元素下標(biāo)+1,0為無按鍵 鍵值)
}
*/
void KeyResp() //按鍵響應(yīng)函數(shù)
{
static uchar KeyValue; //定義靜態(tài)變量-按鍵值,
static bit KeyDownFlag,KeyReadyFlag; //定義靜態(tài)標(biāo)志位-按鍵按下標(biāo)志,按鍵準(zhǔn)備(響應(yīng))標(biāo)志
uchar key_value=KeyScan(); //調(diào)用掃描函數(shù),并將結(jié)果臨時存放于key_value 中
if(key_value) //若掃描結(jié)果為真(即有按鍵)
{
KeyValue=key_value; //保存掃描結(jié)果
KeyDownFlag=TRUE; //按鍵按下標(biāo)志 置位
KeyReadyFlag=TRUE; //按鍵準(zhǔn)備(響應(yīng))標(biāo)志 置位
}
else KeyDownFlag=FALSE; //若掃描結(jié)果為假(即無按鍵),則清空按鍵按下標(biāo)志
if(KeyReadyFlag !KeyDownFlag) //若 按鍵已準(zhǔn)備(響應(yīng)),且無按鍵按下,(可知為 按下后又松手情況)
{
switch(KeyValue) //查找 按鍵值 對應(yīng)的 按鍵處理
{
case Key1Value:break; //按鍵1處理
case Key2Value:break; //按鍵2處理
//case Key3Value:break;//......... //按鍵N處理
default:break; //無對應(yīng)按鍵,或其它按鍵值處理
}
KeyValue=0; //清除按鍵值
KeyReadyFlag=FALSE; //清空 按鍵準(zhǔn)備(響應(yīng))標(biāo)志
}
}
void main() //主函數(shù)
{
while(1) //循環(huán)系統(tǒng)
{
KeyResp(); //調(diào)用 按鍵響應(yīng)函數(shù)
}
}
#include?stdlib.h
#define?ROW?10
#define?COL?10
int?**matrix;
//動態(tài)申請空間
matrix?=?(int**)?malloc(sizeof(int*)?*?ROW);
for(int?i?=?0;?i??COL;?i++)
{
matrix[i]?=?(int*)?malloc(sizeof(int)?*?COL);
}
//賦值
for(int?i?=?0;?i??ROW;?i++)
{
for(int?j?=?0;?j??COL;?i++)
{
*(*(matrix+i)+j)?==?0;????
}
}
方法1:直接定義10*10的數(shù)組,讀取全部數(shù)據(jù),再根據(jù)選擇的行列數(shù)打印輸出部分?jǐn)?shù)據(jù)。
方法2:通過文件流指針的移動,跨過不需要的內(nèi)容。(這里控制文件流指針可利用ftell和fseek函數(shù)來移動指定字節(jié)數(shù))我是利用fscanf讀取需要的內(nèi)容,遇到需要跳行就用fgets來跳過。(注意常量參數(shù)根據(jù)自己需求修改)。
說明:邊讀取邊打印輸出,就不需要變量存儲。我的代碼是把讀取出來的內(nèi)容存放在三維數(shù)組中(文件內(nèi)容你沒指定,如是單純數(shù)字,二維數(shù)組即可,我是作為字符串處理,故用三維數(shù)組。),數(shù)組是根據(jù)實際大小,動態(tài)申請,寫成兩個獨(dú)立函數(shù)。
下面是代碼:
#include stdio.h
#include string.h
#include malloc.h
#define MAXR 10//文件中矩陣最大行
#define MAXC 10//文件中矩陣最大列
#define MS 3//矩陣中元素字符串最大字符數(shù)(包含結(jié)束符號,不可小于實際內(nèi)容)
#define MBUF 100//文件中一行最大字符數(shù),可設(shè)置大一點
char ***getMem(int r,int c,int len);//動態(tài)申請一個三維數(shù)組
void freeMem(char ***datas,int r,int c);//釋放數(shù)組空間
void showDatas(char ***datas,int r,int c);//打印輸出結(jié)果
int main()
{
int r=MAXR+1,c=MAXC+1,i=0,j=0;
char ***datas=NULL,str[3],buf[MBUF];
FILE *fp=NULL;
printf("請輸入要獲取的行數(shù)和列數(shù):\n");
while(r0 || rMAXR || c0 || cMAXC)scanf("%d%d",r,c);
datas=getMem(r,c,MS);
fp=fopen("C:\\test.data","r");
if(!fp) return 1;
while(fscanf(fp,"%s",str)!=-1)
{
? if(ic) strcpy(datas[j][i],str),i++;
? if(i==c)
? {
? ? ? if(!fgets(buf,sizeof(buf),fp)) break;
? ? ? i=0,j++;
? }
? if(j==r) break;
}
showDatas(datas,r,c);
freeMem(datas,r,c);
return 0;
}
void showDatas(char ***datas,int r,int c)
{
int i,j;
for(i=0;ir;i++,printf("\n"))
? for(j=0;jc;j++)
? ? ? printf("%s ",datas[i][j]);
printf("\n");
}
void freeMem(char ***datas,int r,int c)
{
int i,j;
if(!datas)
{
? for(i=0;ir;i++,free(datas[i]))
? ? ? for(j=0;jc;j++)
? ? ? ? ? free(datas[i][j]);
? free(datas);
}
}
char ***getMem(int r,int c,int len)
{
int i,j;
char ***datas=NULL,**dr=NULL;
datas=(char ***)malloc(sizeof(char **)*r);
if(!datas) return NULL;
for(i=0;ir;i++)
{
? dr=(char **)malloc(sizeof(char *)*c);
? if(!dr) return NULL;
? else
? {
? ? ? for(j=0;jc;j++)
? ? ? {
? ? ? ? ? dr[j]=(char *)malloc(sizeof(char)*len);
? ? ? ? ? if(!dr[j]) return NULL;
? ? ? }
? ? ? datas[i]=dr;
? }
}
return datas;
}
二維數(shù)組名不能直接傳給二級指針,應(yīng)該按以下方式使用:
int nChoose;
scanf("%d", nChoose); // 讓用戶輸入二維數(shù)組的大小
int **a = (int **)malloc(nChoose * sizeof(int *));
for (int i = 0; i nChoose; i ++)
{
a[i] = (int *)malloc(nChoose * sizeof(int));
}
Scan(a, nChoose);
Calc(a, nChoose);
// 最后要釋放數(shù)組,也要循環(huán)
//矩陣的賦值必須一個元素一個元素的賦值,如果不用循環(huán),直接賦值,再沒有規(guī)律也可以啊!至多代碼長些。如:
int a[10][10];
a[0][0]=123;
a[0][1]=3567;
........
a[9][9]=76543;//這些賦值共100行。