⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stopwatch.c

📁 通过输入4个数
💻 C
字号:
#include "101c49k.h"
#include "lcd.h"
#include "StopWatch.h"

unsigned char SWTime_M;						/* Stop watch : Minute   */
unsigned char SWTime_S;						/* Stop watch : Second   */
unsigned char SWTime_10ms;					/* Stop watch : 1/100Sec */
unsigned int  CurTime_10ms;					/* Current 1/100sec */

char startEnable;							/* Stop watch time enable flag */

unsigned char fTimeLCD;						/* LCD : Timer flag */
unsigned char CurLed;						/* LED for Scroll */
int fTime1ms;								/* 1 sec timer flag */

//新增部分
NUM num[4];
int k = 0;
int sign = 0;
const int dest=24;
int flag = 0;
int exit = 0;

void main(void)
{
	asm ("\tand\t0b10111111,PSW\n");		/* Interrupt disable */
	
	//CurLed = 0x01;

	io_init();								/* initialize of CPU */
	time_init();							/* initialize of time value */

	asm ("\tor\t0b01110000,PSW\n");			/* Interrupt enable, Level 3 */

	lcd_init();								/* initialize of LCD */

	/* LCD Startup Messages */
	lcd_clear();
	lcd_puts(" Welcome! ", 0, 0);

	/*LED_OUT = 0xff;
	wait(1000);
	LED_OUT = 0;*/
	
	startEnable = 0;						/* initialize of flags */

	while (1) {
		if( startEnable ){
			for (k = 0;k <= 3;k++){
				exit=0;
				while(exit==0){//一次输入完成退出循环
					exit = 1;
					num[k].son = P4.IN.BYTE;
					LED_OUT = P4.IN.BYTE;
					//lcd_puts(Bin2Dec(num[k].son), 0, 10);
					if(flag != 0){// 按IRQ1确认输入的值,并存入到数组
						flag = 0;
						break;
					}
					exit=0;
				}
			}/*  */
			for (k = 0;k <= 3;k++) num[k].mum=1;
			//for (k = 0;k <= 3;k++) num[k].son=k+3;
			//for (k=0;k<=3;k++) lcd_puts(Bin2Dec(num[k].son), 0, 10);			
			calc(num);
		}	
	}	
}


//新增函数

NUM op(NUM num1,int opsign,NUM num2)
{
    NUM s;
    switch(opsign){
		case 0:
			s.mum=num1.mum*num2.mum;
			s.son=num1.son*num2.mum+num1.mum*num2.son;
			break;
		case 1:
			s.mum=num1.mum*num2.mum;
			s.son=num1.son*num2.mum-num1.mum*num2.son;
			break;
		case 2:
			s.mum=num1.mum*num2.mum;
			s.son=num1.son*num2.son;
			break;
		case 3:
			if (num2.son!=0) {
				s.mum=num1.mum*num2.son;
				s.son=num1.son*num2.mum;
			}
			else sign=-1;
	}
    return s;
}

int Permutation(int a[], int start, int end) 
{ 
    int i; 
    int temp; 
    /*if(start == end) 
    { 
        for(i = 0; i <= end; i++) 
            printf(" %d ",a[i]); 
        printf("\n"); 
    } 
    else*/ 

    for(i = start; i <= end; i++) 
    { 
        temp=a[start]; a[start]=a[i]; a[i]=temp; 
        Permutation(a, start+1, end); 
        temp=a[start]; a[start]=a[i]; a[i]=temp; 
    } 
	return 1;
} 

