The code provided by the manufacturer are as follow:
CH455I2C.c
/* ***************************
Website: http://wch.cn
Email: tech@wch.cn
Author: W.ch 2008.7
* ****************************/
#include "CH455I2C.H" // Ð޸ĸÃÎļþÒÔÊÊÓ¦Ó²¼þ»·¾³/µ¥Æ¬»úÐͺŵÈ
#include <reg52.H>
#include <INTRINS.h>
void CH455_I2c_Start( void ) // ²Ù×÷Æðʼ
{
DISABLE_KEY_INTERRUPT; //½ûÖ¹¼üÅÌÖжÏ,·ÀÖ¹¿ªÊ¼Ê±±»CH455Öж϶ø½øÈëÖжϷþÎñ³ÌÐòÖеÄSTART
CH455_SDA_SET; /*·¢ËÍÆðʼÌõ¼þµÄÊý¾ÝÐźÅ*/
CH455_SDA_D_OUT; /* ÉèÖÃSDAΪÊä³ö·½Ïò */
CH455_SCL_SET;
CH455_SCL_D_OUT; /* ÉèÖÃSCLΪÊä³ö·½Ïò */
DELAY;
CH455_SDA_CLR; /*·¢ËÍÆðʼÐźÅ*/
DELAY;
CH455_SCL_CLR; /*ǯסI2C×ÜÏߣ¬×¼±¸·¢ËÍ»ò½ÓÊÕÊý¾Ý */
}
void CH455_I2c_Stop( void ) // ²Ù×÷½áÊø
{
CH455_SDA_CLR;
CH455_SDA_D_OUT; /* ÉèÖÃSDAΪÊä³ö·½Ïò */
DELAY;
CH455_SCL_SET;
DELAY;
CH455_SDA_SET; /*·¢ËÍI2C×ÜÏß½áÊøÐźÅ*/
DELAY;
CH455_SDA_D_IN; /* ÉèÖÃSDAΪÊäÈë·½Ïò */
ENABLE_KEY_INTERRUPT;
}
void CH455_I2c_WrByte( UINT8 dat ) //дһ¸ö×Ö½ÚÊý¾Ý
{
UINT8 i;
CH455_SDA_D_OUT; /* ÉèÖÃSDAΪÊä³ö·½Ïò */
for( i = 0; i != 8; i++ ) // Êä³ö8λÊý¾Ý
{
if( dat & 0x80 )
{
CH455_SDA_SET;
}
else
{
CH455_SDA_CLR;
}
DELAY;
CH455_SCL_SET;
dat <<= 1;
DELAY; // ¿ÉÑ¡ÑÓʱ
CH455_SCL_CLR;
}
CH455_SDA_D_IN; /* ÉèÖÃSDAΪÊäÈë·½Ïò */
CH455_SDA_SET;
DELAY;
CH455_SCL_SET; // ½ÓÊÕÓ¦´ð
DELAY;
CH455_SCL_CLR;
}
UINT8 CH455_I2c_RdByte( void ) //¶ÁÒ»¸ö×Ö½ÚÊý¾Ý
{
UINT8 dat,i;
CH455_SDA_SET;
CH455_SDA_D_IN; /* ÉèÖÃSDAΪÊäÈë·½Ïò */
dat = 0;
for( i = 0; i != 8; i++ ) // ÊäÈë8λÊý¾Ý
{
DELAY; // ¿ÉÑ¡ÑÓʱ
CH455_SCL_SET;
DELAY; // ¿ÉÑ¡ÑÓʱ
dat <<= 1;
if( CH455_SDA_IN ) dat++; // ÊäÈë1λ
CH455_SCL_CLR;
}
CH455_SDA_SET;
DELAY;
CH455_SCL_SET; // ·¢³öÎÞЧӦ´ð
DELAY;
CH455_SCL_CLR;
return dat;
}
void CH455_Write( UINT16 cmd ) //дÃüÁî
{
CH455_I2c_Start(); //Æô¶¯×ÜÏß
CH455_I2c_WrByte(((UINT8)(cmd>>7)&CH455_I2C_MASK)|CH455_I2C_ADDR);
CH455_I2c_WrByte((UINT8)cmd); //·¢ËÍÊý¾Ý
CH455_I2c_Stop(); //½áÊø×ÜÏß
}
UINT8 CH455_Read( void ) //¶ÁÈ¡°´¼ü
{
UINT8 keycode;
CH455_I2c_Start(); //Æô¶¯×ÜÏß
CH455_I2c_WrByte((UINT8)(CH455_GET_KEY>>7)&CH455_I2C_MASK|0x01|CH455_I2C_ADDR);
keycode=CH455_I2c_RdByte(); //¶ÁÈ¡Êý¾Ý
CH455_I2c_Stop(); //½áÊø×ÜÏß
return keycode;
}
CH455.h
// Ó²¼þÏà¹Ø¶¨Òå, Çë¸ù¾Ýʵ¼ÊÓ²¼þÐ޸ı¾Îļþ
#include <reg52.h>
#pragma NOAREGS // Èç¹ûMCS51ÔÚÖжϷþÎñ³ÌÐòÖе÷ÓÃCH455×Ó³ÌÐò»òÕßʹÓüüÅÌÖжϹ¦ÄÜ£¬ÄÇô½¨Òé¼ÓÈë´Ë±àÒëÑ¡Ïî
#define DELAY { _nop_();_nop_();_nop_();_nop_(); }
typedef unsigned char UINT8;
typedef unsigned short UINT16;
/* 2Ïß½Ó¿ÚµÄÁ¬½Ó,Óëʵ¼Êµç·ÓÐ¹Ø */
sbit CH455_SCL = P1^7;
sbit CH455_SDA = P1^6;
sbit CH455_INT = P3^3; // ±ê×¼µÄ2Ïß½Ó¿ÚʹÓøÃÒý½ÅÊä³öÖжÏ
/* 2Ïß½Ó¿ÚµÄλ²Ù×÷,Ó뵥Ƭ»úÓÐ¹Ø */
#define CH455_SCL_SET {CH455_SCL=1;}
#define CH455_SCL_CLR {CH455_SCL=0;}
#define CH455_SCL_D_OUT {} // ÉèÖÃSCLΪÊä³ö·½Ïò,¶ÔÓÚË«ÏòI/OÐèÇл»ÎªÊä³ö
#define CH455_SDA_SET {CH455_SDA=1;}
#define CH455_SDA_CLR {CH455_SDA=0;}
#define CH455_SDA_IN (CH455_SDA)
#define CH455_SDA_D_OUT {} // ÉèÖÃSDAΪÊä³ö·½Ïò,¶ÔÓÚË«ÏòI/OÐèÇл»ÎªÊä³ö
#define CH455_SDA_D_IN {CH455_SDA=1;} // ÉèÖÃSDAΪÊäÈë·½Ïò,¶ÔÓÚË«ÏòI/OÐèÇл»ÎªÊäÈë
/* Ó뵥Ƭ»úÓйØ,ÓëÖжÏÁ¬½Ó·½Ê½ÓÐ¹Ø */
#define USE_CH455_KEY 1 // ʹÓÃÁËCH455µÄ°´¼üÖжÏ
#ifdef USE_CH455_KEY
#define DISABLE_KEY_INTERRUPT {EX1=0;}
#define ENABLE_KEY_INTERRUPT {EX1=1;}
#define CLEAR_KEY_INTER_FLAG {IE1=0;}
#else
#define DISABLE_KEY_INTERRUPT {}
#define ENABLE_KEY_INTERRUPT {}
#define CLEAR_KEY_INTER_FLAG {}
#endif
/* ********************************************************************************************* */
// ÉèÖÃϵͳ²ÎÊýÃüÁî
#define CH455_BIT_ENABLE 0x01 // ¿ªÆô/¹Ø±Õλ
#define CH455_BIT_SLEEP 0x04 // ˯Ãß¿ØÖÆλ
#define CH455_BIT_7SEG 0x08 // 7¶Î¿ØÖÆλ
#define CH455_BIT_INTENS1 0x10 // 1¼¶ÁÁ¶È
#define CH455_BIT_INTENS2 0x20 // 2¼¶ÁÁ¶È
#define CH455_BIT_INTENS3 0x30 // 3¼¶ÁÁ¶È
#define CH455_BIT_INTENS4 0x40 // 4¼¶ÁÁ¶È
#define CH455_BIT_INTENS5 0x50 // 5¼¶ÁÁ¶È
#define CH455_BIT_INTENS6 0x60 // 6¼¶ÁÁ¶È
#define CH455_BIT_INTENS7 0x70 // 7¼¶ÁÁ¶È
#define CH455_BIT_INTENS8 0x00 // 8¼¶ÁÁ¶È
#define CH455_SYSOFF 0x0400 // ¹Ø±ÕÏÔʾ¡¢¹Ø±Õ¼üÅÌ
#define CH455_SYSON ( CH455_SYSOFF | CH455_BIT_ENABLE ) // ¿ªÆôÏÔʾ¡¢¼üÅÌ
#define CH455_SLEEPOFF CH455_SYSOFF // ¹Ø±Õ˯Ãß
#define CH455_SLEEPON ( CH455_SYSOFF | CH455_BIT_SLEEP ) // ¿ªÆô˯Ãß
#define CH455_7SEG_ON ( CH455_SYSON | CH455_BIT_7SEG ) // ¿ªÆôÆ߶Îģʽ
#define CH455_8SEG_ON ( CH455_SYSON | 0x00 ) // ¿ªÆô°Ë¶Îģʽ
#define CH455_SYSON_4 ( CH455_SYSON | CH455_BIT_INTENS4 ) // ¿ªÆôÏÔʾ¡¢¼üÅÌ¡¢4¼¶ÁÁ¶È
#define CH455_SYSON_8 ( CH455_SYSON | CH455_BIT_INTENS8 ) // ¿ªÆôÏÔʾ¡¢¼üÅÌ¡¢8¼¶ÁÁ¶È
// ¼ÓÔØ×ÖÊý¾ÝÃüÁî
#define CH455_DIG0 0x1400 // ÊýÂë¹Üλ0ÏÔʾ,ÐèÁí¼Ó8λÊý¾Ý
#define CH455_DIG1 0x1500 // ÊýÂë¹Üλ1ÏÔʾ,ÐèÁí¼Ó8λÊý¾Ý
#define CH455_DIG2 0x1600 // ÊýÂë¹Üλ2ÏÔʾ,ÐèÁí¼Ó8λÊý¾Ý
#define CH455_DIG3 0x1700 // ÊýÂë¹Üλ3ÏÔʾ,ÐèÁí¼Ó8λÊý¾Ý
// ¶ÁÈ¡°´¼ü´úÂëÃüÁî
#define CH455_GET_KEY 0x0700 // »ñÈ¡°´¼ü,·µ»Ø°´¼ü´úÂë
// CH455½Ó¿Ú¶¨Òå
#define CH455_I2C_ADDR 0x40 // CH455µÄµØÖ·
#define CH455_I2C_MASK 0x3E // CH455µÄ¸ß×Ö½ÚÃüÁîÑÚÂë
// ¶ÔÍâ×Ó³ÌÐò
extern UINT8 CH455_Read( void ); // ´ÓCH455¶ÁÈ¡°´¼ü´úÂë
extern void CH455_Write( UINT16 cmd ); // ÏòCH455·¢³ö²Ù×÷ÃüÁî
Main.C
/* ***************************
Website: http://wch.cn
Email: tech@wch.cn
Author: W.ch 2008.7
* ****************************/
#include <reg52.h>
#include "CH455I2C.H" // Ð޸ĸÃÎļþÒÔÊÊÓ¦Ó²¼þ»·¾³/µ¥Æ¬»úÐͺŵÈ
UINT8 ch455_key;//CH455µÄ°´¼ü¼üÖµ
const UINT8 BCD_decode_tab[0x10] = { 0X3F, 0X06, 0X5B, 0X4F, 0X66, 0X6D, 0X7D, 0X07, 0X7F, 0X6F,
0X77, 0X7C, 0X58, 0X5E, 0X79, 0X71 };//BCD
void mDelaymS( UINT8 ms )// ÑÓʱºÁÃë
{
UINT16 i;
while ( ms -- )
{
for( i = 0; i != 1000; i++ );
}
}
void init_CH455( void ) //³õʼ»¯CH455
{
#ifdef USE_CH455_KEY
IE1=0;
EX1=1;
EA=1;
#endif
}
void int1( void ) interrupt 2 using 1 // INT0ÖжϷþÎñ³ÌÐò
{
ch455_key = CH455_Read();
}
void main( void )//Ö÷³ÌÐò
{
UINT8 i;
UINT8 showH[2],showL[2];
mDelaymS( 40 );
init_CH455();//³õʼ»¯
CH455_Write( CH455_SYSON );// ¿ªÆôÏÔʾºÍ¼üÅÌ£¬8¶ÎÏÔʾ·½Ê½
//·¢ÏÔʾÊý¾Ý
CH455_Write( CH455_DIG0 | BCD_decode_tab[0] );
CH455_Write( CH455_DIG1 | BCD_decode_tab[1] );
CH455_Write( CH455_DIG2 | BCD_decode_tab[2] );
CH455_Write( CH455_DIG3 | BCD_decode_tab[3] );
//ÁÁ¶È±ä»¯
for( i = 1; i < 8; i++ )
{
mDelaymS( 50 );
CH455_Write( CH455_SYSON | i<<4 ); // 1-7¼¶ÁÁ¶ÈÏÔʾ
}
mDelaymS( 50 );
CH455_Write( CH455_SYSON_8 ); // 8¼¶ÁÁ¶ÈÏÔʾ
//4λÊýÂë¹ÜÈ«²¿ÏÔʾ0
showL[0] = BCD_decode_tab[0];
showH[0] = BCD_decode_tab[0];
showL[1] = BCD_decode_tab[0];
showH[1] = BCD_decode_tab[0];
CH455_Write( CH455_DIG3 | showL[0] );
CH455_Write( CH455_DIG2 | showH[0] );
CH455_Write( CH455_DIG1 | showL[1] );
CH455_Write( CH455_DIG0 | showH[1] );
while(1)
{
#ifdef USE_CH455_KEY
ch455_key = 0xff;
while( ch455_key == 0xff );
i = ch455_key & 0x3f;//°´¼üÖµ
//ÊýÂë¹ÜÏÔʾ֮¼äµÄÒÆλ²Ù×÷
showH[1] = showH[0];
showL[1] = showL[0];
showH[0] = BCD_decode_tab[i/10];
showL[0] = BCD_decode_tab[i%10];
CH455_Write( CH455_DIG3 | showL[0] );
CH455_Write( CH455_DIG2 | showH[0] );
CH455_Write( CH455_DIG1 | showL[1] );
CH455_Write( CH455_DIG0 | showH[1] );
//Åжϰ´¼üÓÐûÓÐÊÍ·Å
while(1)
{
i = CH455_Read( );//¶Á°´¼üÊýÖµ
if( i & 0x40 )//°´¼ü°´ÏÂûÓÐÊÍ·Å
{
//ÉÁ˸
CH455_Write( CH455_DIG3 );
CH455_Write( CH455_DIG2 );
mDelaymS(50);
CH455_Write( CH455_DIG3 | showL[0] );
CH455_Write( CH455_DIG2 | showH[0] );
mDelaymS(50);
}
else//°´¼üÒѾÊÍ·Å
{
break;
}
}
#endif
}
}
but still i didnt get it. i am newbie so i cannot upload file now thats why i have pasted code here .