سلام برنامه ای میخوام که وقتی کلید رو فشار میدم یکی از رقم ها رو از 1 تا 6 به صورت تصادفی روی 7seg 7سکمنت نشون بده
ممنون از راهنمایتتون
لازم دارم
سریع
خواهشا
ممنون از راهنمایتتون
لازم دارم
سریع
خواهشا
/* CodeVisionAVR C Compiler V2.04.7+ Standard library functions (C) 1998-2010 Pavel Haiduc, HP InfoTech S.R.L. */ #if __CODEVISIONAVR__ < 2000 #error stdlib.lib is designed to be used with CodeVisionAVR V2.0 or later #endif #include <ctype.h> #include <math.h> #include <string.h> #define REG30 (*(unsigned char *) 30) #pragma asm_function+ unsigned int abs(int x) { #ifdef _AVR8L_CORE_ #asm ld r30,y+ ld r31,y+ subi r30,0 sbci r31,0 brpl __abs0 com r30 com r31 subi r30,0xff sbci r31,0xff __abs0: ret #endasm #else #asm ld r30,y+ ld r31,y+ sbiw r30,0 brpl __abs0 com r30 com r31 adiw r30,1 __abs0: ret #endasm #endif } #pragma asm_function- #pragma asm_function+ unsigned char cabs(signed char x) { #asm ld r30,y+ cpi r30,0 brpl __cabs0 neg r30 __cabs0: ret #endasm } #pragma asm_function- #pragma asm_function+ unsigned long labs(long x) { #ifdef _AVR8L_CORE_ #asm ld r30,y+ ld r31,y+ ld r22,y+ ld r23,y+ subi r30,0 sbci r31,0 sbci r22,0 sbci r23,0 brpl __labs0 com r30 com r31 com r22 com r23 subi r30,0xff sbci r31,0xff sbci r22,0xff sbci r23,0xff __labs0: ret #endasm #else #asm ld r30,y+ ld r31,y+ ld r22,y+ ld r23,y+ sbiw r30,0 sbci r22,0 sbci r23,0 brpl __labs0 com r30 com r31 com r22 com r23 clr r0 adiw r30,1 adc r22,r0 adc r23,r0 __labs0: ret #endasm #endif } #pragma asm_function- #pragma asm_function+ float fabs(float x) { #asm ld r30,y+ ld r31,y+ ld r22,y+ ld r23,y+ cbr r23,0x80 ret #endasm } #pragma asm_function- #ifdef _MODEL_TINY_ #pragma asm_function+ int atoi(char *str) { #asm clr r27 ld r26,y __atoi0: ld r30,x mov r24,r26 #endasm isspace(REG30); #ifdef _AVR8L_CORE_ #asm mov r26,r24 tst r30 breq __atoi1 inc r26 rjmp __atoi0 __atoi1: clt ld r30,x cpi r30,'-' brne __atoi2 set rjmp __atoi3 __atoi2: cpi r30,'+' brne __atoi4 __atoi3: inc r26 __atoi4: clr r22 clr r23 __atoi5: ld r30,x mov r24,r26 #endasm isdigit(REG30); #asm mov r26,r24 tst r30 breq __atoi6 mov r30,r22 mov r31,r23 lsl r22 rol r23 lsl r22 rol r23 add r22,r30 adc r23,r31 lsl r22 rol r23 ld r30,x+ clr r31 subi r30,'0' add r22,r30 adc r23,r31 rjmp __atoi5 __atoi6: mov r30,r22 mov r31,r23 brtc __atoi7 com r30 com r31 subi r30,0xff sbci r31,0xff __atoi7: subi r28,-1 ret #endasm #else #asm mov r26,r24 tst r30 breq __atoi1 adiw r26,1 rjmp __atoi0 __atoi1: clt ld r30,x cpi r30,'-' brne __atoi2 set rjmp __atoi3 __atoi2: cpi r30,'+' brne __atoi4 __atoi3: adiw r26,1 __atoi4: clr r22 clr r23 __atoi5: ld r30,x mov r24,r26 #endasm isdigit(REG30); #ifdef _ENHANCED_CORE_ #asm mov r26,r24 tst r30 breq __atoi6 movw r30,r22 lsl r22 rol r23 lsl r22 rol r23 add r22,r30 adc r23,r31 lsl r22 rol r23 ld r30,x+ clr r31 subi r30,'0' add r22,r30 adc r23,r31 rjmp __atoi5 __atoi6: movw r30,r22 brtc __atoi7 com r30 com r31 adiw r30,1 __atoi7: adiw r28,1 ret #endasm #else #asm mov r26,r24 tst r30 breq __atoi6 mov r30,r22 mov r31,r23 lsl r22 rol r23 lsl r22 rol r23 add r22,r30 adc r23,r31 lsl r22 rol r23 ld r30,x+ clr r31 subi r30,'0' add r22,r30 adc r23,r31 rjmp __atoi5 __atoi6: mov r30,r22 mov r31,r23 brtc __atoi7 com r30 com r31 adiw r30,1 __atoi7: adiw r28,1 ret #endasm #endif #endif } #pragma asm_function- #else #pragma asm_function+ int atoi(char *str) { #asm ldd r27,y+1 ld r26,y __atoi0: ld r30,x mov r24,r26 #endasm isspace(REG30); #asm mov r26,r24 tst r30 breq __atoi1 adiw r26,1 rjmp __atoi0 __atoi1: clt ld r30,x cpi r30,'-' brne __atoi2 set rjmp __atoi3 __atoi2: cpi r30,'+' brne __atoi4 __atoi3: adiw r26,1 __atoi4: clr r22 clr r23 __atoi5: ld r30,x mov r24,r26 #endasm isdigit(REG30); #ifdef _ENHANCED_CORE_ #asm mov r26,r24 tst r30 breq __atoi6 movw r30,r22 lsl r22 rol r23 lsl r22 rol r23 add r22,r30 adc r23,r31 lsl r22 rol r23 ld r30,x+ clr r31 subi r30,'0' add r22,r30 adc r23,r31 rjmp __atoi5 __atoi6: movw r30,r22 brtc __atoi7 com r30 com r31 adiw r30,1 __atoi7: adiw r28,2 ret #endasm #else #asm mov r26,r24 tst r30 breq __atoi6 mov r30,r22 mov r31,r23 lsl r22 rol r23 lsl r22 rol r23 add r22,r30 adc r23,r31 lsl r22 rol r23 ld r30,x+ clr r31 subi r30,'0' add r22,r30 adc r23,r31 rjmp __atoi5 __atoi6: mov r30,r22 mov r31,r23 brtc __atoi7 com r30 com r31 adiw r30,1 __atoi7: adiw r28,2 ret #endasm #endif } #pragma asm_function- #endif #ifdef _MODEL_TINY_ #pragma asm_function+ long atol(char *str) { #asm clr r27 ld r26,y __atol0: ld r30,x push r26 #endasm isspace(REG30); #ifdef _AVR8L_CORE_ #asm pop r26 tst r30 breq __atol1 inc r26 rjmp __atol0 __atol1: clt ld r30,x cpi r30,'-' brne __atol2 set rjmp __atol3 __atol2: cpi r30,'+' brne __atol4 __atol3: inc r26 __atol4: clr r16 clr r17 clr r24 clr r25 __atol5: ld r30,x push r26 #endasm isdigit(REG30); #asm pop r26 tst r30 breq __atol6 mov r30,r16 mov r31,r17 mov r22,r24 mov r23,r25 rcall __atol8 rcall __atol8 add r16,r30 adc r17,r31 adc r24,r22 adc r25,r23 rcall __atol8 ld r30,x+ clr r31 subi r30,'0' add r16,r30 adc r17,r31 adc r24,r31 adc r25,r31 rjmp __atol5 __atol6: mov r30,r16 mov r31,r17 mov r22,r24 mov r23,r25 brtc __atol7 com r30 com r31 com r22 com r23 subi r30,0xff sbci r31,0xff sbci r22,0xff sbci r23,0xff __atol7: subi r28,-1 ret __atol8: lsl r16 rol r17 rol r24 rol r25 ret #endasm #else #asm pop r26 tst r30 breq __atol1 adiw r26,1 rjmp __atol0 __atol1: clt ld r30,x cpi r30,'-' brne __atol2 set rjmp __atol3 __atol2: cpi r30,'+' brne __atol4 __atol3: adiw r26,1 __atol4: clr r0 clr r1 clr r24 clr r25 __atol5: ld r30,x push r26 #endasm isdigit(REG30); #ifdef _ENHANCED_CORE_ #asm pop r26 tst r30 breq __atol6 movw r30,r0 movw r22,r24 rcall __atol8 rcall __atol8 add r0,r30 adc r1,r31 adc r24,r22 adc r25,r23 rcall __atol8 ld r30,x+ clr r31 subi r30,'0' add r0,r30 adc r1,r31 adc r24,r31 adc r25,r31 rjmp __atol5 __atol6: movw r30,r0 movw r22,r24 brtc __atol7 com r30 com r31 com r22 com r23 clr r24 adiw r30,1 adc r22,r24 adc r23,r24 __atol7: adiw r28,1 ret __atol8: lsl r0 rol r1 rol r24 rol r25 ret #endasm #else #asm pop r26 tst r30 breq __atol6 mov r30,r0 mov r31,r1 mov r22,r24 mov r23,r25 rcall __atol8 rcall __atol8 add r0,r30 adc r1,r31 adc r24,r22 adc r25,r23 rcall __atol8 ld r30,x+ clr r31 subi r30,'0' add r0,r30 adc r1,r31 adc r24,r31 adc r25,r31 rjmp __atol5 __atol6: mov r30,r0 mov r31,r1 mov r22,r24 mov r23,r25 brtc __atol7 com r30 com r31 com r22 com r23 clr r24 adiw r30,1 adc r22,r24 adc r23,r24 __atol7: adiw r28,1 ret __atol8: lsl r0 rol r1 rol r24 rol r25 ret #endasm #endif #endif } #pragma asm_function- #else #pragma asm_function+ long atol(char *str) { #asm ldd r27,y+1 ld r26,y __atol0: ld r30,x push r26 #endasm isspace(REG30); #asm pop r26 tst r30 breq __atol1 adiw r26,1 rjmp __atol0 __atol1: clt ld r30,x cpi r30,'-' brne __atol2 set rjmp __atol3 __atol2: cpi r30,'+' brne __atol4 __atol3: adiw r26,1 __atol4: clr r0 clr r1 clr r24 clr r25 __atol5: ld r30,x push r26 #endasm isdigit(REG30); #ifdef _ENHANCED_CORE_ #asm pop r26 tst r30 breq __atol6 movw r30,r0 movw r22,r24 rcall __atol8 rcall __atol8 add r0,r30 adc r1,r31 adc r24,r22 adc r25,r23 rcall __atol8 ld r30,x+ clr r31 subi r30,'0' add r0,r30 adc r1,r31 adc r24,r31 adc r25,r31 rjmp __atol5 __atol6: movw r30,r0 movw r22,r24 brtc __atol7 com r30 com r31 com r22 com r23 clr r24 adiw r30,1 adc r22,r24 adc r23,r24 __atol7: adiw r28,2 ret __atol8: lsl r0 rol r1 rol r24 rol r25 ret #endasm #else #asm pop r26 tst r30 breq __atol6 mov r30,r0 mov r31,r1 mov r22,r24 mov r23,r25 rcall __atol8 rcall __atol8 add r0,r30 adc r1,r31 adc r24,r22 adc r25,r23 rcall __atol8 ld r30,x+ clr r31 subi r30,'0' add r0,r30 adc r1,r31 adc r24,r31 adc r25,r31 rjmp __atol5 __atol6: mov r30,r0 mov r31,r1 mov r22,r24 mov r23,r25 brtc __atol7 com r30 com r31 com r22 com r23 clr r24 adiw r30,1 adc r22,r24 adc r23,r24 __atol7: adiw r28,2 ret __atol8: lsl r0 rol r1 rol r24 rol r25 ret #endasm #endif } #pragma asm_function- #endif #ifdef _MODEL_TINY_ #pragma asm_function+ void itoa(int n,char *str) { #ifdef _AVR8L_CORE_ #asm ld r26,y+ clr r27 ld r30,y+ ld r31,y+ add r30,r27 adc r31,r27 brpl __itoa0 com r30 com r31 subi r30,0xff sbci r31,0xff ldi r22,'-' st x+,r22 __itoa0: clt ldi r24,low(10000) ldi r25,high(10000) rcall __itoa1 ldi r24,low(1000) ldi r25,high(1000) rcall __itoa1 ldi r24,100 clr r25 rcall __itoa1 ldi r24,10 rcall __itoa1 mov r22,r30 rcall __itoa5 clr r22 st x,r22 ret __itoa1: clr r22 __itoa2: cp r30,r24 cpc r31,r25 brlo __itoa3 inc r22 sub r30,r24 sbc r31,r25 brne __itoa2 __itoa3: tst r22 brne __itoa4 brts __itoa5 ret __itoa4: set __itoa5: subi r22,-0x30 st x+,r22 ret #endasm #else #asm ld r26,y+ clr r27 ld r30,y+ ld r31,y+ adiw r30,0 brpl __itoa0 com r30 com r31 adiw r30,1 ldi r22,'-' st x+,r22 __itoa0: clt ldi r24,low(10000) ldi r25,high(10000) rcall __itoa1 ldi r24,low(1000) ldi r25,high(1000) rcall __itoa1 ldi r24,100 clr r25 rcall __itoa1 ldi r24,10 rcall __itoa1 mov r22,r30 rcall __itoa5 clr r22 st x,r22 ret __itoa1: clr r22 __itoa2: cp r30,r24 cpc r31,r25 brlo __itoa3 inc r22 sub r30,r24 sbc r31,r25 brne __itoa2 __itoa3: tst r22 brne __itoa4 brts __itoa5 ret __itoa4: set __itoa5: subi r22,-0x30 st x+,r22 ret #endasm #endif } #pragma asm_function- #else #pragma asm_function+ void itoa(int n,char *str) { #asm ld r26,y+ ld r27,y+ ld r30,y+ ld r31,y+ adiw r30,0 brpl __itoa0 com r30 com r31 adiw r30,1 ldi r22,'-' st x+,r22 __itoa0: clt ldi r24,low(10000) ldi r25,high(10000) rcall __itoa1 ldi r24,low(1000) ldi r25,high(1000) rcall __itoa1 ldi r24,100 clr r25 rcall __itoa1 ldi r24,10 rcall __itoa1 mov r22,r30 rcall __itoa5 clr r22 st x,r22 ret __itoa1: clr r22 __itoa2: cp r30,r24 cpc r31,r25 brlo __itoa3 inc r22 sub r30,r24 sbc r31,r25 brne __itoa2 __itoa3: tst r22 brne __itoa4 brts __itoa5 ret __itoa4: set __itoa5: subi r22,-0x30 st x+,r22 ret #endasm } #pragma asm_function- #endif void ltoa(long int n,char *str) { unsigned long i; unsigned char j,p; i=1000000000L; p=0; if (n<0) { n=-n; *str++='-'; }; do { j=(unsigned char) (n/i); if (j || p || (i==1)) { *str++=j+'0'; p=1; } n%=i; i/=10L; } while (i!=0); *str=0; } void ftoa(float n,unsigned char decimals,char *str) { float scale=0.5; unsigned char i,d; switch (((unsigned int *) &n)[1]) { case 0xFFFF: strcpyf(str,"-NAN"); return; case 0x7FFF: strcpyf(str,"NAN"); return; }; if (n<0.0) {n=-n; *str++='-';}; if (decimals>6) decimals=6; i=decimals; while (i--) scale=scale*0.1; n=n+scale; i=0; scale=1.0; while (n>=scale) { scale=scale*10.0; // 08032010_1 if (++i>38) { strcpyf(str,"INF"); return; } }; if (i==0) *str++='0'; else while (i--) { scale=floor(0.5+scale*0.1); d=(unsigned char) (n/scale); *str++=d+'0'; n=n-scale*d; }; if (decimals==0) {*str=0; return;}; *str++='.'; while (decimals--) { n=n*10.0; d=(unsigned char) n; *str++=d+'0'; n=n-d; }; *str=0; } void ftoe(float n,unsigned char decimals,char *str) { float scale=1.0; unsigned char i,d; signed char expon; switch (((unsigned int *) &n)[1]) { case 0xFFFF: strcpyf(str,"-NAN"); return; case 0x7FFF: strcpyf(str,"NAN"); return; }; if (decimals>6) decimals=6; i=decimals; while (i--) scale=scale*10.0; if (n==0.0) {expon=0; scale=scale*10.0;} else { expon=decimals; if (n<0.0) {*str++='-'; n=-n;}; if (n>scale) { scale=scale*10.; while (n>=scale) {n=n*0.1; ++expon;}; } else { while (n<scale) {n=n*10.0; --expon;}; scale=scale*10.0; }; n+=0.5; if (n>=scale) {n=n*0.1; ++expon;}; } i=0; while (i<=decimals) { scale=floor(0.5+scale*0.1); d=(unsigned char) (n/scale); *str++=d+'0'; n=n-(float) d*scale; if (i++) continue; *str++ ='.'; }; *str++='e'; // 26012010_3 if (expon<0) { expon=-expon; *str='-'; } else *str='+'; ++str; *str++='0'+expon/10; *str++='0'+expon%10; *str=0; } float atof(char *str) { char *start,*end; float scale,result; unsigned char c,e,minus,minuse; result=0.0; while (isspace(c=*str)) str++; minus=0; if (c=='+') str++; else if(c=='-') {minus=1; str++;}; c=e=0; start=str; while (isdigit(*str)||(c=(*str=='.'))) { e|=c; ++str; }; end=str; if (e) { --str; while (*str!='.') { result=(result+(*str-'0'))/10.0; --str; }; }; scale=1.0; while (--str>=start) { result=result+scale*(*str-'0'); scale=scale*10.0; }; c=*end++; if ((c=='e')||(c=='E')) { minuse=e=0; c=*end; if (c=='+') end++; else if (c=='-') {minuse=1; end++;}; while (isdigit(c=*end++)) e=e*10+c-'0'; if (e>38) { if (minus) return -3.40282346e+38F; return 3.40282346e+38F; }; c=0x20; scale=1.0; while (c) { scale=scale*scale; if (c&e) scale=scale*10.0; c>>=1; }; if (minuse) result=result/scale; else result=result*scale; }; if (minus) result=-result; return result; } static unsigned long _seed=1; void srand(int seed) { _seed=seed; } #pragma warn- int rand(void) { _seed=0x41C64E6D*_seed+30562; #ifdef _ENHANCED_CORE_ #asm movw r30,r22 andi r31,0x7F #endasm #else #asm mov r30,r22 mov r31,r23 andi r31,0x7F #endasm #endif } #if (_HEAP_SIZE_ !=0 ) && (_HEAP_SIZE_ < 8) #error Heap size too small #endif struct alloc_data { unsigned int block_size; struct alloc_data *next; }; static void *allocate_block(unsigned int size) { struct alloc_data *pa; struct alloc_data *pn; struct alloc_data *pr; unsigned char *pe; pa=(struct alloc_data *) _HEAP_START_; pa->block_size=0; while (pa) { pr=(struct alloc_data *) ((unsigned char *) pa+pa->block_size+sizeof(struct alloc_data)); if (pn=pa->next) pe=(unsigned char*) pn; else pe=(unsigned char *) (_HEAP_START_+_HEAP_SIZE_); if ((pe-(unsigned char *)pr) >= (size+sizeof(struct alloc_data))) { pa->next=pr; pr->next=pn; pr->block_size=size; pr=(struct alloc_data *) ((unsigned char *) pr+sizeof(struct alloc_data)); return pr; }; pa=pn; }; return NULL; } static struct alloc_data *find_prev_block(void *pp) { struct alloc_data *pa; struct alloc_data *pn; pa=(struct alloc_data *) _HEAP_START_; while (pa) { if ((pn=pa->next) == pp) return pa; pa=pn; }; return NULL; } void *realloc(void *ptr, unsigned int size) { #if (_HEAP_SIZE_ > 0) struct alloc_data *pp; struct alloc_data *pa; void *p; unsigned int bsize; if (ptr) { pp=(struct alloc_data *) ((unsigned char *) ptr-sizeof(struct alloc_data)); if (pa=find_prev_block(pp)) { pa->next=pp->next; if (size) { if (p=allocate_block(size)) { if ((bsize=pp->block_size) < size) size=bsize; memmove(p,ptr,size); return p; }; pa->next=pp; }; }; }; #endif return NULL; } void *malloc(unsigned int size) { #if (_HEAP_SIZE_ > 0) void *p; p=NULL; if (size) if (p=allocate_block(size)) memset(p,0,size); return p; #else return NULL; #endif } void *calloc(unsigned int num, unsigned int size) { return malloc(num*size); } void free(void *ptr) { realloc(ptr,0); } #ifdef _WARNINGS_ON_ #pragma warn+ #endif
دیدگاه