📄 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 + -