找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5626|回复: 2
收起左侧

求教如何将51单片机红外遥控器键码显示程序改成红外控制数码管0-99显示

[复制链接]
ID:270239 发表于 2018-1-2 20:00 | 显示全部楼层 |阅读模式
下面是51单片机红外遥控lcd1602显示键码程序
#include<reg51.h>
#include<math.h>
#define   uchar   unsigned  char
#define   uint    unsigned   int
#define   ulong   unsigned  long
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x06,0xbf};//共阳极
ulong  num=0,qnum=0;
uchar  key0=0,ikey0=0,kkey=0;   //qnum为前一个键值,当为0时表示没有前一个键值,ikey0表示当存在前一个键值下进行加减乘除运算
//uchar  num1,num2,num3,num4,num5,num6;  //key0表示当为1时,是数字键,为0时,是清零键,为2时,是运算键,为3时,等号键
void  delay(uint d)                    
{
     while(d-->0);
}

void  error()    //当数值溢出的时候                       
{   
     P2 = 0x00;
     P2 = 0xff;
     P0 = tab[10];
     delay(100);
     P2 = 0x00;
     P0 = 0xff;
}
void  display(ulong num0)   //显示函数
{
     if(num0>999999&&num0<-99999)                      //当数值溢出时
          error();
     else if(num0>=0&&num0<=999999)                         //当数值为正数时
     {
          P2 = 0x00;
          dis1 = 1;     //显示最高位,第一位
          P0 = tab[num0/100000];
          delay(100);
          dis1 = 0;
          P0 = 0xff;

          P2 = 0x00;
          dis2 = 1;       //第二位
          P0 = tab[(num0/10000)%10];
          delay(100);
          dis2 = 0;
          P0 = 0xff;


          P2 = 0x00;
          dis3 = 1;       //第三位
          P0 = tab[(num0/1000)%10];
          delay(100);
          dis3 = 0;
          P0 = 0xff;

          P2 = 0x00;
          dis4 = 1;         //第四位
          P0 = tab[(num0/100)%10];
          delay(100);
          dis4 = 0;
          P0 = 0xff;

          P2 = 0x00;
          dis5 = 1;        //第五位
          P0 = tab[(num0/10)%10];
          delay(100);
          dis5 = 0;
          P0 = 0xff;

          P2 = 0x00;
          dis6 = 1;        //显示最低位,第六位
          P0 = tab[num0%10];
          delay(100);
          dis6 = 0;
          P0 = 0xff;
      }
      else                             //当数值为负数时
      {
          num0 = abs(num0);
          P2 = 0x00;
          dis1 = 1;     //显示最高位,第一位
          P0 = tab[11];
          delay(100);
          dis1 = 0;
          P0 = 0xff;

          P2 = 0x00;
          dis2 = 1;       //第二位
          P0 = tab[(num0/10000)%10];
          delay(100);
          dis2 = 0;
          P0 = 0xff;


          P2 = 0x00;
          dis3 = 1;       //第三位
          P0 = tab[(num0/1000)%10];
          delay(100);
          dis3 = 0;
          P0 = 0xff;

          P2 = 0x00;
          dis4 = 1;         //第四位
          P0 = tab[(num0/100)%10];
          delay(100);
          dis4 = 0;
          P0 = 0xff;

          P2 = 0x00;
          dis5 = 1;        //第五位
          P0 = tab[(num0/10)%10];
          delay(100);
          dis5 = 0;
          P0 = 0xff;

          P2 = 0x00;
          dis6 = 1;        //显示最低位,第六位
          P0 = tab[num0%10];
          delay(100);
          dis6 = 0;
          P0 = 0xff;         
      }
}

