CH452是数码管显示驱动和键盘扫描控制芯片。
51单片机外围扩展CH452驱动位数码管动态显示如下电路图,主要器件为单片机,显示驱动芯片CH452,8个LED数码管。
基于CH452的数码显示电路驱动及显示部分
程序流程图
程序
*******************************************************************************
程序功能为51单片机通过三线串口操作CH452,CH452驱动8位数码管正常显示以及显示数据的更新。51单片机通过模拟CH452串口操作时序向CH452发送12位的标准格式数据,CH452根据接收到的12位数据执行相应功能操作以及数据更新。
*******************************************************************************
#define uchar unsigned char
#define uint unsigned int
sbit DIN=P0^0; //数据线
sbit CLK= P0^1; //时钟信号线
sbit LOAD= P02^2; //数据加载控制线
uchar subf[8]= {0x80, 0x80, 0x80, 0x80, 0x88, 0x88, 0x88, 0x88}; //显示数字缓冲区
//初始化数据定义区
#define start0 0x02;
#define start1 0x01;
#define sysper0 0x04;
#define sysper1 0x01;
#define dspper0 0x05;
#define dspper1 0x08;
#define ficntr0 0x06;
#define ficntr1 0x0f;
void delay(uint t) //延时函数,
{
uint i;
while(t--)
{
for (i=0;i<125;i++) /* 对于12M时钟,约延时1ms */
{}
}
}
/* 主函数 */
void main(void)
{
SP=0x70;
EA=0
start()
display()
while(1)
{
delay(1000);
send12bit(0x03,0x03); //显示数据右循环
delay(10000);
send12bit(0x01,0x03); //显示数据左循环
delay(10000);
send12bit(0x02,0x03); //显示数据右移,空余位显“0”
delay(10000)
send12bit(0x00,0x03); //显示数据左移,空余位显“0”
delay(10000);
newnum(); //数据更新
display(); //显示更新后的数据
delay(10000); //延时10s
}
}
//发送一个字节数据到CH452
void sendcode(uchar data)
uchar i, code
_nop_( );
for (i=0; i<8; i++) //发送8个数据位
{
code=data&0x80;
data=data>>1;
if(code!=0) //待发送数据为1
{
DIN=1; //数据线为1
CLK=0; //时钟正脉冲
CLK=1;
}
else
{
DIN=0; //数据线为0
CLK=0; //时钟正脉冲
CLK=1;
}
}
}
//发送字节低4位到CH452子程序
void sen4bit (uchar data)
{
uchar i, code
_nop_( );
for (i=0; i<4; i++) //发送4个数据位
{
code=data&0x80;
data=data>>1;
if(code!=0) //待发送数据为1
{
DIN=1; //数据线为1
CLK=0; //时钟正脉冲
CLK=1;
}
else
{
DIN=0; //数据线为0
CLK=0; //时钟正脉冲
CLK=1;
}
}
}
//向CH452发送12位数据函数
void send12bit(uchar addr, uchar num )
{
LOAD=0; //数据传输开始
_nop_( );
sendcode(num); //发送数据
_nop_( );
send4bit(addr); //发送寄存器4位地址
_nop_( );
LOAD=1 //数据加载
}
//CH452初始化子程序
void start(void)
{
send12bit(start0,start1);
send12bit(sysper0,sysper1);
send12bit(dspper0,dspper1);
send12bit(ficntr0,ficntr1);
}
//CH452数据寄存器更新子程序,即待显示数据缓冲区更新
void newnum(void)
{
for(i=0; i<8; i++) 8次更新
{
subf=I //8个数据缓冲单元按顺序更新为01234567
}
}
//数据更新显示子程序
void display(void)
{
uchar addr
addr=0x08 //8位数据寄存器地址从08开始
for(i=0; i<8; i++) //8次数据更新
{
send12bit(addr,subf) //更新1位数据寄存器内容
addr=addr+1 //数据寄存器指向下一个
} |