#include<at89x51.h>
#define uchar unsigned char
uchar shu=0;
uchar u=0xfe;
uchar shu1[]={10,0};
uchar sh=0;
uchar sh1[]={10,0};
uchar shu2;
uchar d;
uchar x;
uchar i=0;
uchar n=1;
uchar code ledcode[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; /*定义一维数组,显示0-f的段码*/
uchar code ledcode1[]={0x40,0x4f,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //0到9的 有PH
void delay(uchar a)
{
uchar b;
for(;a>0;a--)
for(b=0;b<125;b++)
;
}
void led(void)
{
P2=0XbF;
P0=ledcode[shu%10];
delay(5);
P2=0x7f;
P0=ledcode[shu/10];
delay(5);
P2=0XDF;
P0=0xbf;
delay(5);
P2=0XeF;
P0=0xbf;
delay(5);
P2=0XF7;
P0=ledcode[shu1[0]/10];
delay(5);
P2=0XFb;
P0=ledcode1[shu1[0]%10];
delay(5);
P2=0XFd;
P0=ledcode[shu1[1]/10];
delay(5);
P2=0XFe;
P0=ledcode[shu1[1]%10];
delay(5);
}
uchar jianpan(void) //键盘扫描函数
{
uchar hang,lie;
P3 =0xf0; //P3口低4位输出0,高4位输出1
if((P3&0xf0)!=0xf0) //判断是否有键按下
{
delay(10); //延时去抖动
if((P3&0xf0)!=0xf0) //再次判断是否有键按下
{
hang=0xfe; //逐行扫描初值1111 1110
while((hang&0x10)!=0) //判断4行是否扫描结束 0001 0000
{
P3=hang; /*逐行开放行值送P3*/
if((P3&0xf0)!=0xf0) //判断本行是否有键按下
{
lie=(P3&0xf0); //把列的数据送key
P3=0xf0; //P3口低4位输出0,高4位输出1
while((P3&0xf0)!=0xf0)//等待键松开
{led();}
d=lie|(hang&0x0f);
return(lie|(hang&0x0f)); //返回所按的键代码
}
else
{hang=(hang<<1)|0x01;} //左移准备开放下一行
}
}
else{}
}
else{}
}
void swi(uchar a)
{
switch(a)
{
case 0x7e:
if(n==0)
{
shu=1;
TR0=0;
TR1=0;
n=n+2;
}
break;
case 0xbe:
if(n==0)
{
shu=2;
TR0=0;
TR1=0;
n=n+2;
}
break;
case 0xde:
if(n==0)
{
shu=3;
TR0=0;
TR1=0;
n=n+2;
}
break;
case 0xee:
if(n==0)
{
shu=4;
TR0=0;
TR1=0;
n=n+2;
}
break;
case 0x7d:
if(n==0)
{
shu=5;
TR0=0;
TR1=0;
n=n+2;
}
break;
case 0xbd:
if(n==0)
{
shu=6;
TR0=0;
TR1=0;
n=n+2;
}
break;
case 0xdd:
if(n==0)
{
shu=7;
TR0=0;
TR1=0;
n=n+2;
}
break;
case 0xed:
if(n==0)
{
shu=8;
TR0=0;
TR1=0;
n=n+2;
}
break;
case 0x7b:
if(n==0)
{
shu=9;
TR0=0;
TR1=0;
n=n+2;
}
break;
case 0xbb:
if(n==0)
{
shu=10;
TR0=0;
TR1=0;
n=n+2;
}
break;
case 0xdb:
if(n==0)
{
shu=11;
TR0=0;
TR1=0;
n=n+2;
}
break;
case 0xeb:
if(n==0)
{
shu=12;
TR0=0;
TR1=0;
n=n+2;
}
break;
case 0x77:
if(n==0)
{
shu=13;
TR0=0;
TR1=0;
n=n+2;
}
break;
case 0xb7:
if(n==0)
{
shu=14;
TR0=0;
TR1=0;
n=n+2;
}
break;
case 0xd7:
if(n==0)
{
shu=15;
TR0=0;
TR1=0;
n=n+2;
}
break;
case 0xe7:
n--;
if((n==-2)|(n==-1))
{
n=0;
}
i++;
if(i==1)
{
TR0=1;
TR1=1;
}
if(i==2)
{
i=0;
TR0=0;
TR1=0;
P1=0XFF;
shu=0;
shu1[0]=10;
shu1[1]=0;
}
break;
}
}
void t0(void) interrupt 1
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
shu2++;
if(shu2==10)
{
shu2=0;
shu1[1]--;
if(shu1[1]==(-1))
{
shu1[1]=99;
shu1[0]--;
if(shu1[0]==(-1))
{
shu1[0]=0;
shu1[1]=0;
n=1;
}
}
}
}
void t1(void) interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
P1=u;
u=(u<<1)|(u>>7);
if((shu1[1]==0)&(shu1[0]==0))
{
P1=!P1;
}
}
void main(void)
{
TMOD=0X11;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
ET0=1;
ET1=1;
//TR0=1;
while(1)
{
led();
x=jianpan();
swi(x);
}
}
刚刚学单片机花了几天时间来弄这个,大家多指教啊,呵呵
本文分享了一个基于51单片机的程序设计实例,该程序实现了LED数码管显示与键盘扫描功能。通过定时器控制LED显示不同数值,并利用键盘输入更新显示内容,展示了基本的单片机应用技术。
809

被折叠的 条评论
为什么被折叠?



