CH451驱动8个数码管,只能显示8个一样的怎么回事啊?
[ 本帖最后由 Doci 于 2014-9-19 11:15 编辑 ]\n\n[ 本帖最后由 Doci 于 2014-9-19 11:05 编辑 ]\n\nCH451驱动8个数码管,只能显示8个一样的怎么回事啊?显示01234567时不正确,数码管段全亮,还不均匀。电路图没有什么就是 451的段驱动按顺序接的数码管的段,位选按顺序接的各个数码管的公共极
见下面while(1)。
#include<reg52.h>
#define uhar unsigned char
#define uint unsigned int
#define CH451_DIG0 0x0800 //数码管位0显示
#define CH451_DIG1 0x0900 //数码管位1显示
#define CH451_DIG2 0x0a00 //数码管位2显示
#define CH451_DIG3 0x0b00 //数码管位3显示
#define CH451_DIG4 0x0c00 //数码管位4显示
#define CH451_DIG5 0x0d00 //数码管位5显示
#define CH451_DIG6 0x0e00 //数码管位6显示
#define CH451_DIG7 0x0f00 //数码管位7显示
sbit ch451_load=P1^5;
sbit ch451_din=P1^6;
sbit ch451_dclk=P1^7;
sbit ch451_dout=P3^3;
unsigned char code NUMTAB={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
unsigned int code CH451_DIG={0x0800,0x0900,0x0A00,0x0B00,0x0C00,0x0D00,0x0E00,0x0F00};
void led_shift();
void delay(uint z);
/********************************************************************
函 数 名:ch451_init()
功 能:对ch451芯片进行初始化
********************************************************************/
void ch451_init()
{
ch451_din=0; //先低后高,选择4线输入
ch451_din=1;
ch451_load=1;
ch451_dclk=1;
}
/********************************************************************
函 数 名:ch451_write()
功 能:把12位的指令或数据写入ch451
说 明:12位数据或指令的写入顺序是低位
********************************************************************/
void ch451_write(uint command)
{
unsigned char i;
ch451_load=0; //命令开始
for(i=0;i<12;i++)
{ //送入12位数据,低位在前
ch451_din=command&1;
ch451_dclk=0;
command>>=1;
ch451_dclk=1; //上升沿有效
}
ch451_load=1; //加载数据
}
void main()
{
unsigned char i,j;
ch451_init();
ch451_write(0x201);
ch451_write(0x403);
ch451_write(0x500);
while(1)
{
for(j=0;j<16;j++)
{
for(i=0;i<8;i++)
{
ch451_write(CH451_DIG|NUMTAB);//此处NUMTAB改为NUMTAB就显示不对了//////////////////////////////////////////
}
delay(920);
}
}
}
/********************************************************************
? ? ?:delay()
? ?:?????
********************************************************************/
void delay(uint z)
{
uint x,y;
for(x=100;x>0;x--)
for(y=z;y>0;y--);
}
已找到问题。焊板子的把数码管焊错了! 要动态扫,改变位选 建议楼主先把原图发上来 动图,位选,看原理图才知道程序 别听2楼忽悠,这是驱动数码管的芯片,不需要单片机动态扫描,只要送显示数据就可以了,
目测程序不完整,ch451_write(CH451_DIG|NUMTAB);这样也能编译通过?NUMTAB[]内容呢? little_Monkey 发表于 2014-9-19 10:56
别听2楼忽悠,这是驱动数码管的芯片,不需要单片机动态扫描,只要送显示数据就可以了,
目测程序不完整,ch ...
不好意思拷错了 本帖最后由 Doci 于 2014-9-19 11:14 编辑
haibaogk 发表于 2014-9-19 10:52
动图,位选,看原理图才知道程序
电路图没有什么就是 451的段驱动按顺序接的数码管的短,位选按顺序接的各个数码管的公共极
晕!他们焊板子的把数码管焊错了! 跟max7219差不多吧,设置好寄存器直接送需要显示的位跟数据就行了吧 手底下最好备个万用表 这个网上程序蛮多的吧,看看别人原理图如何,程序怎么写
页:
[1]