数码管显示,定时器中断;键盘检测:
1.数码管:分共阳极和共阴极数码管。我的实验板是共阴极,多位数码管的公共端叫做“位选线”,连接在一起的段线叫做“段选线”。位选是独立控制的,而段选是连接在一起的。段选数据由P0口发送,位选由P2口的2.3.4控制。(消影用P0=0x00)
2.中断:为使单片机具有对外部或内部随机事件发生的时间实时处理而设置的,中断功能的存在,很大程度上提高了单片机处理外部或内部时间的能力。51单片机内部共有5个中断源,外部中断0、1;定时器中断0、1;串行口中断。
1)中断级别:INT0>T0>INT1>T1>TI/RI;
2)设置两个与中断有关的寄存器:中断允许寄存器IE和中断优先级寄存器IP。
3)定时器/计数器控制寄存器TCON;定时器/计数器工作方式寄存器TMOD。
4)中断服务程序的写法:
void 函数名()interrupt 中断号 using 工作组
{
中断服务程序内容
}
5)实例:
#include<reg52.h>
unsigned char num=0;
void main()
{
//initial timer
TMOD=0x01;
TH0=(65535-49539)/256;
TL0=(65535-49539)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
if(num==20)
{
num=0;
P2=~P2;
}
}
}
//*********interrupt server
void time() interrupt 1
{
TH0=(65535-49539)/256;
TL0=(65535-49539)%256;
num++;
}
3.独立键盘的检测:扫描法(去抖:延时10ms)
4.矩阵键盘的检测:行列扫描
实例:
#include<reg52.h>
#define uchar unsigned char
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
void delay10ms();
void keydown();
uchar KeyValue;
uchar code table[17]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void main()
{
LSA=0;
LSB=0;
LSC=0;
while(1)
{
keydown();
P0=table[KeyValue];
}
}
//**************keydown()
void keydown()
{
P1=0x0f;
if(P1!=0x0f)
{
delay10ms();
if(P1!=0x0f)
{
//test colume
P1=0x0f;
switch(P1)
{
case(0X07): KeyValue=0;break;
case(0X0b): KeyValue=1;break;
case(0X0d): KeyValue=2;break;
case(0X0e): KeyValue=3;break;
}
//test row
P1=0xf0;
switch(P1)
{
case(0X70): KeyValue=KeyValue;break;
case(0Xb0): KeyValue=KeyValue+4;break;
case(0Xd0): KeyValue=KeyValue+8;break;
case(0Xe0): KeyValue=KeyValue+12;break;
}
while(!P1);
}
}
}
//**************delay10ms()
void delay10ms()
{
uchar i,j;
for(i=10;i>0;i--)
for(j=110;j>0;j--);
}