;******************************************************
;*標(biāo)題: 東哥 51單片機(jī)4*4掃描C程序
;*文件:
;*版本: 1.0
;*作者: 東哥
;*郵箱: picavr@163.com QQ: 279068079
;*******************************************************
#include "reg52.h"
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
bit FLAG0=0;
uchar ptr;
static const char tab[16]={0x01,0x02,0x03,0x0c, /*鍵盤(pán)碼00,01,02,03,*/
0x04,0x05,0x06,0x0d, /*鍵盤(pán)碼04,05,06,07,*/
0x07,0x08,0x09,0x0e, /*鍵盤(pán)碼08,09,0a,0b,*/
0x0a,0x00,0x0b,0x0f};/*鍵盤(pán)碼0c,0d,0e,0f*/
void delay (unsigned int value) /*延時(shí)副程式*/
{
while (value!=0) value--; /*10US延時(shí)*/
}
void scan(void) /*掃描鍵盤(pán)副程式*/
{
uchar a1=0xef,i,m; /*A1=0XF7列掃描初值,I行*/
FLAG0=0; /*設(shè)按鍵回應(yīng)旗號(hào)為0,鍵盤(pán)掃描計(jì)數(shù)指標(biāo)為0*/
for(i=0;i<4;i++) /*鍵盤(pán)4個(gè)掃描列*/
{
P2=a1; /*列掃描輸出,讀入P1存入M,以便偵測(cè)行與偵測(cè)按鍵是否放開(kāi)*/
m=P2;
switch(m&0x0f) /*取行的高4位元,偵測(cè)那一行被按*/
{
case 0x07: ptr=i*4; /*第一行被按否?是則掃描指標(biāo)=列X4*/
FLAG0=1; /*是則設(shè)FLAG0=1表有按鍵輸入*/
break; /*跳出此循環(huán)*/
case 0x0b: ptr=i*4+1; /*第二行被按否?是則掃描指標(biāo)=列X4+1*/
FLAG0=1; /*是則設(shè)FLAG0=1表有按鍵輸入*/
break; /*跳出此循環(huán)*/
case 0x0d: ptr=i*4+2; /*第三行被按否?是則掃描指標(biāo)=列X4+2*/
FLAG0=1; /*是則設(shè)FLAG0=1表有按鍵輸入*/
break; /*跳出此循環(huán)*/
case 0x0e: ptr=i*4+3; /*第四行被按否?是則掃描指標(biāo)=列X4+3*/
FLAG0=1; /*是則設(shè)FLAG0=1表有按鍵輸入*/
default: break; /*跳出此循環(huán)*/
}
if(FLAG0==1)break; /*不為1,則掃描列右移,掃描下一列*/
a1=a1<<1|0x01; /*高位補(bǔ)1,由于P1.7~P1.4未接+5V,而是由指令加載高電平*/
}
}
void main(void)
{
TMOD=0x20; //T1工作方式2
TH1=0xfd; //串口波特率為9600
TCON=0x40; //啟動(dòng)T1
SCON=0x40; //串口工作與方式1并禁止接受
IE=0x00; //無(wú)中斷
while(1)
{
scan(); //啟動(dòng)鍵盤(pán)掃描
if(FLAG0) //當(dāng)FLAG0=1時(shí),有鍵輸入
{
SBUF=tab[ptr];
while(TI==0);TI=0; //將鍵值送串口
FLAG0=0; //將標(biāo)識(shí)位清零
delay(30000); //延時(shí)
}
}
}