??? 08/06/11 08:52 Read: times |
#183227 - Driving HT16K33 using 89S52 |
Hi,
I am driving 8 seven segment display using HT16K33 (20 pin package) with 89S52 contoller. But my display not turns on.I read the datasheet & write the program according to it. Can anybody help me to find out the mistake in the code. The code is as below. /* Led display program using 16K33 (20 pin package) with 89s52 controller */ #include <c:c51incstdio.h> #include <c:c51increg52.h> #include <c:c51incintrins.h> #define uchar unsigned char #define uint unsigned int #define ulong unsigned long int #define SDA P25 #define SCL P24 uint ms10; int stop(), start(), delay(), outdata(), shout(unsigned char serialout), init_driver(); int init_driver() /*Driver initialisation program start here */ { start(); //start command to HT16K33 shout(0x00); //display data address pointer shout(0x21); //Turns on internal oscillator shout(0x81); //Display on blinking off shout(0xef); //Dimming set to 16/16 stop(); SDA = 1; SCL = 1; } int outdata() /*Driver initialisation program start here */ { start(); //start command to HT16K33 shout(0xe0); //slave address shout(0x01); //command reg address byte display address set to 0x01 shout(0x55); //data byte 4 segnent turns on & 4 turns off stop(); //stop command SDA = 1; SCL = 1; } stop() //stop subroutine for HT16K33 { SDA = 0; SCL = 1; _nop_(); SDA = 1; _nop_(); _nop_(); _nop_(); } start() //start subroutine for HT16K33 { SDA = 1; SCL = 1; _nop_(); SDA = 0; _nop_(); _nop_(); SCL = 0; _nop_(); } int shout(unsigned char serialout) //Data transfer to HT16K33 subroutine { unsigned char eepromcounter; eepromcounter = 0x08; //8 bit data transmission so counter loaded with 0x08 while(eepromcounter) //while counter does not become 0 out data to 16K33 { serialout = serialout << 1; //left shift datareg _nop_(); SDA = CY; //move carry on SDA line _nop_(); SCL = 1; //give clock pulse _nop_(); _nop_(); _nop_(); _nop_(); SCL = 0; --eepromcounter; //decrement the counter by 1 } SDA = 1; //make SDA high _nop_(); _nop_(); SCL = 1; //give clock pulse _nop_(); _nop_(); SCL = 0; } delay() //delay routine { unsigned char dly2; dly2 = 0x100; //0x20 while(dly2 != 0x00) --dly2; } void main(void) { SP = 0xa0; delay(); //give power on delay of greater than 100 ms TMOD = 0x11; //0001 0001 //both timers are initialised to 16 bit mode TR0 = 1; TR1 = 1; TH0 = 0xfc; //load timer 0 for 1 ms TL0 = 0x17; TH1 = 0xec; //load timer 1 for 5 ms TL1 = 0x78; P0 = 0xff; //make all port as output port P1 = 0xff; P2 = 0xff; P3 = 0xff; init_driver(); //call driver initialisation routine IE = 0x8a; for(;;); } timecalc() interrupt 1 using 1 { TH0 = 0xfc; TL0 = 0x17; ++ms10; if(ms10 > 1000) //1 sec timer { ms10 = 0; outdata(); //every 1 sec give o/p to HT16K33 } } time() interrupt 3 using 3 { TH1 = 0xfc; TL1 = 0x17; } |
Topic | Author | Date |
Driving HT16K33 using 89S52 | 01/01/70 00:00 | |
How to post legible source code | 01/01/70 00:00 | |
HLL Delay Routines - beware!! | 01/01/70 00:00 | |
modified code | 01/01/70 00:00 | |
How do you think that will help?? | 01/01/70 00:00 | |
some comments on code | 01/01/70 00:00 | |
testing of new code | 01/01/70 00:00 | |
HLL Delay Routines | 01/01/70 00:00 | |
one thing | 01/01/70 00:00 | |
CY in C ? _NOT_ | 01/01/70 00:00 | |
I'll use new code. | 01/01/70 00:00 | |
Getting success | 01/01/70 00:00 | |
one modification | 01/01/70 00:00 | |
For How Long? | 01/01/70 00:00 | |
No need to use that instruction | 01/01/70 00:00 | |
Start by caring about the C standard | 01/01/70 00:00 | |
Learning the 'C' programming language | 01/01/70 00:00 | |
C Language Supports No Carry Bits | 01/01/70 00:00 | |
Talking to HT16K33 | 01/01/70 00:00 |