1. 程式人生 > 實用技巧 >c51 proteus模擬編寫矩陣鍵盤(練習自己編寫程式的規範)

c51 proteus模擬編寫矩陣鍵盤(練習自己編寫程式的規範)

(編寫程式要從小的程式一步一步做起!)

//程式:矩陣鍵盤
//功能:驗證矩陣鍵盤——按下不弄的鍵盤在數碼管上顯示不同的數字
#include<reg51.h> //標頭檔案
#define uchar unsigned char //型別定義
#define uint unsigned int //型別定義
#define KEY P1 //定義埠
//子函式宣告
void SCANkey(); //掃描鍵盤函式
bit hitkey(); //判斷是否有鍵盤按下,有則返回1,沒有返回0
uchar scan_key();//掃描鍵盤,返回鍵盤值
void delay(uint N);//延遲函式
void key_manage(uchar keycode);//鍵值處理函式

void display(uchar n);//數碼管顯示函式
//數碼管顯示碼錶
uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

//主函式
void main()
{
EA=0; //關中斷
while(1) //無限迴圈
{
SCANkey();//進行鍵盤掃描
}
}
//函式名:SCANkey
//函式功能:掃描鍵盤程式,有鍵按下完成按鍵處理,無按鍵按下時直接返回
//形式引數:無
//返回值:無
void SCANkey()
{
uchar key_code;
if(hitkey()) //判斷是否有按鍵按下
{

delay(2);//延時20ms,消除按鍵抖動干擾
if(hitkey())//再次判斷是否是有效按鍵
{
key_code=scan_key();
while(hitkey()); //等待按鍵釋放
key_manage(key_code); //鍵盤掃描、鍵值處理跳轉、按鍵處理
}
}
}
//函式名:hitkey
//函式功能:判斷是否有鍵按下
//形式引數:無
//返回值:1表示有按鍵按下,0表示無按鍵按下
bit hitkey()
{
uchar scancode,keycode;
scancode=0x0f; //P1.4~P1.7輸出全0
KEY=scancode; //掃描按鍵,換回鍵值
keycode=KEY; //讀P1.0~P1.3的狀態
if((keycode&0x0f)==0x0f) //遮蔽高4位
return(0);//全1則無按鍵閉合,換回0
else
return(1); //全0則有按鍵閉合,換回1
}
//函式名:delay
//函式功能:延時效果,實現(N*10ms)的延時。系統採用12MHZ的時鐘時,延時滿足要求,其他情況需要改動。
//形式引數:N
//返回值:無
void delay(uint N)
{
int i,j,k;
for(i=0;i<N;i++)
for(j=0;j<10;j++)
for(k=0;k<120;k++);
}
//函式名:sacn_key
//函式功能:掃描按鍵,換回鍵值。高4位代表行,低4位代表列
//形式引數:無
//返回值:keycode,相應的按鍵按下掃描出一個按鍵掃描碼,送到key_manage函式提取掃描碼
uchar scan_key()
{
uchar scancode,keycode,keycodeh,keycodel;
scancode=0xef; //掃描鍵盤,採用逐行掃描法,P1.4=0,掃描第一行
while(scancode!=0xff)
{
KEY=scancode; //輸入掃描碼,掃描P1.4對應的行
keycode=KEY; //讀出資料,看是否在此行的某列鍵盤被按下
if((keycode&0x0f)!=0x0f)break;//掃描到按下十位鍵,怎退出
scancode=(keycode<<1)|0x0f;//否則,左移,更新掃描碼繼續掃描
}
keycode=~keycode; //鍵盤掃描碼變反,返回
keycodeh=keycode<<4;
keycodel=keycode>>4;
keycode=keycodeh|keycodel;
return(keycode);
}
//函式名:key_manage
//函式功能:鍵值處理跳轉,根據keycode而對應display引數
//形式引數:keycode掃描鍵盤返回的值。高4位代表行,低4位代表列
//返回值:display(?)函式
void key_manage(uchar keycode)
{
switch(keycode)
{
case 0x11:display(0);break;
case 0x12:display(1);break;
case 0x14:display(2);break;
case 0x18:display(3);break;
case 0x21:display(4);break;
case 0x22:display(5);break;
case 0x24:display(6);break;
case 0x28:display(7);break;
case 0x41:display(8);break;
case 0x42:display(9);break;
case 0x44:display(10);break;
case 0x48:display(11);break;
case 0x81:display(12);break;
case 0x82:display(13);break;
case 0x84:display(14);break;
case 0x88:display(15);break;
}
}
//函式名:display
//函式功能:讓數碼管顯示相應正確的值
//形式引數:n key_manage函式根據掃描碼返回的不同的值
//返回值:無
void display(uchar n)
{
P0=table[n];
}

轉載於:https://blog.51cto.com/macfooter/579015