?? 82c55.c
字號:
//82C55接口鍵盤掃描程序
#include "Globle.h"
#include "My8051.h"
#include "Cabe.h"
#include <absacc.h>
#define PA8255 XBYTE[0x0ff0]
#define PB8255 XBYTE[0x0ff1]
#define PC8255 XBYTE[0x0ff2]
#define COM8255 XBYTE[0x0ff3]
#define ENABLE 0
#define DISABLE 1
#define CS_82C55 P15
//Byte keydata;
void WatchDog1(void)
{
P43 = 1;
_nop_();
_nop_();
P43 = 0;
}
void Delayx10ms(Word count)
{
Word i,j;
while(count-- != 0)
{
for(i=0;i<10;i++)
for(j=0;j<72;j++)
;
}
}
void BeepGetkey(Word count,Byte soundlong,Byte tone)//count發出BEEP的個數,soundlong 聲音的長短,tone聲音的高低
{
Word i,j,k,spFreq;
// P15 = 0;
// COM8255 = 0x8A;
// PA8255 = 0X20; //設PA6口為高輸出(背景燈亮)
spFreq = (1000/tone)/2;
for(i=0;i<count;i++)
{
for(j=0;j<soundlong;j++)
{
for(k=0;k<spFreq;k++)
;
PA8255 = 0X40; //設PA6口為高輸出(背景燈亮
for(k=0;k<spFreq;k++)
PA8255 = 0; //設PA6口為高輸出(背景燈亮)
;
}
Delayx10ms(12);
}
// P15 = 1;
}
Byte KeyInput82C55(void)
{
Byte sccode,recode,Key,keytem,keytem2,keytem3;
P15 = 0;
PC8255 = 0xf0; //發全"0"行掃描碼,列線輸入
keytem = PC8255;
if((PC8255&0xf0)!=0xf0) //若有鍵按下
{
Delayx10ms(1); // 消拌
if((PC8255&0xf0)!=0xf0) //單片機將得到的信號取反,PC6-PC4中的"1"的位便是鍵所在的列.
{
keytem2 = PC8255&0xf0;
sccode = 0xfe; //逐行掃描初值
// keytem2 = sccode;
while((sccode&0x10) != 0) //掃描完退出
{
keytem3 = sccode&0x0f;
PC8255 = sccode; //輸出行掃描碼
Delayx10ms(1);
keytem = PC8255&0xf0;
if(keytem != 0xf0) //本行有鍵按下
{
recode = keytem;
Key = (sccode & 0x0f) | recode;
while((PC8255&0xf0)!=0xf0){};//防重讀
P15 = 1;
return(Key); //返回特征嗎
}
else
{
sccode = (sccode<<1) | 0x01;//行掃描碼左移一位
}
}
}
}
P15 = 1;
return(0); //無鍵按下返回為0
}
void dodey(void)
{
Byte temkey;
// Byte keydata;
keydata = 0;
temkey = KeyInput82C55();
// if(temkey!=0)
// {
switch(temkey)
{
case 0xD7 : keydata = 0x30; break; // 定義0號鍵
case 0xEE : keydata = 0x31; break; // 定義1號鍵
case 0xDE : keydata = 0x32; break; // 定義2號鍵
case 0xBE : keydata = 0x33; break; // 定義3號鍵
case 0xED : keydata = 0x34; break; // 定義4號鍵
case 0xDD : keydata = 0x35; break; // 定義5號鍵
case 0xBD : keydata = 0x36; break; // 定義6號鍵
case 0xEB : keydata = 0x37; break; // 定義7號鍵
case 0xDB : keydata = 0x38; break; // 定義8號鍵
case 0xBB : keydata = 0x39; break; // 定義9號鍵
case 0xE7 : keydata = 0x2A; break; // 定義*號鍵
case 0xB7 : keydata = 0x23; break; // 定義#號鍵
default:
break;
}
// }
}
Byte Getkey(void)
{
Byte idata byKey;
dodey();
// KeyInput82C55();
if(keydata != 0)
{
byKey = keydata; //防重讀
// Delayx10ms(3); // 消拌
// g_byShortTime = 10;
return(byKey);
// P15 = 0;
/*
BeepGetkey(1,6,8);
// P15 = 1;
while(1)
{
// dodey();
KeyInput82C55();
if(keydata != byKey)
{
return(byKey);
}
}
*/
// }
//}
/*
Byte KeyInput82C55(void)
{
Byte idata sccode,Key = 0;
CS_82C55 = ENABLE; //設PC0-3為輸出,PC4-7為輸入;PA為輸出口;PB為輸入口
PC8255 = 0xfe; //發全"0"行掃描碼,列線輸入
sccode = PC8255 & 0xf0;
switch(sccode)
{
case 0xE0: keydata = 0x31; break;
case 0xd0: keydata = 0x32; break;
case 0xb0: keydata = 0x33; break;
default: break;
}
// Delayx10ms(10);
PC8255 = 0xFd; //發全"0"行掃描碼,列線輸入
_nop_();
sccode = PC8255 & 0xf0;
switch(sccode)
{
case 0xE0: keydata = 0x34; ;
case 0xd0: keydata = 0x35; ;
case 0xb0: keydata = 0x36; ;
default: break;
}
// Delayx10ms(10);
PC8255 = 0xFb; //發全"0"行掃描碼,列線輸入
_nop_();
sccode = PC8255 & 0xf0;
switch(sccode)
{
case 0xE0: keydata = 0x37; break;
case 0xd0: keydata = 0x38; break;
case 0xb0: keydata = 0x39; break;
default: break;
}
// Delayx10ms(10);
PC8255 = 0xF7; //發全"0"行掃描碼,列線輸入
_nop_();
sccode = PC8255 & 0xf0;
switch(sccode)
{
case 0xE0: keydata = 0x2A; break;
case 0xd0: keydata = 0x30; break;
case 0xb0: keydata = 0x23; break;
default: break;
}
CS_82C55 = DISABLE;
return(0); //無鍵按下返回為0
}
*/
/*得到鍵值*/
/*
Byte Getkey(void)
{
Byte idata byKey;
KeyInput82C55();
if(keydata != 0)
{
byKey = keydata; //防重讀
Delayx10ms(30); // 消拌
// g_byShortTime = 10;
// P14 = 0;
// CountT2 = 100;
BeepGetkey(1,6,8);
while(1)
{
KeyInput82C55();
if(keydata != byKey)
{
return(byKey);
}
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -