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;
Started to reformat your text, but decided there were more important things to do.
Surely, your code doesn't look like this on your editor?
What's the RETI at the end for?
It's for the return of the interrupt service routine to its address
Talking about scribbling.
Can you - without looking at the datasheets or datadeclarations of your program - tell what the following code does?
if (Dispcount == 89) { CS1 = 0; CS2 = 0; CS3 = 0; CS4 = 0; }
Will you also be able to do it six months from now?
Is there a reason why you don't believe comments belong in source code? Maybe "The code was hard to write, so it should also be hard to read"?
How much do you think it "speeds up" your debugging, to have source code without comments?
Thanks Mr.Westermark for your thoughts on my program. The thing is that I'm new to Keil C, so finding it difficult in the beginning to cope up with it. As you said, the shouldn't be used in this program? And is it that my variable minutes, seconds must have 60 counts even if i use (Minutes>=59)? I don't know how many times i can be incremented in the ISR. It must be incremented only once? if yes then where in particular in my program. and my last question, what should be Dispcount declared as?
I hope this isn't a scribbled one.
sbit PIN_P10=P1^0; /* Character to be transfered through thisbit 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*/
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 */ { TF0=0; TR0=0; TH0=0xF8; TL0=0x30; TR0=1;
{
Dispcount++; /* Dispcount is used to refresh the Hours and Minutes on the LED*/ 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 of LED1*/ { CS1=0; /* CS1, CS2, CS3, and CS4 are Rspective LED's Of HH:MM*/ CS2=0; CS3=0; CS4=0; } if(Dispcount==30) {
DataWrite=Lookup[Display_Buffer[0]-0x30];
if(8>i) /* For a byte to be read by the port pin*/ { i++; if (Dispcount==32) { Temp=DataWrite; } if (Dispcount==34) { PIN_P11=1; /* clock is set high*/ }
if (Dispcount==36) { PIN_P10=Temp^7; /* Taking MSB one at a time, the loop continous till all 8-bits are sent to the portpin*/ } if (Dispcount==38) { PIN_P11=0; /*clock is made low*/ } if (Dispcount==40) { DataWrite=_crol_(Temp,1); /* bits are rotated left*/ } PIN_P12=0; }
if(Dispcount==48) { CS1=1; /* Chip 1 is selected i.e; for tens unit of Hour*/ } }
{ 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==52) { Temp=DataWrite; } if (Dispcount==54) { 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==72) { Temp=DataWrite; } if (Dispcount==74) { 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==92) { Temp=DataWrite; } if (Dispcount==94) { 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==121) { CS1,CS2,CS3,CS4=0;
RETI;
Yes I want to learn about how to post a source code and where
is used cause I did not get a clear picture of the example given
So, this is a school assignment, then?
"The thing is that I'm new to Keil C"
But your school knows that - and they expect that, at this point in your course, you should have learned enough 'C' (most of it is not Keil-specific) to enable you to complete this task.
Perhaps it's time to review your course notes, textbook, etc...?
There is no need to "hope" - the 'Preview' button will show you!
Other than "hoping" what specific steps did you take to ensure that it's not "scribbles"?
* did you, as instructed, follow the directions on how to post source code?
* did you, as instructed, take time to carefully comment your code?
* did you, as instructed, take time to consider carefully the data types required by your variables?
* did you, as suggested, take time to consider what 'C' language construct is appropriate to testing an integer varialbe for one of a number of different values?
etc, etc,...
No. No.No.
So those are the things that you need to start doing, then!
Note that you really have 2 separate problems here:
1. How to count time in hours, minutes, and seconds (for this part, the display is irrelevant);
2. How to display stuff on a (multiplexed?) 7-Segment display (for this part, the fact that it's time is largely irrelevant).
In general, it is preferably to subdivide your software along such lines...
Very much scribbles, since you didn't surround your code with the required tags - notice that it isn't until after your code that the post switches to source-code mode. That obviously indicates that you did something wrong - and the preview should have shown you this too.
You still have off-by-one for your time counters.
And why do you still consider your clock digits as "chips" and enable them with "CS1", "CS2" etc? Don't you think it would be better to rename these variables to something meaningful?
DriveMinutes=1; DriveTenMinutes=0; DriveHours=0; DriveTenHours=0;
And you have something called "Lookup". Would it have been too easy to read the code if the array had been called written:
SevenSegmentData = DecimalToSevenSegment[Display_Buffer[2]-'0'];
Still no information if "Dispcount" is expected to turn around after full numeric range. And is "i" expected to turn around or be reset back to zero? You say "the loop continous till all 8-bits are sent" - but what loop?
And why do you still have a RETI? Don't you think the _compiler_ will manage to insert a RETI instruction when you declare a function with the "interrupt" keyword?
You have code like:
void Timer0(void) interrupt 1 /* ISR */ { TF0=0; TR0=0; TH0=0xF8; TL0=0x30; TR0=1; { Dispcount++; /* Dispcount is used to refresh the Hours and Minutes on the LED*/ if(++mscount>=1000) { mscount=0; Seconds++; } if(++Seconds>=59) { <== should update every ms? Seconds=0; Minutes++; } if(++Minutes>=59) { <== should update every ms? Minutes=0; Hours++; } if(++Hours>=12) { <== should update every ms? Hours=1; } } // The following state machine intended to // start every ms even if you don't have had // a toggled second? On the other hand, you // tick your "Second" every ms so... { if(Dispcount==29) { /* This code is for refresh rate of LED1*/ CS1=0; /* CS1, CS2, CS3, and CS4 are Rspective LED's Of HH:MM*/ CS2=0; CS3=0; CS4=0; } if(Dispcount==30) { DataWrite=Lookup[Display_Buffer[0]-0x30]; } if(8>i) { /* For a byte to be read by the port pin*/ How do you synchronize your "Dispcount" statemachine with your "i" statemachine? i++; if (Dispcount==32) { Temp=DataWrite; } if (Dispcount==34) { PIN_P11=1; /* clock is set high*/ } if (Dispcount==36) { PIN_P10=Temp^7; /* Taking MSB one at a time, the loop continous till all 8-bits are sent to the portpin*/ } if (Dispcount==38) { PIN_P11=0; /*clock is made low*/ } if (Dispcount==40) { DataWrite=_crol_(Temp,1); /* bits are rotated left*/ } PIN_P12=0; } if(Dispcount==48) { CS1=1; /* Chip 1 is selected i.e; for tens unit of Hour*/ } } // Do you have any special reason for your extra // statement blocks introduced here and there? // If you have - why not a software comment? { if(Dispcount==49) { CS1=0; CS2=0; CS3=0; CS4=0; } if(Dispcount==50) { DataWrite=Lookup[Display_Buffer[1]-0x30]; } // Do you have any special reason for your extra // statement blocks introduced here and there? // If you have - why not a software comment? { if(8>i) { i++; if (Dispcount==52) { Temp=DataWrite; } if (Dispcount==54) { 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; } } // Do you have any special reason for your extra // statement blocks introduced here and there? // If you have - why not a software comment? { if(Dispcount==69) { CS1=0; CS2=0; CS3=0; CS4=0; } if(Dispcount==70) { DataWrite=Lookup[Display_Buffer[2]-0x30]; } // Do you have any special reason for your extra // statement blocks introduced here and there? // If you have - why not a software comment? { if(8>i) { i++; if (Dispcount==72) { Temp=DataWrite; } if (Dispcount==74) { 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; } } // Do you have any special reason for your extra // statement blocks introduced here and there? // If you have - why not a software comment? { if(Dispcount==89) { CS1=0; CS2=0; CS3=0; CS4=0; } if(Dispcount==90) { DataWrite=Lookup[Display_Buffer[3]-0x30]; } // Do you have any special reason for your extra // statement blocks introduced here and there? // If you have - why not a software comment? { if(8>i) { i++; if (Dispcount==92) { Temp=DataWrite; } if (Dispcount==94) { 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==121) { CS1,CS2,CS3,CS4=0; } }
Do you really have such scribbles in your own editor that you are unable to keep track of nesting of statements? Wait - don't answer that one...
And why do you repost your code with the same errors you have already been informed about?
I'm developing the clock using At89C2051, 74LS595 shift register and a ULN2803 driver. I'm taking a byte from a port pin of 2051 and transferring it on the shift register, so whenever a chip is selected the data in the shift register is passed to the ULN driver which inturn is displayed on the LED.
Have you considered how fast a shift register is compared to the instruction sequencing of your processor? Have you introduced huge capacitances on the signals, or why do you assume that you need a huge state machine for slowing down the output of the bits to the shift register?
What is the fastest frequency the shift register can shift? What is the fastest speed your processor can tggle a processor pin? What is your conclusion from these times?
sbit PIN_P10=P1^0; /* Character to be transfered through thisbit in parallel*/ sbit PIN_P11=P1^1; /* Clock*/ sbit PIN_P12=P1^2; /* Latch*/ sbit DriveMinutes=P1^3; /* 1st 7-segment Display*/ sbit DriveTenMinutes=P1^4; /* 2nd 7-segment Display*/ sbit DriveHours=P1^5; /* 3rd 7-segment Display*/ sbit DriveTenHours=P1^6; /* 4th 7-segment Display*/
unsigned char SevenSegmentData; unsigned char _crol_(unsigned char Temp,unsigned char SevenSegmentData); char Display_Buffer[6]; unsigned char Dispcount; unsigned char mscount;
code unsigned char DecimalToSevenSegment[11]= { 0xEE,0x28,0xCD,0x6C,0x2B,0x67,0xE7,0x2C,0xEF,0x2F };
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; { i++; Dispcount++; /* Dispcount is used to refresh the Hours and Minutes on the LED*/ mscount++; if(++mscount>=1000) { mscount=0; Seconds++; } if(++Seconds>=59) { Seconds=0; Minutes++; Seconds++; } if(++Minutes>=59) { Minutes=0; Hours++; Seconds++; Minutes++; } if(++Hours>=12) { Hours=1; Seconds++; Minutes++; Hours++; } } // For DriveHours LED { if(Dispcount==29) /* This code is for refresh rate of LED1*/ { DriveMinutes=0; DriveTenMinutes=0; DriveHours=0; DriveTenHours=0; } if(Dispcount==30) { SevenSegmentData=DecimalToSevenSegment[Display_Buffer[0]-0x30]; } if(8>++i) /* For a byte to be read by the port pin*/ { if (Dispcount==32) { Temp=SevenSegmentData; } if (Dispcount==34) { PIN_P11=1; /* clock is set high*/ } if (Dispcount==36) { PIN_P10=Temp^7; /* Taking MSB one at a time, the loop continous till all 8-bits are sent to the portpin*/ } if (Dispcount==38) { PIN_P11=0; /*clock is made low*/ } if (Dispcount==40) { SevenSegmentData=_crol_(Temp,1); /* bits are rotated left*/ } PIN_P12=0; } if(Dispcount==48) { DriveTenHours=1; } }
I've posted the new code of only one LED now. But I stil don't know whtat to declare for Dispcount, since it keeps on incrementin for 1ms. Dispcount is used for refresh rate
That is an absolutely basic, first step in 'C' programming - nothing specifially to do with Keil. (in fact, it's not even specific to 'C' - the same would apply in any other programming language with "typed" variables)
You really need to go back and review the notes from your first few 'C' classes. (and/or the early chapters of your 'C' textbook)
If you're still stuck, you really need to discuss this with your tutors - since the assignment clearly assumes that you had nailed this issue a long time ago!
View all questions in Keil forum