📄 stopwatch.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 + -