From: JIA P. <jp...@gm...> - 2013-06-08 12:09:25
|
Hi, Dear roelof 't Hooft : Sorry to bug you again. I think why the code doesn't work has much to do with the 2 red bold lines: #include <reg51.h> *sbit Beep = P1^5 ; * unsigned char n=0; unsigned char code music_tab[] ={ 0x18, 0x30, 0x1C , 0x10, 0x20, 0x40, 0x1C , 0x10, 0x18, 0x10, 0x20 , 0x10, 0x1C, 0x10, 0x18 , 0x40, 0x1C, 0x20, 0x20 , 0x20, 0x1C, 0x20, 0x18 , 0x20, 0x20, 0x80, 0xFF , 0x20, 0x30, 0x1C, 0x10 , 0x18, 0x20, 0x15, 0x20 , 0x1C, 0x20, 0x20, 0x20 , 0x26, 0x40, 0x20, 0x20 , 0x2B, 0x20, 0x26, 0x20 , 0x20, 0x20, 0x30, 0x80 , 0xFF, 0x20, 0x20, 0x1C , 0x10, 0x18, 0x10, 0x20 , 0x20, 0x26, 0x20, 0x2B , 0x20, 0x30, 0x20, 0x2B , 0x40, 0x20, 0x20, 0x1C , 0x10, 0x18, 0x10, 0x20 , 0x20, 0x26, 0x20, 0x2B , 0x20, 0x30, 0x20, 0x2B , 0x40, 0x20, 0x30, 0x1C , 0x10, 0x18, 0x20, 0x15 , 0x20, 0x1C, 0x20, 0x20 , 0x20, 0x26, 0x40, 0x20 , 0x20, 0x2B, 0x20, 0x26 , 0x20, 0x20, 0x20, 0x30 , 0x80, 0x20, 0x30, 0x1C , 0x10, 0x20, 0x10, 0x1C , 0x10, 0x20, 0x20, 0x26 , 0x20, 0x2B, 0x20, 0x30 , 0x20, 0x2B, 0x40, 0x20 , 0x15, 0x1F, 0x05, 0x20 , 0x10, 0x1C, 0x10, 0x20 , 0x20, 0x26, 0x20, 0x2B , 0x20, 0x30, 0x20, 0x2B , 0x40, 0x20, 0x30, 0x1C , 0x10, 0x18, 0x20, 0x15 , 0x20, 0x1C, 0x20, 0x20 , 0x20, 0x26, 0x40, 0x20 , 0x20, 0x2B, 0x20, 0x26 , 0x20, 0x20, 0x20, 0x30 , 0x30, 0x20, 0x30, 0x1C , 0x10, 0x18, 0x40, 0x1C , 0x20, 0x20, 0x20, 0x26 , 0x40, 0x13, 0x60, 0x18 , 0x20, 0x15, 0x40, 0x13 , 0x40, 0x18, 0x80, 0x00 }; void int0() interrupt 1 { TH0=0xd8; TL0=0xef; n--; } void delay (unsigned char m) { unsigned i=3*m; while(--i); } void delayms(unsigned char a) { while(--a); } void main() { unsigned char p,m; unsigned char i=0; TMOD&=0x0f; TMOD|=0x01; TH0=0xd8;TL0=0xef; IE=0x82; play: while(1) { a: p=music_tab[i]; if(p==0x00) { i=0, delayms(1000); goto play;} else if(p==0xff) { i=i+1;delayms(100),TR0=0; goto a;} else {m=music_tab[i++], n=music_tab[i++];} TR0=1; while(n!=0) *Beep = ~Beep*,delay(m); TR0=0; } } The above code is working, but in order to be able to be compiled with sdcc,what I've done is : 1) remove the first red line, 2) change the 2nd red line from *Beep=~Beep* to *P1_5=~P1_5* ; which seems to be incorrect. I myself of course supports ANSI C, instead of Keil C. However, I've already met so much such situations in Keil C code. How can I solve such problems in a uniform way in sdcc? Thank you very much... Cheers On Sat, Jun 8, 2013 at 6:04 PM, JIA Pei <jp...@gm...> wrote: > > Hi, roelof > > Thank you very much for your prompt reply. Seriously thank you. > The code is actually copied from somebody else. I just did some > copy/paste, and then test. > > I responded to my previous Email, probably into the wrong Email address > (the sdcc development, > instead of sdcc user) . Sorry. I'm trying your solution now... > > Thank you > * > * > * > * > *JIA Pei <jp...@gm...>* > *9:54 AM (8 hours ago)* > ** > ** > ** > *to Development* > ** > *Thank you for all who have answered my questions !! seriously thank > you. * > *The solutions has been found:* > * > * > * > * > * > * > *#include <8052.h>* > * > * > *#define RELAY P1_4* > *#define K1 P2_7* > * > * > *main()* > *{* > *while(1)* > *{* > * if (!K1) RELAY = 0;* > * else RELAY = 1;* > *}* > *}* > * > * > * > * > *Thank you everybody !!!* > > > > > > On Sat, Jun 8, 2013 at 5:48 PM, roelof 't Hooft <ro...@it...>wrote: > >> On Sat, 2013-06-08 at 17:15 +0800, JIA Pei wrote: >> >> > #include <reg51.h> >> >> Did you read the replies on your previous post ? >> You did not respond to them (yet). >> Hint : sdcc must be giving you a warning about >> NOT using reg51.h >> >> >> > void int0() interrupt 1 >> > { TH0=0xd8; >> > TL0=0xef; >> > n--; >> > } >> >> The proper setup of the interrupt routine with a current >> sdcc version is like the following : >> >> void Timer0_ISR(void) __interrupt tf0_vector >> { >> ....; >> } >> >> tf0_vector can be replaced with a number if you like as it >> already is a number set with #define in the processor type >> header file. >> >> >> > void delay (unsigned char m) >> > { >> > unsigned i=3*m; >> >> This variable is unsigned type what ? >> I am assuming integer due to the three times multiplication >> of a char (max value 255 * 3). >> >> >> > void delayms(unsigned char a) >> > { >> > while(--a); >> > } >> >> If you want strict timing, like a millisecond delay, use >> a hardware timer. >> >> >> > play: >> > while(1) >> > { >> > a: p=music_tab[i]; >> > if(p==0x00) { i=0, delayms(1000); goto play;} >> >> A "goto", seriously ? >> >> Still no mention of the sdcc version....... >> And no specific errors noted that sdcc gave. >> >> roelof >> >> ps: advise : please clean up your code writing skills. It >> looks like s**t. >> >> >> >> >> ------------------------------------------------------------------------------ >> How ServiceNow helps IT people transform IT departments: >> 1. A cloud service to automate IT design, transition and operations >> 2. Dashboards that offer high-level views of enterprise services >> 3. A single system of record for all IT processes >> http://p.sf.net/sfu/servicenow-d2d-j >> _______________________________________________ >> Sdcc-user mailing list >> Sdc...@li... >> https://lists.sourceforge.net/lists/listinfo/sdcc-user >> > > > > -- > > Pei JIA > > Email: jp...@gm... > cell: +1 604-362-5816 > > Welcome to Vision Open > http://www.visionopen.com > -- Pei JIA Email: jp...@gm... cell: +1 604-362-5816 Welcome to Vision Open http://www.visionopen.com |