void  key()         //键盘扫描函数
{
     uchar  temp;
     P1 = 0xff;
     P1 = 0Xef;   //检测第一行
     temp = P1;
     temp = temp&0x0f;
     if(P1!=0X0f)
     {
          delay(5);
          temp = P1;
          temp = temp&0x0f;
          if(P1!=0X0f)
          {
               temp = P1;

               switch(temp)
               {
                    case 0xe7:  key0 = 0; break;                  //-----清屏键
                    case 0xeb:  key0 = 1; num = num*10+0; kkey = 1; break;  //-------'0'
                    case 0xed:  key0 = 3; break;                  //-----等号键=
                    case 0xee:  key0 = 2; ikey0 = 10; break;      //------加号键+
               }

          while(temp!=0x0f)
          {
               temp = P1;
               temp = temp&0x0f;
          }
          //P0 = tab[h];
         }
     }


     P1 = 0xff;
     P1 = 0Xdf;   //检测第二行
     temp = P1;
     temp = temp&0x0f;
     if(P1!=0X0f)
     {
          delay(5);
          temp = P1;
          temp = temp&0x0f;
          if(P1!=0X0f)
          {
               temp = P1;

               switch(temp)
               {
                    case 0xd7:  key0 = 1; num = num*10+1; kkey = 1; break;   //------'1'
                    case 0xdb:  key0 = 1; num = num*10+2; kkey = 1; break;   //------'2'
                    case 0xdd:  key0 = 1; num = num*10+3; kkey = 1; break;   //-------'3'
                    case 0xde:  key0 = 2; ikey0 = 11; break;       //-----减号键-
               }

          while(temp!=0x0f)
          {
               temp = P1;
               temp = temp&0x0f;
          }
          //P0 = tab[h];
         }
     }


     P1 = 0xff;
     P1 = 0Xbf;   //检测第三行
     temp = P1;
     temp = temp&0x0f;
     if(P1!=0X0f)
     {
          delay(5);
          temp = P1;
          temp = temp&0x0f;
          if(P1!=0X0f)
          {
               temp = P1;

               switch(temp)
               {
                    case 0xb7:  key0 = 1; num = num*10+4; kkey = 1; break;    //-------'4'
                    case 0xbb:  key0 = 1; num = num*10+5; kkey = 1; break;    //-------'5'
                    case 0xbd:  key0 = 1; num = num*10+6; kkey = 1; break;    //-------'6'
                    case 0xbe:  key0 = 2; ikey0 = 12; break;        //------乘号键*
               }

          while(temp!=0x0f)
          {
               temp = P1;
               temp = temp&0x0f;
          }
          //P0 = tab[h];
         }
     }


     P1 = 0xff;
     P1 = 0X7f;   //检测第四行
     temp = P1;
     temp = temp&0x0f;
     if(P1!=0X0f)
     {
          delay(5);
          temp = P1;
          temp = temp&0x0f;
          if(P1!=0X0f)
          {
               temp = P1;

               switch(temp)
               {
                    case 0x77:  key0 = 1; num = num*10+7; kkey = 1; break;     //-------'7'
                    case 0x7b:  key0 = 1; num = num*10+8; kkey = 1; break;     //--------'8'
                    case 0x7d:  key0 = 1; num = num*10+9; kkey = 1; break;     //--------'9'
                    case 0x7e:  key0 = 2; ikey0 = 13; break;         //-------除号键

               }

          while(temp!=0x0f)
          {
               temp = P1;
               temp = temp&0x0f;
          }
         }
     }

}

void  count()
{
     key();
     if(key0 == 0)         //清零
     {
          num = 0;qnum = 0;
          display(num);
     }
     else  if(key0 == 1)       //数字键,显示数字
     {     
          display(num);

     }
     else if(key0 == 8)
     {
          display(qnum);
     }
     else if(key0 == 2)        //当为运算符号键时
     {
          qnum = num;
          num = 0;
          key0 = 8;

     }
     else if(key0 == 3)        //等号键
     {
          switch(ikey0)
               {
                    case 10:num = num + qnum;  key0 = 2; break;
                    case 11:num = qnum - num;  key0 = 2; break;
                    case 12:num = num * qnum;  key0 = 2; break;
                    case 13:num = qnum / num;  key0 = 2; break;
                    //default  break;
               }        
          //}
     }

}


void  main()
{    while(1)
     {   
          //display(num);
          count();
     }     
}

回复

使用道具 举报

ID:164602 发表于 2018-1-3 08:41 | 显示全部楼层
我有个例子程序,你看看,自己改。
/***************************************************************************
    程序功能:
        1、运行程序,按遥控器按键,在数码管上显示相应的控制码(以16进制显示);
        2、对特别的几个键,有相应的现象出现:
        (1)电源键,使继电器工作或断开;
        (2)静音键,使蜂鸣器响或不响;
        (3)快进键让LED灯向右出现一次走马灯现象;
        (4)快退键让LED灯向左出现一次走马灯现象;
        (5)按0~9,数码管显示所按的键号;
        (6)按其它键,不会改变已经按的数字键的显示,表示看电视台开关电源或静音、快进快退,都不会
改变台号。
    (7)其它键没想好怎么以现有板产生相应功能,所以按下后,没有特别现象,只有显示其控制码。
******************************************************************************/
#include "reg51.h"//头文件:

#define LED8 P2//红外遥控功能之一是让LED灯亮,所以要将P2口改名

sbit hwx=P3^3;                //红外接收数据引脚,也是外部中断1的I/O口
sbit SMG_q = P1^0;        //定义数码管阳级控制脚(千位)
sbit SMG_b = P1^1;        //定义数码管阳级控制脚(百位)
sbit SMG_s = P1^2;        //定义数码管阳级控制脚(十位)
sbit SMG_g = P1^3;        //定义数码管阳级控制脚(个位)
sbit JDQ=P1^4;                //继电器
sbit Beep =  P1^5 ;        //蜂鸣器

code unsigned char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
                                                        0x88,0x8c,0xc6,0xa1,0x86,0x8e};       

unsigned char ly_disdate[4]={0,0,0,0};
unsigned char ly_lhj[4],i;
bit ly_flag=1;

void display();

void delay(void);

void Delay10ms(unsigned int c)
{
    unsigned char a,b;
    for(c;c>0;c--)
        for(b=38;b>0;b--)
            for(a=130;a>0;a--);
}

void main(void)
{
        EA=1;
        EX1=1;
        IT1=1;
        TMOD=0X10;
        JDQ=1;
        ly_flag=0;
        while(1){       
                if(ly_flag){
                        ly_flag=0;
                        if ((ly_lhj[2]==0x45))
                        {
                                JDQ=~JDQ;
                        }
                        if ((ly_lhj[2]==0x47))
                        {
                                Beep=~Beep;
                        }
                        if ((ly_lhj[2]==0x40))
                        {
                                LED8=0xfe;
                                for(i=0;i<8;i++)
                                {                                         
                                        Delay10ms(10);
                                        LED8=LED8<<1;
                                }
                                LED8=0xff;
                        }
                        if ((ly_lhj[2]==0x43))
                        {
                                LED8=0x7f;
                                for(i=0;i<8;i++)
                                {                                         
                                        Delay10ms(10);
                                        LED8=LED8>>1;
                                }
                                LED8=0xff;
                        }
                        if ((ly_lhj[2]==0x16))
                        {
                                ly_disdate[0]=0;                       
                        }
                        if ((ly_lhj[2]==0x0c))
                        {
                                ly_disdate[0]=1;                       
                        }                       
                        if ((ly_lhj[2]==0x18))
                        {
                                ly_disdate[0]=2;                       
                        }                       
                        if ((ly_lhj[2]==0x5e))
                        {
                                ly_disdate[0]=3;                       
                        }                       
                        if ((ly_lhj[2]==0x08))
                        {
                                ly_disdate[0]=4;                       
                        }                       
                        if ((ly_lhj[2]==0x1c))
                        {
                                ly_disdate[0]=5;                       
                        }                       
                        if ((ly_lhj[2]==0x5a))
                        {
                                ly_disdate[0]=6;                       
                        }                       
                        if ((ly_lhj[2]==0x42))
                        {
                                ly_disdate[0]=7;                       
                        }                       
                        if ((ly_lhj[2]==0x52))
                        {
                                ly_disdate[0]=8;                       
                        }                       
                        if ((ly_lhj[2]==0x4a))
                        {
                                ly_disdate[0]=9;                       
                        }                       
                        ly_disdate[2]=ly_lhj[2]/16;
                        ly_disdate[3]=ly_lhj[2]%16;
                }
                display();
        }               
}

        TL1=0;
        TH1=0;
        TR1=1;
        while(!hwx);
        TR1=0;       
        if(TH1<30||TH1>40)       
                return;

        TH1=0;
        TR1=1;
        while(hwx)
        {
                delay();
                if(TH1>22)
                        return;               
        }
        TR1=0;
        if(TH1<12)       
                return;

        for(i=0;i<4;i++)
        {
                for(ia=0;ia<8;ia++)
                {                               
                        while(!hwx);
                       
                        TH1=0;
                        TR1=1;       
                        while(hwx)
                        {
                                delay();
                                if(TH1>15)               
                                        return;               
                        }
                        TR1=0;

                        ly_lhj>>=1;
                        if(TH1>4)               
                                ly_lhj|=0x80;
                }
        }
        ly_flag=1;
        TF1=0;
}

void display()
{
        SMG_q=0;
        P0=table[ly_disdate[0]];       
        delay();                       
        P0=0XFF;                       
        SMG_q=1;               

        SMG_s=0;               
        P0=table[ly_disdate[2]];
        delay();                       
        P0=0XFF;                       
        SMG_s=1;               

        SMG_g=0;               
        P0=table[ly_disdate[3]];
        delay();                       
        P0=0XFF;                       
        SMG_g=1;               
}

void delay(void)//35.5us
{               
        unsigned char i=10;
        while(i--);
}
适用电路:

1.jpg

2.jpg

3.jpg

4.jpg


评分

参与人数 1黑币 +5 收起 理由
线性代数 + 5

查看全部评分

回复

使用道具 举报

ID:270556 发表于 2018-1-3 08:54 | 显示全部楼层
定义一个1ms的定时中断,然后将欲显示的内容在中断中发给LED端口。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表