我的抢答器

本文分享了一个基于51单片机的程序设计实例,该程序实现了LED数码管显示与键盘扫描功能。通过定时器控制LED显示不同数值,并利用键盘输入更新显示内容,展示了基本的单片机应用技术。

#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);

    }   
}

刚刚学单片机花了几天时间来弄这个,大家多指教啊,呵呵

转载于:https://www.cnblogs.com/393558224/archive/2010/12/29/1920508.html

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值