实验内容:51单片机的PX(x=0,1,2或3)端口连接4×4矩阵键盘,对应按键值为0,1,2,3…F。剩余某PX(x=0,1,2或3)端口连接七段数码管。当某一按键按下时,数码管显示该按键对应键值。
工具:proteus+keil
#include<reg51.h>
#include<intrins.h>
unsigned char code seg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xA1,0x86,0x8e};//共阳译码
unsigned char circle,i; //临时变量circle,循环变量i
sbit P1.0=P1^0;//控制列
sbit P1.1=P1^1;
sbit p1.2=P1^2;
sbit p1.3=P1^3;
void delay(int a)
{
while(a--);
}
void main()
{
while(1)
{
P1=0xef;// 选择第一行P1.7~P1.4 e(1110) P1.3~P1.0 f(1111)
for(i=0;i<=3;i++)
{
if(P1.0==0)
P0=seg[i*4+0];
if(P1.1==0)
P0=seg[i*4+1];
if(p1.2==0)
P0=seg[i*4+2];
if(p1.3==0)
P0=seg[i*4+3];
delay(500);
circle=P1;
circle=circle<<1;
//第一次循环0xef左移1位 1101 1110 //第二次循环0xef再次左移1位 1011 1100 /……
circle=circle | 0x0f;
//第一次循环 1110 1111 0xef 第二次循环0xef左移一位后:1101 1110
// | |
// 0000 1111 0x0f 0000 1111 0x0f
// 1110 1111 0xef(选择第一行) 1101 1111 0xbf(选择第二行)
P1=circle; //将临时量circle赋值给P1,以便下次循环,进入扫描下一行
}
}
}