| ??? 08/12/11 14:33 Read: times | #183335 - Getting success Responding to: ???'s previous message | 
| Hi,
 Finally I get success of driving HT16K33 Ic with 89C52. Thanks to Stefan for your suggessions. Without it,it will take more time to develop this code for me. You can see in the code given below how I use those instructions. Please note that this IC is only for COMMON CATHODE type display. This is for Byte writing type.Now I will work on page writing type. Need not say your suggessions are always welcomes. Thanks 
/*
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 SDA     P25
#define SCL     P24
uint    ms10;
uchar   serialout,
        serialout1,
        eepromcounter,
        eaddr;
        
int     stop(),
        start(),        
        outdata(),
        shout(),
        init_driver();
void singecommandshout();
init_driver()            /*Driver initialisation program start here */
{
serialout1 = 0x21;
singecommandshout();        //Turns on internal oscillator  0x21
serialout1 = 0xa2;
singecommandshout();        //ROW/INT Set Reg.
                            //Last time I missed this instruction in initialisation
serialout1 = 0x81;
singecommandshout();        //Display on blinking off       0x81
}
void singecommandshout()
{
start();
serialout = 0xe0;
shout();
serialout = serialout1;
shout();
stop();                                                        
}
int outdata()           /*Driver initialisation program start here */
{
start();                //start command to HT16K33
serialout = 0xe0;       //HT16K33 Selection addr
shout();            
serialout = eaddr;      //display address to where you want to write
shout();                //This addr ranging from 0x00 to 0x0e
                        //Note that only EVEN no. address is valid
serialout = tmp2;       //data to write
shout();            
stop();
}
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()      //Data transfer to HT16K33 subroutine
{
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;
        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;
}
void main(void)
{
SP = 0xa0;
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;
eaddr = 0;
P37 = 0;                        //buzzer o/p line not the part of this display program
init_driver();                  //call driver initialisation routine
IE = 0x8a;
for(;;);
}
timecalc() interrupt 1 using 1
{
TH0 = 0xfc;
TL0 = 0x17;
if(eaddr == 0)
        tmp2 = 0x30;    //code for 1
if(eaddr == 0x02)
        tmp2 = 0x6d;    //code for 2
if(eaddr == 0x04)
        tmp2 = 0x75;    //code for 3
if(eaddr == 0x06)
        tmp2 = 0x36;    //code for 4
if(eaddr == 0x08)
        tmp2 = 0x57;    //code for 5
if(eaddr == 0x0a)
        tmp2 = 0x5f;    //code for 6
if(eaddr == 0x0c)
        tmp2 = 0x70;    //code for 7
if(eaddr == 0x0e)
        tmp2 = 0x7f;    //code for 8
outdata();
eaddr = eaddr + 2;
if(eaddr > 15)                
        eaddr = 0;        
}
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 | 



