求一个51单片机实验例题的系统方案设计和代码

题目:
用按键或者按键矩阵输入任意4位数(不为0),并在数码管上做显示以输入2761为例,数码管显示:2761-276.1-27.61-2.761-7612-761.2-76.123-7.612-7127-612.7-61.27-6.127-1276-127.6-12.76-1.276-2761
要求

  • [1 ] 希望能够给出系统方案设计
  • [2 ] 程序代码

就是小数点不停循环:由矩阵键盘获取值1-9并生成4位数,分解4位数数码管显示,当数大于0时开始小数点位置无限循环,按其他键清零.

img


#include <REGF51RC.H>
#include "intrins.h"
#define FOSC 11059200L
#define T1MS (65536-FOSC/12/1000) //定时器1ms的中断

sbit FAN_in1=P3^2;
sbit FAN_in2=P3^3;
sbit FAN_EN=P3^4;

sbit SHUMA1=P2^0;
sbit SHUMA2=P2^1;
sbit SHUMA3=P2^2;
sbit SHUMA4=P2^3;

sbit led1=P1^0;
sbit led2=P1^1;
sbit led3=P1^2;
sbit led4=P1^3;
sbit led5=P1^4;

sbit S1=P2^5;
sbit S2=P2^6;
sbit S3=P2^7;
sbit S4=P3^2;
sbit S5=P3^3;

unsigned int count=0,fan_count=0,led_en=0,fan_count_h=0,DZ=0,led_num=0,time_count=0,dp_en=0;
unsigned char start=0,num[10]={0,0,0,0},set_num[10]={0,0,0,0};
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0~9

void tm0_isr() interrupt 1
{
TL0 = T1MS; //reload timer0 low byte
TH0 = T1MS >> 8; //reload timer0 high byte
/////倒计时

///////

  if(count<4)
        count++;
    else
    {
        count=0;
        led_en=1;
        if(led_en==1)
        {
            SHUMA1=0;
            SHUMA2=0;
            SHUMA3=0;
            SHUMA4=0;
              switch(DZ)
                      {
                            case 0:
                                              SHUMA1=1;
                                         if(dp_en==0)
                                                     P0=table[num[0]]&0x7f;
                                                 else
                                                     P0=table[num[0]];
                                         DZ=1;
                                         break;
                                case 1:
                                         SHUMA2=1;
                                         if(dp_en==1)
                                                     P0=table[num[1]]&0x7f;
                                                 else
                                                     P0=table[num[1]];
                                         DZ=2;
                                         break;
                                 case 2:
                                         SHUMA3=1;
                                         if(dp_en==2)
                                                     P0=table[num[2]]&0x7f;
                                                 else
                                                     P0=table[num[2]];
                                         DZ=3;
                                         break;                 
                              case 3:
                                         SHUMA4=1;
                                         if(dp_en==3)
                                                     P0=table[num[3]]&0x7f;
                                                 else
                                                     P0=table[num[3]];
                                         DZ=0;
                                         break;
                            }
               
        }
    }

}

/*
函数功能实现1ms延时
*/
void Delay1ms() //@11.0592MHz
{
unsigned char i, j;

_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
    while (--j);
} while (--i);

}

void delay_ms(unsigned int i)
{
unsigned int j=0;
for(j=0;j<i;j++)
Delay1ms();
}

void scan_key()
{
unsigned char i, j,t[4];
if(S1==0)
{
delay_ms(10);
if(S1==0)
{
while(!S1);
{

                                 num[0]=2;
                                 set_num[0]=2;
                                 
                             }
                }
            }
            
    else
  if(S2==0)
          {
                delay_ms(10);
                if(S2==0)
                {
                    while(!S2);///K1键盘按下
                         {
                                num[1]=7;
                    set_num[1]=7;
                                 
                             }
                }
            }            
        else
  if(S3==0)
          {
                delay_ms(10);
                if(S3==0)
                {
                    while(!S3);///K1键盘按下
                         {
                                 num[2]=6;
                     set_num[2]=6;
                                 
                             }
                }
            }            
    else
  if(S4==0)
          {
                delay_ms(10);
                if(S4==0)
                {
                    while(!S4);///S4停止工作
                         {
                                num[3]=1;
                    set_num[3]=1;
                                 
                             }
                }
            }    
else
  if(S5==0)
          {
                delay_ms(10);
                if(S5==0)
                {
                    while(!S5);///S5切换
                         {
                                 start=1;
                                 if(dp_en==0)
                                 {
                                     if(led_num<3)
                                       led_num++;
                                     else
                                         led_num=0;
                                  
                                    j=0; 
                      for(i=led_num;i<4;i++)
                                    num[j++]=set_num[i];
                                     
                                  for(i=0;i<led_num;i++)
                                    {
                                            num[j]=set_num[i]; 
                                            j++;
                                        }
                                        
                                 }
                                
                                if(dp_en>0)
                                         dp_en--;
                                     else
                                         dp_en=4;
                                     
                                                                    
                             }
                }
            }                
            
            
            
            
}

void main()
{
char i=3,j=5;
TMOD = 0x01; //set timer0 as mode1 (16-bit)
TL0 = T1MS; //initial timer0 low byte
TH0 = T1MS >> 8; //initial timer0 high byte
TR0 = 1; //timer0 start running
ET0 = 1; //enable timer0 interrupt

EA = 1; //open global interrupt switch
P0=0xff;
start=0;
DZ=0;
dp_en=4;

led_num=0;


while(1)
{
  scan_key();
}

}