[求助]高手们帮忙看下小程序为什么不能正常工作

  这是用一个430F147控制一个CH451驱动5个数码管显示的程序.看DIN和DCLK波形是对的,但是不管我输入多少都是经常显示"8.8.8.8.8"或者其他乱码,而且闪烁得厉害,调试了很长时间都没有效果   大侠们帮帮忙,不尽感激! 下面是程序:

#include #define ch451_RESET 0x0201 //复位 #define ch451_LEFTMOV 0x0300 //设置移动方式-作移 #define ch451_LEFTCYC 0x0301 //设置移动方式-左循 #define ch451_RIGHTMOV 0x0302 //设置移动方式-右移 #define ch451_RIGHTCYC 0x0303 //设置移动方式-右循 #define ch451_SYSOFF 0x0400 //关显示、键盘、看门狗 #define ch451_SYSON1 0x0401 //开显示 #define ch451_SYSON2 0x0403 //开显示、键盘 #define ch451_SYSON3 0x0407 //开显示、键盘、看门狗功能 #define ch451_DSP 0x0500 //设置默认显示方式 #define ch451_BCD 0x0580 //设置BCD译码方式 #define ch451_TWINKLE 0x0600 //设置闪烁控制 #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_din=P4^0; // 串行数据输出,接CH451的数据输入 // sbit ch451_dclk=P4^1; //串行数据时钟上升延激活 // sbit ch451_load=P4^3; //串行命令加载,上升延激活 //****************************************** void ch451_init() { WDTCTL=WDTPW+WDTHOLD;//stop WDT P4DIR=0xff;//P4口设为输出 P4OUT=0xff;//P4输出为高电平 P4OUT&=0xfe;//0--->p4.0 P4OUT|=0x01;//1--->p4.0,DIN输出低电平脉冲(拉低拉高) } //***************************************** void ch451_write(unsigned int command) { unsigned int i; P4OUT&=0xf7;//load1=0 for(i=0x001;i<=0x800;i=i<<1) { if(command&i) P4OUT|=0x01; else P4OUT&=0xfe; P4OUT&=0xfd; P4OUT|=0x02;//时钟拉高拉低 } P4OUT|=0x08;//load1=1 } void main() { ch451_init(); while(1) { ch451_write(0x401);//设定系统参数,只启动显示扫描驱动功能 ch451_write(0x5d3);//设定显示参数,译码方式、扫描极限为5,占空比为3 ch451_write(ch451_DIG0|0x81);//DIG0显示1. for(int i=0;i<100;i++);//延时 ch451_write(ch451_DIG1|0x82);//DIG1显示2. for(int i=0;i<100;i++); ch451_write(ch451_DIG2|0x83);//DIG2显示3. for(int i=0;i<100;i++); ch451_write(ch451_DIG3|0x84);//DIG3显示4. for(int i=0;i<100;i++); ch451_write(ch451_DIG4|0x85);//DIG4显示5. for(int i=0;i<100;i++); } }

void ch451_write(unsigned int command) { unsigned int i; P4OUT&=0xf7;//load1=0 delay2us(); for(i=0x001;i<=0x800;i=i<<1) { if(command&i) P4OUT|=0x01; else P4OUT&=0xfe; delay2us(); P4OUT&=0xfd; delay2us(); P4OUT|=0x02;//时钟拉高拉低 } delay2us(); P4OUT|=0x08;//load1=1 } 加点延时试试看。


谢谢! 试过加长延时 但只能让数码管不闪烁,显示还是不对


451的GND脚多并接几根线到地试试看呢。


只有登录才能回复,可以选择微信账号登录