CH422 芯片可以用于數(shù)碼管顯示驅(qū)動(dòng)或者 I/O 擴(kuò)展。CH422 內(nèi)置時(shí)鐘振蕩電路,可以動(dòng)態(tài)驅(qū)動(dòng) 4 位數(shù)碼管或者 32 只 LED 發(fā)光管;CH422 用于 I/O 擴(kuò)展時(shí),可以提供 8 個(gè)雙向輸入輸出引腳和 4 個(gè)通 用輸出引腳;CH422 通過(guò) 2 線串行接口與單片機(jī)等交換數(shù)據(jù)。
C文件
/********************************** (C) COPYRIGHT *******************************
* File Name : 422IF.C
* Author : WCH
* Version : V1.0
* Date : 2014/03/18
* Description : CH422 DEMO接口函數(shù)定義
*******************************************************************************/
/******************************************************************************/
/* 頭文件包含 */
#include 422CMD.H?>
#include
/******************************************************************************/
/*******************************************************************************
* Function Name : mInitSTDIO
* Description : 串口初始化函數(shù),用于程序調(diào)試
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void mInitSTDIO( )
{
SCON = 0x50;
PCON = 0x80;
TMOD = 0x20;
TH1 = 0xf3; //24MHz晶振, 9600bps
TR1 = 1;
TI = 1;
}
/*******************************************************************************
* Function Name : CH422_I2c_Start
* Description : 兩線模式啟動(dòng)信號(hào)
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void CH422_I2c_Start( void )
{
CH422_SDA_SET; // 發(fā)送起始條件的數(shù)據(jù)信號(hào)
CH422_SCL_SET;
DELAY_0_1US; //根據(jù)單片機(jī)可選延時(shí)
CH422_SDA_CLR; //發(fā)送起始信號(hào)
DELAY_0_1US;
CH422_SCL_CLR; //鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù)
}
/*******************************************************************************
* Function Name : CH422_I2c_Stop
* Description : 兩線模式停止信號(hào)
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void CH422_I2c_Stop( void )
{
CH422_SDA_CLR;
DELAY_0_1US; //根據(jù)單片機(jī)型號(hào)延時(shí)可選
CH422_SCL_SET;
DELAY_0_1US;
CH422_SDA_SET; // 發(fā)送I2C總線結(jié)束信號(hào)
}
/*******************************************************************************
* Function Name : CH422_I2c_WrByte
* Description : 向CH422寫(xiě)入一個(gè)字節(jié)
* Input : unsigned char dat
* Output : None
* Return : None
*******************************************************************************/
void CH422_I2c_WrByte( unsigned char dat ) // 寫(xiě)一個(gè)字節(jié)數(shù)據(jù)
{
unsigned char i;
for( i = 0; i != 8; i++ ) // MCU輸出8位數(shù)據(jù)
{
if( dat&0x80 )
{
CH422_SDA_SET;
}
else
{
CH422_SDA_CLR;
}
DELAY_0_1US;
CH422_SCL_SET;
dat <= 1;
DELAY_0_1US; // 可選延時(shí)
CH422_SCL_CLR;
}
CH422_SDA_SET; //SDA設(shè)為輸入接收ACK信號(hào)
DELAY_0_1US;
CH422_SCL_SET; // 接收應(yīng)答
DELAY_0_1US;
CH422_SCL_CLR;
}
/*******************************************************************************
* Function Name : CH422_I2c_RdByte
* Description : 從CH422讀一個(gè)字節(jié)
* Input : None
* Output : None
* Return : unsigned char dat
*******************************************************************************/
unsigned char CH422_I2c_RdByte(void)
{
unsigned char dat,i; //注意SDA設(shè)置為輸入方向接收數(shù)據(jù)
CH422_SDA_SET;
for(i = 0;i != 8;i++)
{
CH422_SCL_SET;
DELAY_0_1US;
dat <= 1;
if(CH422_SDA_IN) //讀取一位數(shù)據(jù)
{
dat++;
}
DELAY_0_1US;
CH422_SCL_CLR;
}
CH422_SDA_SET;
DELAY_0_1US;
CH422_SCL_SET;
DELAY_0_1US;
CH422_SCL_CLR;
return(dat);
}
/*******************************************************************************
* Function Name : CH422_I2c_Write
* Description : 向CH422寫(xiě)數(shù)據(jù)
* Input : unsigned short cmd
* Output : None
* Return : None
*******************************************************************************/
void CH422_I2c_Write(unsigned short cmd)
{
CH422_I2c_Start(); //發(fā)送啟動(dòng)信號(hào)
CH422_I2c_WrByte((unsigned char)(cmd?>>8)); //先發(fā)高字節(jié)
CH422_I2c_WrByte((unsigned char)cmd);
CH422_I2c_Stop(); //發(fā)送結(jié)束信號(hào)
}
/*******************************************************************************
* Function Name : CH422_I2c_Read
* Description : 從CH422讀取鍵值
* Input : None
* Output : None
* Return : unsigned char dat
*******************************************************************************/
unsigned char CH422_I2c_Read(void)
{
unsigned char dat;
CH422_I2c_Start(); //發(fā)送啟動(dòng)信號(hào)
CH422_I2c_WrByte((unsigned char)(CH422_GET_KEY>>8)); //發(fā)送取鍵值命令碼
dat = CH422_I2c_RdByte(); //接收鍵值
CH422_I2c_Stop(); //發(fā)送結(jié)束信號(hào)
return dat;
}
H文件
/********************************** (C) COPYRIGHT *******************************
* File Name : 422CMD.H
* Author : WCH
* Version : V1.0
* Date : 2014/03/18
* Description : CH422 DEMO控制命令和接口函數(shù)聲明
*******************************************************************************/
/******************************************************************************/
/* 頭文件包含 */
#include
#include
#pragma NOAREGS // 如果MCS51在中斷服務(wù)程序中調(diào)用CH422子程序或者使用鍵盤(pán)中斷功能,那么建議加入此編譯選項(xiàng)
/******************************************************************************/
/******************************************************************************/
/* 延時(shí)0.1uS子程序,與單片機(jī)速度有關(guān),對(duì)于雙向I/O可以不需要延時(shí),對(duì)于帶上拉的準(zhǔn)雙向I/O建議加上延時(shí) */
#define DELAY_0_1US {_nop_();} // MCS51>10MHz
/******************************************************************************/
/******************************************************************************/
/* 2線接口的連接,與實(shí)際電路有關(guān) */
sbit CH422_SCL=P1^0;
sbit CH422_SDA=P1^1;
sbit CH422_INT=P3^2; // 中斷輸出引腳
/******************************************************************************/
/******************************************************************************/
/* 2線接口的位操作,與單片機(jī)有關(guān) */
#define CH422_SCL_SET {CH422_SCL=1;}
#define CH422_SCL_CLR {CH422_SCL=0;}
#define CH422_SCL_D_OUT {} // 設(shè)置SCL為輸出方向,對(duì)于雙向I/O需切換為輸出
#define CH422_SDA_SET {CH422_SDA=1;}
#define CH422_SDA_CLR {CH422_SDA=0;}
#define CH422_SDA_IN (CH422_SDA)
#define CH422_SDA_D_OUT {} // 設(shè)置SDA為輸出方向,對(duì)于雙向I/O需切換為輸出
#define CH422_SDA_D_IN {CH422_SDA=1;} // 設(shè)置SDA為輸入方向,對(duì)于雙向I/O需切換為輸入
/******************************************************************************/
/******************************************************************************/
/* CH422的常用命令碼*/
#define CH422_SYSON 0x4800 //設(shè)置系統(tǒng)參數(shù)
#define CH422_IO_OE_BIT 0x0001 //IO7-IO0雙向輸入輸出引腳,位1允許輸出
#define CH422_A_SCAN_BIT 0x0004 //控制動(dòng)態(tài)掃描控制功能,為0啟用IO擴(kuò)展功能、為1數(shù)碼管動(dòng)態(tài)顯示
#define CH422_OD_EN_BIT 0x0010 //OC0-OC3輸出使能,為0推挽輸出,為1是開(kāi)漏輸出
#define CH422_SLEEP_BIT 0x0080 //低功耗睡眠控制位
#define CH422_WR_OC 0x4600 //設(shè)置通用輸出命令,需另加8位數(shù)據(jù)
#define CH422_GET_KEY 0x4f00 // 獲取按鍵,返回按鍵代碼
//加載段數(shù)據(jù)命令/設(shè)置雙向輸入輸出命令
#define CH422_DIG0 0x7000 // 數(shù)碼管位0顯示,需另加8位數(shù)據(jù)
#define CH422_DIG1 0x7200 // 數(shù)碼管位1顯示,需另加8位數(shù)據(jù)
#define CH422_DIG2 0x7400 // 數(shù)碼管位2顯示,需另加8位數(shù)據(jù)
#define CH422_DIG3 0x7600 // 數(shù)碼管位3顯示,需另加8位數(shù)據(jù)
//讀取雙向輸入輸出命令
#define CH422_RD_IO 0x4d00 //輸入字節(jié)2為雙向輸入輸出引腳IO7-IO0當(dāng)前的引腳狀態(tài)
/******************************************************************************/
/******************************************************************************/
//接口函數(shù)聲明
extern unsigned char CH422_I2c_Read(void); // 從CH422讀取按鍵代碼
extern void CH422_I2c_Write(unsigned short cmd); // 向CH422發(fā)出操作命令
extern void mInitSTDIO( ); //串口初始化函數(shù)
/******************************************************************************/
驅(qū)動(dòng)程序
/******************************************************************************/
/* 頭文件包含 */
#include
#include "422CMD.H"
/******************************************************************************/
/******************************************************************************/
/*數(shù)碼管顯示的BCD譯碼表*/
const unsigned char BCD_decode_tab[0x10] = { 0X3F, 0X06, 0X5B, 0X4F, 0X66, 0X6D, 0X7D, 0X07, 0X7F, 0X6F, 0X77, 0X7C, 0X58, 0X5E, 0X79, 0X71 };
/******************************************************************************/
/*******************************************************************************
* Function Name : mDelaymS
* Description : 延時(shí)函數(shù)
* Input : unsigned char ms
* Output : None
* Return : None
*******************************************************************************/
void mDelaymS( unsigned char ms ) // 延時(shí)毫秒
{
unsigned short i;
while ( ms -- )
{
for(i=0;i!=1000;i++);
}
}
/*******************************************************************************
* Function Name : mian
* Description : CH422功能演示,包括驅(qū)動(dòng)數(shù)碼管,睡眠等
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void main()
{
mDelaymS(60); //CH422上電復(fù)位時(shí)間
mInitSTDIO(); //初始化串口
CH422_I2c_Write(CH422_SYSON | CH422_A_SCAN_BIT | CH422_IO_OE_BIT | CH422_OD_EN_BIT);//開(kāi)顯示
CH422_I2c_Write(CH422_DIG0 | BCD_decode_tab[0]);
CH422_I2c_Write(CH422_DIG1 | BCD_decode_tab[1]);
CH422_I2c_Write(CH422_DIG2 | BCD_decode_tab[2]);
CH422_I2c_Write(CH422_DIG3 | BCD_decode_tab[3]);
while(1); //讀取鍵值
}
審核編輯:湯梓紅
-
振蕩電路
+關(guān)注
關(guān)注
17文章
502瀏覽量
98773 -
時(shí)鐘
+關(guān)注
關(guān)注
10文章
1733瀏覽量
131446 -
數(shù)碼管
+關(guān)注
關(guān)注
32文章
1882瀏覽量
91063 -
芯片驅(qū)動(dòng)
+關(guān)注
關(guān)注
0文章
12瀏覽量
14137
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論