CH452驱动4联数码管源程序
2008-03-14 18:10
/* ***********************************************************************
CH452的4线接法驱动4联共阴极LED数码管KeilC程序
Author: 王虎 2008.3.11
单片机:89S52
晶振:11.0592M
CH45X的4线接口,本电路中未接键盘扫描,接4位数码管,DOUT悬空,不含按键中断为3个I/O引脚。
****************************************************************************/
#include <regx51.h>
#include <ch452cmd.h> // CH452常量定义
#include <intrins.h>
/***********CH452与单片机接线方式************/
sbit CH452_DCLK=P1^7; // 串行数据时钟上升延激活
sbit CH452_DIN=P1^6; // 串行数据输出,接CH452的数据输入
sbit CH452_LOAD=P1^5; // 串行命令加载,上升延激活
//sbit CH452_DOUT=P3^3; // INT1,键盘中断和键值数据输入,接CH452的数据输出
/******** 4线接口的位操作,与单片机有关 *********/
#define CH452_DCLK_SET {CH452_DCLK=1;}
#define CH452_DCLK_CLR {CH452_DCLK=0;}
#define CH452_DIN_SET {CH452_DIN=1;}
#define CH452_DIN_CLR {CH452_DIN=0;}
#define CH452_LOAD_SET {CH452_LOAD=1;}
#define CH452_LOAD_CLR {CH452_LOAD=0;}
/******* 延时1uS子程序,主要用于2线接口,与单片机速度有关 ********/
//#define DELAY_1US {} // MCS51<=10MHz
#define DELAY_1US {_nop_();} // MCS51<=20MHz
//#define DELAY_1US {_nop_();_nop_();} // MCS51<=30MHz
/**************写12bit控制字函数*******************/
void CH452_Write(unsigned short cmd)
{
unsigned char i;
CH452_LOAD_CLR; //命令开始,LOAD=0
for(i=0;i!=12;i++) //送入12位数据,低位在前
{
// if (cmd&1) {CH452_DIN_SET;}
// else {CH452_DIN_CLR;} // 输出位数据
CH452_DCLK_CLR;
CH452_DIN=cmd&1;
CH452_DCLK_SET; //上升沿有效
cmd=cmd>>1;
}
CH452_LOAD_SET; //加载数据,LOAD上升沿
DELAY_1US; //命令数据加载周期不小于6US,CH451不需要该周期
DELAY_1US;
DELAY_1US;
}
/******************主函数******************************/
void main()
{
CH452_Write(CH452_RESET);
CH452_Write(CH452_BCD + 0x40); // 选择BCD译码方式,扫描极限为4个数码管
CH452_Write(CH452_SYSON1); // 开启显示
while (1)
{
CH452_Write(CH452_DIG3 | 1);
CH452_Write(CH452_DIG2 | 2);
CH452_Write(CH452_DIG1 | 3);
CH452_Write(CH452_DIG0 | 4); // 4位数码管显示字符1234
// CH452_Write(CH452_RIGHTCYC);
|