?? file7.c
字號:
// 讀取鍵盤實驗
//按不同的按鍵,會顯示不同的結(jié)果
#include <8051.h>
#define uchar unsigned char
#define key1 P3_3 //鍵盤定義
#define key2 P3_4
#define key3 P3_5
#define segdata P0 //數(shù)據(jù) 輸出
#define sege P2_7 //顯示 選中
#define segb P2_6 //位 選
#define segd P2_5 //段 選
//****************************************************************************
void delay(uchar times);
void display(uchar disseg,uchar disdata);
uchar keyb();
// 這里定義的是數(shù)碼管對應的字符字根
code uchar disbuf_u[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,
0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,
0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e};
// ***************************************************************************
uchar keybuf;
void main()
{
uchar keym = 0; //鍵盤返回結(jié)果的緩沖區(qū)
keybuf = 0;
P1 = 255; //關閉LED顯示
P0 = 0; //關閉數(shù)碼顯示
P2 = 255; //
P3_7 = 0; //關閉蜂鳴器
while(1) //設置一個無限制循環(huán)
{
keym = keyb(); //得到按鍵結(jié)果
if(keym) keybuf = keym; //如果返回有效的按鍵結(jié)果才保存
display(keybuf-1,keybuf); //在相應的位置顯示返回的結(jié)果
}
}
//*****************************************************************************
//下面是延時程序。具體的延時時間不能通過表面程序看出,(為什么?)
//如果我們需要一個精密的延時程序,那么我們可以采用內(nèi)嵌匯編代碼的方式
void delay(uchar times)
{
int t=100; //延時倍數(shù)
uchar i=times;
for(;i!=0;i--)
{for(;t!=0;t--){}}
}
//這里是顯示子程序,入口參數(shù)為
// disseg -> 位選 可選范圍 0-7 一共8個數(shù)碼管
// disdata -> 段選 可選范圍 0-31 一個32個字符
// 段選 0-15 16個字符 為 "0"->"F"
// 段選 16-31 16個字符 為 "0."->"F."
void display(uchar disseg,uchar disdata)
{
unsigned char dataf;
if(disseg < 8) //只有當要顯示的位數(shù)有效,才顯示.否則,不顯示
{
dataf = 1;
while(disseg)
{
dataf <<= 1;
disseg--;
}
sege = 0;
segdata = dataf; //這里首先把要顯示的數(shù)據(jù)放到數(shù)據(jù)總線
segb = 1; //這里給出一個脈沖,數(shù)據(jù)送往位選端
segb = 0;
segdata = disbuf_u[disdata];
segd = 1; //這里給出一個脈沖,數(shù)據(jù)送往段選端
segd = 0;
}
else{
segdata = 255;
segd = 1; //這里給出一個脈沖,數(shù)據(jù)送往段選端
segd = 0;
} //關閉數(shù)碼管顯示
}
uchar keyb()
{
uchar key,keytmp;
key1 = 1; //將輸出線拉高
key2 = 1;
key3 = 1;
key = P3 ; //讀回來
key = key & 0x38; //獲得鍵盤結(jié)果
if(key == 56 ) return 0; //如果用戶沒有按鍵返回 0
else
{
keytmp = key;
delay(1); //判斷是不是干擾
key = P3;
key = key & 0x38;
if (key != keytmp ) return 0; //是干擾,返回 0
else //不是干擾,等待用戶釋放按鍵
{
do{
key1 = 1; //輸出拉高
key2 = 1;
key3 = 1;
key = P3 & 0x38; //讀回來
P1_0 = ~P1_0; //如果用戶不釋放,閃爍 p1.0
}while(key != 56 ); //等待用戶釋放
P1_0 = 1; //用戶釋放以后,清除p1.0指示燈
switch(keytmp)
{
case 24: return 1;//返回用戶按鍵結(jié)果
case 40: return 2;
case 48: return 3;
}
}
}
return 0;
}
//*******************************************************************************
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -