×
单片机 > 单片机程序设计 > 详情

23. 模拟计算器数字输入及显示

发布时间:2020-06-08 发布时间:
|
1. 实验任务 
(1.       开机时,显示“0”
(2.       第一次按下时,显示“D1”;第二次按下时,显示“D1D2”;第三按下时,显示“D1D2D3”,8个全显示完毕,再按下按键下时,给出“嘀”提示音。
2. 电路原理图 

图4.23.1
3.  系统板上硬件连线 
(1.       把“单片机系统”区域中的P1.0端口用导线连接到“音频放大模块”区域中的SPK IN端口上;
(2.       把“单片机系统“区域中的P3.0-P3.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1-C4 R1-R4端口上;
(3.       把“单片机系统”区域中的P0.0-P0.7端口用8芯排线连接到“动态数码显示”区域中的A-H端口上;
(4.       把“单片机系统:区域中的P2.0-P2.7端口用8芯排线连接到“动态数码显示”区域中的S1-S8端口上;
4. 相关程序设计内容 
(1.       行列式键盘输入及按键功能设定;
(2.       动态数码显示;
(3.       数码显示方式处理;
5. 汇编源程序 
(略)
6. C语言源程序 
#include  
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; 
unsigned char code dispbitcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; 
unsigned char dispbuf[8]={0,16,16,16,16,16,16,16}; 
unsigned char dispbitcount; 
unsigned char temp; 
unsigned char i,j; 
unsigned char key; 
unsigned char keypos; 
bit alarmflag; 
void change(unsigned char *p,unsigned char count) 

  while(count>0) 
    { 
      *(p+count)=*(p+count-1); 
      count--; 
    } 

void main(void) 

  TMOD=0x01; 
  TH0=(65536-4000) / 256; 
  TL0=(65536-4000) % 256; 
  TR0=1; 
  ET0=1; 
  EA=1; 
  while(1) 
    { 
      P3=0xff; 
      P3_4=0; 
      temp=P3; 
      temp=temp & 0x0f; 
      if (temp!=0x0f) 
        { 
          for(i=50;i>0;i--) 
          for(j=200;j>0;j--); 
          temp=P3; 
          temp=temp & 0x0f; 
          if (temp!=0x0f) 
            { 
              temp=P3; 
              temp=temp & 0x0f;              
              switch(temp) 
                { 
                  case 0x0e: 
                    key=7; 
                    break; 
                  case 0x0d: 
                    key=8; 
                    break; 
                  case 0x0b: 
                    key=9; 
                    break; 
                  case 0x07: 
                    key=10; 
                    break; 
                } 
              if ((key>=0) && (key<10)) 
              { 
                keypos++; 
                if(keypos<8) 
                  { 
                    change(dispbuf,keypos); 
                    dispbuf[0]=key; 
                  } 
                  else 
                    { 
                      keypos=8; 
                      alarmflag=1; 
                    } 
              } 
              temp=P3; 
              P1_0=~P1_0; 
              temp=temp & 0x0f;              
              while(temp!=0x0f) 
                { 
                  temp=P3; 
                  temp=temp & 0x0f;              
                } 
              alarmflag=0; 
            } 
        } 
      P3=0xff; 
      P3_5=0; 
      temp=P3; 
      temp=temp & 0x0f; 
      if (temp!=0x0f) 
        { 
          for(i=50;i>0;i--) 
          for(j=200;j>0;j--); 
          temp=P3; 
          temp=temp & 0x0f; 
          if (temp!=0x0f) 
            { 
              temp=P3; 
              temp=temp & 0x0f;              
              switch(temp) 
                { 
                  case 0x0e: 
                    key=4; 
                    break; 
                  case 0x0d: 
                    key=5; 
                    break; 
                  case 0x0b: 
                    key=6; 
                    break; 
                  case 0x07: 
                    key=11; 
                    break; 
                } 
              if ((key>=0) && (key<10)) 
              { 
                keypos++; 
                if(keypos<8) 
                  { 
                    change(dispbuf,keypos); 
                    dispbuf[0]=key; 
                  } 
                  else 
                    { 
                      keypos=8; 
                      alarmflag=1; 
                    } 
              } 
              temp=P3; 
              P1_0=~P1_0; 
              temp=temp & 0x0f;              
              while(temp!=0x0f) 
                { 
                  temp=P3; 
                  temp=temp & 0x0f;              
                } 
              alarmflag=0; 
            } 
        } 
      P3=0xff; 
      P3_6=0; 
      temp=P3; 
      temp=temp & 0x0f; 
      if (temp!=0x0f) 
        { 
          for(i=50;i>0;i--) 
          for(j=200;j>0;j--); 
          temp=P3; 
          temp=temp & 0x0f; 
          if (temp!=0x0f) 
            { 
              temp=P3; 
              temp=temp & 0x0f;              
              switch(temp) 
                { 
                  case 0x0e: 
                    key=1; 
                    break; 
                  case 0x0d: 
                    key=2; 
                    break; 
                  case 0x0b: 
                    key=3; 
                    break; 
                  case 0x07: 
                    key=12; 
                    break; 
                } 
              if ((key>=0) && (key<10)) 
              { 
                keypos++; 
                if(keypos<8) 
                  { 
                    change(dispbuf,keypos); 
                    dispbuf[0]=key; 
                  } 
                  else 
                    { 
                      keypos=8; 
                      alarmflag=1; 
                    } 
              } 
              temp=P3; 
              P1_0=~P1_0; 
              temp=temp & 0x0f;              
              while(temp!=0x0f) 
                { 
                  temp=P3; 
                  temp=temp & 0x0f;               
                } 
              alarmflag=0; 
            } 
        } 
      P3=0xff; 
      P3_7=0; 
      temp=P3; 
      temp=temp & 0x0f; 
      if (temp!=0x0f) 
        { 
          for(i=50;i>0;i--) 
          for(j=200;j>0;j--); 
          temp=P3; 
          temp=temp & 0x0f; 
          if (temp!=0x0f) 
            { 
              temp=P3; 
              temp=temp & 0x0f;              
              switch(temp) 
                { 
                  case 0x0e: 
                    key=0; 
                    break; 
                  case 0x0d: 
                    key=13; 
                    break; 
                  case 0x0b: 
                    key=14; 
                    break; 
                  case 0x07: 
                    key=15; 
                    break; 
                } 
              if ((key>=0) && (key<10)) 
              { 
                keypos++; 
                if(keypos<8) 
                  { 
                    change(dispbuf,keypos); 
                    dispbuf[0]=key; 
                  } 
                  else 
                    { 
                      keypos=8; 
                      alarmflag=1; 
                    } 
              } 
              temp=P3; 
              P1_0=~P1_0; 
              temp=temp & 0x0f;              
              while(temp!=0x0f) 
                { 
                  temp=P3; 
                  temp=temp & 0x0f;              
                } 
              alarmflag=0; 
            } 
        } 
    } 

void t0(void) interrupt 1 using 0 

  TH0=(65536-4000) / 256; 
  TL0=(65536-4000) % 256; 
  P0=dispcode[dispbuf[dispbitcount]]; 
  P2=dispbitcode[dispbitcount]; 
  dispbitcount++; 
  if (dispbitcount==8) 
    { 
      dispbitcount=0; 
    } 
  if (alarmflag==1) 
    { 
      P1_1=~P1_1; 
    } 
}
关键字:模拟计算器  数字输入  显示 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机制作超级流水灯