void calc(NUM num[])
{
    int op1,op2,op3,a,b,c,d;
    char opsign[5]={"+-*/"};
    int index[]={0,1,2,3};
    while(Permutation(index,0,4)) {
        a=index[0];b=index[1];c=index[2];d=index[3];
        for (op1=0;op1<=3;op1++)//排列操作符
            for (op2=0;op2<=3;op2++)
                for (op3=0;op3<=3;op3++)
                {
                    if (op(op(op(num[a],op1,num[b]),op2,num[c]),op3,num[d]).mum*dest==op(op(op(num[a],op1,num[b]),op2,num[c]),op3,num[d]).son && sign !=-1)
                    {
                        lcd_puts("((", 1, 0);
						lcd_puts(Bin2Dec(num[a].son), 1, 2);
						lcd_puts(Bin1Dec(opsign[op1]), 1, 3);
						lcd_puts(Bin2Dec(num[b].son), 1, 4);
						lcd_puts(")", 1, 5);
						lcd_puts(Bin1Dec(opsign[op2]), 1, 6);
						lcd_puts(Bin2Dec(num[c].son), 1, 7);
						lcd_puts(")", 1, 8);
						lcd_puts(Bin1Dec(opsign[op3]), 1, 9);
						lcd_puts(Bin2Dec(num[d].son), 1, 10);
						lcd_puts("=24", 1, 11);
						return;
					}
                    sign=0;
                    if (op(op(num[a],op1,num[b]),op2,op(num[c],op3,num[d])).mum*dest==op(op(num[a],op1,num[b]),op2,op(num[c],op3,num[d])).son && sign !=-1)
                    {
                    	lcd_puts("(", 1, 0);
						lcd_puts(Bin2Dec(num[a].son), 1, 1);
						lcd_puts(Bin1Dec(opsign[op1]), 1, 2);
						lcd_puts(Bin2Dec(num[b].son), 1, 3);
						lcd_puts(")", 1, 4);
						lcd_puts(Bin1Dec(opsign[op2]), 1, 5);
						lcd_puts("(", 1, 6);
						lcd_puts(Bin2Dec(num[c].son), 1, 7);
						lcd_puts(Bin1Dec(opsign[op3]), 1, 8);
						lcd_puts(Bin2Dec(num[d].son), 1, 9);
						lcd_puts(")=24", 1, 10);
						return;
					}
                    sign=0;
                    if (op(op(num[a],op1,op(num[b],op2,num[c])),op3,num[d]).mum*dest==op(op(num[a],op1,op(num[b],op2,num[c])),op3,num[d]).son && sign !=-1)
                    {
                    	lcd_puts("(", 1, 0);
						lcd_puts(Bin2Dec(num[a].son), 1, 1);
						lcd_puts(Bin1Dec(opsign[op1]), 1, 2);
						lcd_puts("(", 1, 3);
						lcd_puts(Bin2Dec(num[b].son), 1, 4);
						lcd_puts(Bin1Dec(opsign[op2]), 1, 5);
						lcd_puts(Bin2Dec(num[c].son), 1, 6);
						lcd_puts("))", 1, 7);
						lcd_puts(Bin1Dec(opsign[op3]), 1, 9);
						lcd_puts(Bin2Dec(num[d].son), 1, 10);
						lcd_puts("=24", 1, 11);
						return;
					}
                    sign=0;
                    if (op(num[a],op1,op(op(num[b],op2,num[c]),op3,num[d])).mum*dest==op(num[a],op1,op(op(num[b],op2,num[c]),op3,num[d])).son && sign !=-1)
                    {
                    	lcd_puts(Bin2Dec(num[a].son), 1, 0);
						lcd_puts(Bin1Dec(opsign[op1]), 1, 1);
						lcd_puts("((", 1, 2);
						lcd_puts(Bin2Dec(num[b].son), 1, 4);
						lcd_puts(Bin1Dec(opsign[op2]), 1, 5);
						lcd_puts(Bin2Dec(num[c].son), 1, 6);
						lcd_puts(")", 1, 7);
						lcd_puts(Bin1Dec(opsign[op3]), 1, 8);
						lcd_puts(Bin2Dec(num[d].son), 1, 9);
						lcd_puts(")=24", 1, 10);
						return;
					}
                    sign=0;
                    if (op(num[a],op1,op(num[b],op2,op(num[c],op3,num[d]))).mum*dest==op(num[a],op1,op(num[b],op2,op(num[c],op3,num[d]))).son && sign !=-1)
                    {
                    	lcd_puts(Bin2Dec(num[a].son), 1, 0);
						lcd_puts(Bin1Dec(opsign[op1]), 1, 1);
						lcd_puts("(", 1, 2);
						lcd_puts(Bin2Dec(num[b].son), 1, 3);
						lcd_puts(Bin1Dec(opsign[op2]), 1, 4);
						lcd_puts("(", 1, 5);
						lcd_puts(Bin2Dec(num[c].son), 1, 6);
						lcd_puts(Bin1Dec(opsign[op3]), 1, 7);
						lcd_puts(Bin2Dec(num[d].son), 1, 8);
						lcd_puts("))=24", 1, 9);
						return;
					}
                    sign=0;
                }
    }
    lcd_puts("no answer!", 1, 2);
}

void wait(int time)
{
	fTime1ms = 0;
	while (1) {
		if ( fTime1ms >= time ) break;
	}
}

void io_init(void)
{
	CPUM.BYTE = 0x00;				/* CPU mode = NORMAL */
	CPUM.BIT.OSCSEL = 0x00;			/* divide ratio = 1 */
	CPUM.BIT.OSCDBL = 0x00;			/* internal system clock = NORMAL */
	OSCMD.BIT.SOSC2DS = 0x00;		/* slow oscillator = NORMAL */
	EXADV.BYTE = 0x00;				/* extend address output = INHIBIT */
	MEMCTR.BIT.IOW = 0x00;			/* special register wait = NONE */
	MEMCTR.BIT.EXMEM = 0x00;		/* memory extend = NONE */
	MEMCTR.BIT.EXWH = 0x01;			/* wait mode = FIXED */
	MEMCTR.BIT.IRWE = 0x00;			/* software interrupt = Disable */
	MEMCTR.BIT.EXW = 0x00;			/* fixed wait value = 0 */
	DLYCTR.BIT.DLYS = 0x00;			/* stability period = 2^14/fs */
	DLYCTR.BIT.BUZOE = 0x00;		/* Buzzer output = NONE */
	SBNKR.BIT.SBA = 0x00;			/* source address bank selection = Bank0 */
	DBNKR.BIT.DBA = 0x00;			/* destination address bank selection  = Bank0 */

/* LED OUT */
	P1.OUT.BYTE = 0x00;				/* P1 dtat output */
	P1.DIR.BYTE = 0xdf;				/* P1 P15 is input only, the other bit = OUTPUT */
	P1.DIR.BYTE = 0xff;				/* P1 the other bit = OUTPUT */
	P1.PLU.BYTE = 0x00;				/* P1 pull up resistance = NONE */
	P1.OMD.BYTE = 0x00;				/* P1 timer output = NONE */
	P1.TCNT.BYTE = 0x00;			/* P1 real time output = NONE */
	
/* SW IN */
	FLOAT.BIT.P4RDWN = 0x00;		/* P4 pull up/down selection = PULL UP */
	P4.DIR.BYTE = 0x00;				/* P4 all bit = INPUT */
	P4.PLUD.BYTE = 0x00;			/* P4 pull up/down resistance = NONE */


/* LCD CONTROL */
	P5.OUT.BYTE = 0x00;				/* P5 data output */
	P5.DIR.BYTE = 0xff;				/* P5 all bit = OUTPUT */
	P5.PLU.BYTE = 0x00;				/* P5 pull up resistance = NONE */
	P6.OUT.BYTE = 0x00;				/* P6 data output */
	P6.DIR.BYTE = 0xff;				/* P6 all bit = OUTPUT */
	P6.PLU.BYTE = 0x00;				/* P6 pull up resistance = NONE */

/* LCD DATA */
	P8.OUT.BYTE = 0x00;				/* P8 data output */
	P8.DIR.BYTE = 0xff;				/* P8 all bit = OUTPUT */
	P8.PLU.BYTE = 0x00;				/* P8 pull up resistance = NONE */

/* TM1 timer for LCD (1ms/40us) */
	TM1.MD.BYTE = 0x01;				/* TM1 normal operation, stop, clock source = tm1psc */
	TM1.CK.BYTE = 0x06;				/* pre-scaler = fosc/128 */
	ICR.TM1ICR.BIT.LV = 0x01;		/* interrupt level = 1 */
	ICR.TM1ICR.BIT.IE = 0x01;		/* interrupt enable */

/* TM7 10msec Timer */
	TM7.MD1.BYTE = 0x2C;			/* TM7 pre-scaler = fosc/16, output disabled(reset) */
	TM7.MD2.BYTE = 0x28;			/* BC match to OC1 */
	TM7.PR1 = 12288-1;			/* 12288=(19.6608MHz/100)/16 compare value (pre-set1) */
	ICR.TM7ICR.BIT.LV = 0x00;		/* interrupt level = 0 */
	ICR.TM7ICR.BIT.IE = 0x01;		/* interrupt enable */

/* EXTERNAL INTERRUPT 0 */
	ICR.IRQ0ICR.BIT.LV = 0x02;		/* interrupt level = 2 */
	ICR.IRQ0ICR.BIT.IE = 0x01;		/* interrupt enable */

/* EXTERNAL INTERRUPT 1 */
	ICR.IRQ1ICR.BIT.LV = 0x02;		/* interrupt level = 2 */
	ICR.IRQ1ICR.BIT.IE = 0x01;		/* interrupt enable */

	MEMCTR.BIT.IRWE = 0x01;			/* software interrupt = Enable */
	ICR.IRQ0ICR.BIT.IR = 0x00;		/* interrupt request flag clear */
	ICR.IRQ1ICR.BIT.IR = 0x00;		/* interrupt request flag clear */
	MEMCTR.BIT.IRWE = 0x00;			/* software interrupt = Disable */

/* 偦偺懠 */
	NFCTR.BYTE = 0x77;				/* noise filter 0/1 = ON, sampling = fosc/2^10 */
	PSCMD.BIT.PSCEN = 1;			/* pre-scaler = ON */
}

void time_init(void)
{
	/* initialize of time value */
	SWTime_M = 0;
	SWTime_S = 0;
	SWTime_10ms = 0;
	CurTime_10ms = 0;
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -