1.对于单片机,要求先对P1口初始化,即P1=0; P_1到P1_6脚,扫描P1_1脚,则,P1_1=1,依次类推,循环扫描P1_1至P1_6;
同时对应要求将P1口的IO模式设定好,即P1_1=1时,P1M0=0X7C; P1M1=0X00; (将P1_1设为准双向口,P1_2至P1_6设为输 入,可查STC12C5410AD芯片手册)
2.针对键盘图,当第1列有第一个按键被按下,则P1_1=1,P1_6=1,P1其他脚为0;则串口显示为0X42,可以依次类推第一列显示数字分别为:0x42,0x22,0x12,0x0A,0x06,无(反斜对角上无显示)
代码具体如下:
//#include <reg52.h>
#include <intrins.h>
#include <STC12.h>
#define uchar unsigned char /*宏定义*/
sbit P1_7=P1^7;
sbit P1_6=P1^6;
sbit P1_5=P1^5;
sbit P1_4=P1^4;
sbit P1_3=P1^3;
sbit P1_2=P1^2;
sbit P1_1=P1^1;
sbit P1_0=P1^0;
uchar ch;
uchar record;
void init_serialcomm()
{
SCON=0x50; //SCON:serial mode 1,8-bit UART,enable ucvr
TMOD|=0x20; //TMOD:timer 1,mode 2,8-bit reload
// SMOD=0
PCON|=0x00;
TH1 = 0xFC; //3.579545 external osc
IE|=0x90; //Enable Serial Interrupt
TR1=1; //timer 1 run
}
//向串口发送一个字符
void send_char_com(uchar ch)
{
SBUF=ch;
while(TI==0);
TI=0;
}
void delay(unsigned int n)
{
unsigned i;
i=0;
while(i<n)i++;
}
//各行键盘扫描
void port(p1m0)
{
P1=0;
switch(p1m0)
{
case 0X7C: P1_1=1; break;
case 0X7A: P1_2=1; break;
case 0X76: P1_3=1; break;
case 0X6E: P1_4=1; break;
case 0X5E: P1_5=1; break;
case 0X3E: P1_6=1; break;
}
P1M0=p1m0;
P1M1=0X00;
delay(5000); //按键反应调试这个,1000是按1次,发送4到5个,100000,按几次出现一个
ch=P1;
if(ch!=0x02&&ch!=0x04&&ch!=0x08&&ch!=0x10&&ch!=0x20&&ch!=0x40) send_char_com(ch);
}
void scan(void) //键盘扫描
{
port(0X7C);
port(0X7A);
port(0X76);
port(0X6E);
port(0X5E);
port(0X3E);
}
void main(void)
{
init_serialcomm();
while(1)
{
scan();
}
}