We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
Hi, I'm writing a code for digital clock in Keil C, but I'm not getting the expected results. Can anybody please help me with the program? The code is as follows..
#include <AT892051.H> #include <stdio.h> #include <intrins.h>
sbit PIN_P10=P1^0;/* Character to be transfered through this bit in parallel*/ sbit PIN_P11=P1^1;/* Clock*/ sbit PIN_P12=P1^2;/* Latch*/ sbit CS4=P1^3; /* 1st 7-segment Display*/ sbit CS3=P1^4; /* 2nd 7-segment Display*/ sbit CS2=P1^5; /* 3rd 7-segment Display*/ sbit CS1=P1^6; /* 4th 7-segment Display*/
unsigned char DataWrite; unsigned char _crol_(unsigned char Temp,unsigned char DataWrite); char Display_Buffer[6]; unsigned char Dispcount; unsigned char mscount;
int Hours=1; int Minutes=0; int Seconds=0; int i=0; char Temp;
code unsigned char Lookup[11]= { 0xEE,0x28,0xCD,0x6C,0x2B,0x67,0xE7,0x2C,0xEF,0x2F };
void main() { TMOD=0x01; TH0=0xF8; /* Initializing timer0*/ TL0=0x30; /*for 1ms*/ IE=0x82; TR0=1; do { sprintf(Display_Buffer,"%02d%02d",Hours,Minutes); /* converting int into char*/ }while(1); } void Timer0(void) interrupt 1 { TF0=0; TR0=0; TH0=0xF8; TL0=0x30; TR0=1; { mscount++; Dispcount++; if(mscount>=1000) { mscount=0; Seconds++; } if(Seconds>=59) { Seconds=0; Minutes++; } if(Minutes>=59) { Minutes=0; Hours++; } if(Hours>=12) { Hours=1; } } { if(Dispcount==29) /* This code is for refresh rate*/ { CS1=0; CS2=0; CS3=0; CS4=0; } if(Dispcount==30) { DataWrite=Lookup[Display_Buffer[0]-0x30]; } if(8>i) { i++; if (Dispcount==34) { Temp=DataWrite; } if (Dispcount==32) { PIN_P11=1; } if (Dispcount==36) { PIN_P10=Temp^7; } if (Dispcount==38) { PIN_P11=0; } if (Dispcount==40) { DataWrite=_crol_(Temp,1); } } PIN_P12=0; if(Dispcount==48) { CS1=1; } } { if(Dispcount==49) { CS1=0; CS2=0; CS3=0; CS4=0; } if(Dispcount==50) { DataWrite=Lookup[Display_Buffer[1]-0x30]; } { if(8>i) { i++; if (Dispcount==54) { Temp=DataWrite; } if (Dispcount==52) { PIN_P11=1; } if (Dispcount==56) { PIN_P10=Temp^7; } if (Dispcount==58) { PIN_P11=0; } if (Dispcount==60) { DataWrite=_crol_(Temp,1); } } PIN_P12=0; } if(Dispcount==68) { CS2=1; } } { if(Dispcount==69) { CS1=0; CS2=0; CS3=0; CS4=0; } if(Dispcount==70) { DataWrite=Lookup[Display_Buffer[2]-0x30]; } { if(8>i) { i++; if (Dispcount==74) { Temp=DataWrite; } if (Dispcount==72) { PIN_P11=1; } if (Dispcount==76) { PIN_P10=Temp^7; } if (Dispcount==78) { PIN_P11=0; } if (Dispcount==80) { DataWrite=_crol_(Temp,1); } } PIN_P12=0; } if(Dispcount==88) { CS3=1; } } { if(Dispcount==89) { CS1=0; CS2=0; CS3=0; CS4=0; } if(Dispcount==90) { DataWrite=Lookup[Display_Buffer[3]-0x30]; } { if(8>i) { i++; if (Dispcount==94) { Temp=DataWrite; } if (Dispcount==92) { PIN_P11=1; } if (Dispcount==96) { PIN_P10=Temp^7; } if (Dispcount==98) { PIN_P11=0; } if (Dispcount==100) { DataWrite=_crol_(Temp,1); } } PIN_P12=0; } if(Dispcount==108) { CS4=1; } } if(Dispcount==821) { CS1,CS2,CS3,CS4=0; } } RETI;
So - still no debugging from you.
Still not thinking about - and trying to explain - how you think a variable can have multiple different values at the same time.
Still not explained how you think your magic loop will handle "i" and "Dispcount" and have them step through everything exactly as many times as your hardware requires. If Dispcount steps up time once - how will you at the same time manage to step out 8 data bits to the shift register. And not only that - but to manage to do it once for every shift register?
Still not looked at the datasheets and figured out why a chip with ns speed should be handled by a statemachine with ms delays. Have you even located the datasheets for the components? Can you even quote the timing figures?
Still not [insert large number of other things you still haven't responded to, thought about, fixed, ...]
Back to the beginning of this thread. Read the earlier comments yet again. Return with answers to the questions - posting new code with the same errors clearly shows that you have ignored the comments you have received.
The comments are valid, and your code will remain buggy until you have an asnwer to every one of them. The compiler and processor don't care if you make more posts to this forum. Your hardware will not produce the correct output whatevery you post here, as long as you haven't closed all (!) open issues.
The hardware doesn't have any "his thought was good" feature. It does what you instruct it to do. One single little error in your code and the hardware will behave according to that erroneous instruction. So details are vital. And you have clearly shown that you don't spend time bothering with details.
If you were a tailor, then misfitting clothes would still be clothes. That mentality does not work with programming. No "almost correct".
And how about indent with spaces? And make sure each indent is a fixed number of spaces, so the code blocks do align? Neither you nor we can read code that isn't properly indented. Many of the bugs are not evident without correct indenting, since the indenting is the visual way of showing interrelations between comparison operators and the code that is executed based on the result of the comparisons.
And how come you always manages to get a couple of source code lines that are outside the code block?
I still did not come to know what a state machine is.. Is the following a state machine?
if(Dispcount==30) { if(j<=4) { j++; SevenSegmentData=DecimalToSevenSegment[Display_Buffer[j]-'0']; { Temp=SevenSegmentData; DigitShiftregisterClockPin=1; { if(8>=i) /* For a byte to be read by the port pin*/ { i++; DigitShiftregisterSerialPin=Temp^7; DigitShiftregisterClockPin=0; /*clock is made low*/ SevenSegmentData=_crol_(Temp,1); /* bits are rotated left*/ } DigitShiftregisterLatchPin=0; /* Data is Latched*/ } } } }
You will never just "come to know" stuff - you need to put some effort into finding out:
www.lmgtfy.com/
Because we live in a finite world, practical applications are usually Finite State Machines - or "FSMs" for short:
Thank you Mr. Neil for your valuable links.
#include <AT892051.H> #include <stdio.h> #include <intrins.h> sbit DigitShiftregisterSerialPin=P1^0; /* Character to be transfered through thisbit in parallel*/ sbit DigitShiftregisterClockPin=P1^1; /* Clock*/ sbit DigitShiftregisterLatchPin=P1^2; /* Latch*/ /*sbit DriveMinutes=P1^3; /* 1st 7-segment Display*/ /*sbit DriveTensMinutes=P1^4; /* 2nd 7-segment Display*/ sbit DriveHours=P1^5; /* 3rd 7-segment Display*/ sbit DriveTensHours=P1^6; /* 4th 7-segment Display*/ unsigned char SevenSegmentData; unsigned char _crol_(unsigned char Temp,unsigned char SevenSegmentData); char Display_Buffer[2]; int Dispcount; int mscount; int Hours=0; int Minutes=0; int Seconds=0; char Temp; code unsigned char DecimalToSevenSegment[11]= { 0xEE,0x28,0xCD,0x6C,0x2B,0x67,0xE7,0x2C,0xEF,0x2F }; // Main function begins void main() { TMOD=0x01; TH0=0xF8; /* Initializing timer0 for 1ms*/ TL0=0x30; IE=0x82; TR0=1; do { sprintf(Display_Buffer,"%02d%02d",Hours,Minutes); /* converting integer into character*/ }while(1); } void Timer0(void) interrupt 1 /* ISR begins*/ { TF0=0; TR0=0; TH0=0xF8; TL0=0x30; TR0=1; { /* To transfer bits into byte from port pin onto the shift register*/ Dispcount++; /* Dispcount is used to refresh the Hours and Minutes on the LED*/ mscount++; /* Generate 1ms Delay*/ if(mscount>=1000) { mscount=0; Seconds++; if(Seconds>=60) { Seconds=0; Minutes++; if(Minutes>=60) { Minutes=0; Hours++; if(Hours>=13) { Hours=1; } } } } // For LED's { int i=0,j=1; if(Dispcount==25) /* This code is for refresh rate */ { DriveMinutes=0; DriveTensMinutes=0; DriveHours=0; DriveTensHours=0; if(Dispcount==30) { if(j<=4) { j++; SevenSegmentData=DecimalToSevenSegment[Display_Buffer[4]-'0']; { Temp=SevenSegmentData; DigitShiftregisterClockPin=1; { if(8>=i) /* For a byte to be read by the port pin*/ { i++; DigitShiftregisterSerialPin=Temp^7; DigitShiftregisterClockPin=0; /*clock is made low*/ SevenSegmentData=_crol_(Temp,1); /* bits are rotated left*/ } DigitShiftregisterLatchPin=0; /* Data is Latched*/ } } } } } if (Dispcount==50) { if(Display_Buffer[1]) { DriveTensHours=1; } if(Display_Buffer[2]) { DriveHours=1; } if(Display_Buffer[3]) { DriveTensMinutes=1; } if(Display_Buffer[4]) { DriveMinutes=1; } } } } }
TR0=1; {
what is this '{' doing? sprefluous stuff is extremely confusing
now that you finally have figured out to use pre, convert the tabs to spaces to make your code more legible
No reason to continue answering until he have made one single post showing that he is reading all we write - every new post seems to just be an attemt at fixing one single thing out of maybe 50 wrongs, and the changes seems to be trial-and-error. Change the code so it looks different and then post the changes.
Now nested statements but no sign that indentation has changed.
Still local loop variables in a block that doesn't contain a loop.
Still nested code that relies on a variable being able to store two different values at the same time.
Still out-of-bounds array accesses.
Still too small target buffers.
Still thinking that there can be magic end-of-string characters anywhere.
Still thinking that logic capable of many MHz needs 2ms delays.
Thinking C has one-based indices.
Setting a lot of select lines but not clearing the other lines at the correct place.
Still comments saying either someting meaningless or something directly wrong.
Still having the main loop busy-loop widly most of the time redoing what it has already done - but no explanation why the main loop can't emit the time.
Still a temporary variable without any explanation what it is needed for - why the other variable isn't good enough.
Still a bit rotation when the data don't need to be rotated.
Code performs xor where it should extract a single bit.
Still no code even close to have been tested - possibly sent through the compiler.
...
Exactly what does the comment "For LED's" tell a reader? That LEDs are involved? Yes, but what about them?
Everybody over here must have got the idea of what I'm tryin to do here, so can you please take out your time and write the code for me. I know how precious your time is. But I really need this project done. I will really appreciate your help. Thanx
Everybody over here must have got the idea of what I'm tryin to do here, so can you please take out your time and write the code for me
http://www.keil.com/condb/search.asp
Erik
Isn't the goal with school to learn?
Or am I wrong - maybe the goal with school is to turn in other peoples jobs as your own?
Are you a person with pride in your work, or someone who leeches others time and work? What kind of life do you want to live? Who do you want to be? Now is the time to decide if you should invest your time into programming or if you should switch to some other courses. A professional developer just can't ask someone else to do their job.
I came to that conclusion close to the start!