?? musinstru.c
字號:
/*****************************************/
/* Copyright (c) 2005, 通信工程學(xué)院 */
/* All rights reserved. */
/* 作 者:戴 佳 */
/*****************************************/
#include "MusInstru.h"
/* 鍵消抖延時(shí)函數(shù) */
void delay(void)
{
uchar i;
for (i=300;i>0;i--);
}
/* 鍵掃描函數(shù) */
uchar getkey(void)
{
uchar scancode,tmpcode;
if ((P1&0xf0)==0xf0)
return(0);
scancode = 0xfe;
while((scancode&0x10)!=0) // 逐行掃描
{
P1 = scancode; // 輸出行掃描碼
if ((P1&0xf0)!=0xf0) // 本行有鍵按下
{
tmpcode = (P1&0xf0)|0x0f;
/* 返回特征字節(jié)碼,為1的位即對應(yīng)于行和列 */
return((~scancode)+(~tmpcode));
}
else scancode = (scancode<<1)|0x01; // 行掃描碼左移一位
}
}
/* 定時(shí)器0中斷服務(wù)子程序 */
void time0_int(void) interrupt 1 using 0
{
/* 設(shè)置計(jì)數(shù)初值 */
TH0 = STH0;
TL0 = STL0;
P20=~P20; // 反相,產(chǎn)生輸出脈沖
}
/* 主程序 */
void main()
{
uchar key,k;
TMOD = 0x01; // T0,工作方式1
ET0 = 1;
EA = 1;
while(1)
{
P1 = 0xf0; // 發(fā)全0行掃描碼
if ((P1&0xf0)!=0xf0) // 若有鍵按下
{
delay(); // 延時(shí)去抖動
if ((P1&0xf0)!=0xf0) // 延時(shí)后再判斷一次,去除抖動影響
{
key = getkey(); // 調(diào)用鍵盤掃描函數(shù)
// 根據(jù)獲取的按鍵位置得到k值
switch(key)
{
case 0x11: // 1行1列
k = 0;
break;
case 0x21: // 1行2列
k = 1;
break;
case 0x41: // 1行3列
k = 2;
break;
case 0x81: // 1行4列
k = 3;
break;
case 0x12: // 2行1列
k = 4;
break;
case 0x22: // 2行2列
k = 5;
break;
case 0x42: // 2行3列
k = 6;
break;
case 0x82: // 2行4列
k = 7;
break;
case 0x14: // 3行1列
k = 8;
break;
case 0x24: // 3行2列
k = 9;
break;
case 0x44: // 3行3列
k = 10;
break;
case 0x84: // 3行4列
k = 11;
break;
case 0x18: // 3行4列
k = 12;
break;
case 0x28: // 3行4列
k = 13;
break;
case 0x48: // 3行4列
k = 14;
break;
case 0x88: // 3行4列
k = 15;
break;
default:
break;
}
P20 = ~P20; // 反相
/* 根據(jù)所得的k值設(shè)定計(jì)數(shù)器1的計(jì)數(shù)初值 */
STH0 = tab[k]/256;
STL0 = tab[k]%256;
TR0 = 1; // 開始計(jì)數(shù)
P1 = 0xf0; // 發(fā)全0行掃描碼
while ((P1&0xf0)!=0xf0) // 若沒有松開按鍵
{
P1 = 0xf0;
}
TR1 = 0; // 若按鍵松開,則停止計(jì)數(shù),不產(chǎn)生脈沖輸出
}
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -