马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
#include <reg51.h>
#include <intrins.h>
/********************/
unsigned char table[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//共阴数码管 0-9 表
/********************/
sbit seclet_A = P1^0; //管脚定义 74-138 3-8 控制信号线
sbit seclet_B = P1^1;
sbit seclet_C = P1^2;
/********************/ //宏定义
#define SM_1 seclet_C=0;seclet_B=0;seclet_A=0
#define SM_2 seclet_C=0;seclet_B=0;seclet_A=1
#define SM_3 seclet_C=0;seclet_B=1;seclet_A=0
#define SM_4 seclet_C=0;seclet_B=1;seclet_A=1
#define SM_5 seclet_C=1;seclet_B=0;seclet_A=0
#define SM_6 seclet_C=1;seclet_B=0;seclet_A=1
#define SM_7 seclet_C=1;seclet_B=1;seclet_A=0
#define SM_8 seclet_C=1;seclet_B=1;seclet_A=1
bit flag; //定义中断 标志位
//==================================键盘程序
code unsigned char key_tab[16]={0x7e,0x7d,0x7b,0x77,0xbe,0xbd,0xbb,0xb7,
0xde,0xdd,0xdb,0xd7,0xee,0xed,0xeb,0xe7};
unsigned char ReadKey(void); //扫描键盘 返回键值
//=============
void main(void)
{
EA=1; //开启总中断
EX0=1; //开启外部中断 0
IT0=1; // 设置成 下降沿触发方式
SM_1;
while(1)
{
P0=0XF0; //预置P0 口准备读取键值
if(flag) //检测时候 进入中断
{
P2=table[ReadKey()]; //读取键值,并附给P2口显示
flag=0; //清除 标志位
}
}
}
//========**************=====
void key_scan() interrupt 0 //外部中断 0 的优先级最高
{ // 所以用 0
flag=1; //置标志位为 1
}
//========**************=====
//这个程序有一定的难度
unsigned char ReadKey(void)
{
unsigned char i,j,key;
j=0xfe; //预置 准备 扫描
for(i=0;i<4;i++) //循环四次 扫描
{
P0=j; //附值给P0
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
if((P0&0xf0)!=0xf0) //如果有按键 按下
{
key=P0; //读取键值
break; //跳出for 循环 或者 while 循环
}
j=_crol_(j,1); //循环左移 处理
key=0xff;
}
for(i=0;i<16;i++) //循环16次 查表的到相应的键值
if(key==key_tab)
return i; //返回键值
附件:
|