?? key_scan.c
字號(hào):
#include<reg52.h> //PB段碼,PA位控
#include <absacc.h>
#include <string.h>
#include <intrins.h>
#include <ctype.h>
#include <stdlib.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
/* 定義8155的I/O端口地址 */
#define COM8155 XBYTE[0xf000] /* 8155命令口地址 */
#define PA8155 XBYTE[0xf001] /* 8155的PA口地址 */
#define PB8155 XBYTE[0xf002] /* 8155的PB口地址 */
#define PC8155 XBYTE[0xf003] /* 8155的PC口地址 */
uchar key_scan(void);
void delay(uchar ms);
void proc_key(uchar key);
uchar key;
void main()
{
while(1)
{
COM8155=0x03 ; //給8155送命令,PA,PB口都為輸出,PC口為輸入.
key = key_scan();
// while ((PC8155&0xcf)!=0xcf) ; //松鍵后執(zhí)行下面程序,會(huì)出現(xiàn)數(shù)碼管按下不亮.
proc_key(key); //鍵盤功能
}
}
//鍵處理子程序
/*0,1,2,3,4,5,6,7,8,9,A,b,C,d,E,F,*/
/*0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,0xEE,0x3E,0x9C,0x7A,0x9E,0x8E, */
void proc_key(uchar key)
{
switch(key)
{
case 0x11:PB8155=0xfc;PA8155=0xf0;delay(10);break; //數(shù)碼顯示0
case 0x12:PB8155=0x60;PA8155=0xf0;delay(10);break; //數(shù)碼顯示1
case 0x14:PB8155=0xda;PA8155=0xf0;delay(10);break; //數(shù)碼顯示2
case 0x18:PB8155=0xf2;PA8155=0xf0;delay(10);break; //數(shù)碼顯示3
case 0x21:PB8155=0x66;PA8155=0xf0;delay(10);break; //數(shù)碼顯示4
case 0x22:PB8155=0xb6;PA8155=0xf0;delay(10);break; //數(shù)碼顯示5
case 0x24:PB8155=0xbe;PA8155=0xf0;delay(10);break; //數(shù)碼顯示6
case 0x28:PB8155=0xe0;PA8155=0xf0;delay(10);break; //數(shù)碼顯示7
case 0x41:PB8155=0xfe;PA8155=0xf0;delay(10);break; //數(shù)碼顯示8
case 0x42:PB8155=0xf6;PA8155=0xf0;delay(10);break; //數(shù)碼顯示9
case 0x44:PB8155=0xEE;PA8155=0xf0;delay(10);break; //數(shù)碼顯示a
case 0x48:PB8155=0x3E;PA8155=0xf0;delay(10);break; //數(shù)碼顯示b
case 0x81:PB8155=0x9c;PA8155=0xf0;delay(10);break; //數(shù)碼顯示c
case 0x82:PB8155=0x7a;PA8155=0xf0;delay(10);break; //數(shù)碼顯示d
case 0x84:PB8155=0x9E;PA8155=0xf0;delay(10);break; //數(shù)碼顯示e
case 0x88:PB8155=0x8E;PA8155=0xf0;delay(10);break; //數(shù)碼顯示f
default: break;
}
}
/* 鍵掃描函數(shù) */
uchar key_scan(void)
{
uchar scancode,tmpcode;
PB8155 = 0xf0; // 在列行沒有接高電平發(fā)全0列掃描碼
PA8155=0xff; //關(guān)閉顯示
if ((PC8155&0xcf)!=0xcf) // 若哪行有0代表有鍵按下,PC口"1100,****"PC口7,6位沒有用默認(rèn)為高電平,5,4位不用時(shí)為0.
{
delay(1); // 延時(shí)去抖動(dòng)
if ((PC8155&0xcf)!=0xcf) // 延時(shí)后再判斷一次,去除抖動(dòng)影響
{
scancode = 0xfe; //從第一列開始發(fā)0
while((scancode&0x10)!=0) // 逐行掃描
{
PB8155 = scancode; // 輸出列掃描碼
if ((PC8155&0xcf)!=0xcf) // 本行有鍵按下
{
tmpcode = (PC8155<<4)|0x0f;
/* 返回特征字節(jié)碼,為1的位即對(duì)應(yīng)于行和列 */
return((~scancode)+(~tmpcode));
}
else scancode = (scancode<<1)|0x01; // 行掃描碼左移一位
}
}
}
return(key); // 無鍵按下,返回值為原來key值(這是松開鍵讓它一直執(zhí)行子程序), 如返回值為0(是按一下才執(zhí)行鍵功能程序,松開就不執(zhí)行);
}
//延時(shí)子程序ms級(jí)
void delay(uchar ms)
{
uchar i;
while(ms--)
{
for(i=0;i<150;i++)
{;}
}//--焦建國制作
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -