ch451不能显示第几位,也就是常说的数码管位选线不能选到。比如我只想选最后一位——第七位数码管亮 ,其他的数码管都是熄灭状态。找不到相应的操作命令,显示参数的设定只能从第0位开始亮要求的位数。 有谁知道怎么解决的,请留下大名及命令,先行谢过了。[Emot]28[/Emot]
楼主,CH451是可以实现您的功能的,这好象不是缺点吧!因为通过程序就可以实现你的要求. 命令很简单.只要设置一下系统参数就好了!也就是开显示,其他的命令如果您用不到可以不需要发送,这时候CH451就默认在非BCD方式.然后发送你的数据就可以了.很简单.
再次看ch451使用手册 还是不懂楼上所说的系统参数是哪个命令 附上我写的程序,望指点,程序运行后只在数码管位0(第一位)显示数字0。
/*该程序要在数码管位三重复显示0~F, 2009年5月7日*/
#include #define uint unsigned int #define uchar unsigned char uchar code table[]={ //BCD译码0~F的存放表 0x00,0x01,0x02,0x03, 0x04,0x05,0x06,0x07, 0x08,0x09,0x0a,0x0b, 0x0c,0x0d,0x0e,0x0f}; void delay(uchar n); //延时程序声明 /*板子上CH451的连接*/ sbit ch451_dclk=P2^7; sbit ch451_din=P2^6; sbit ch451_load=P2^5;
void ch451_init(); //初始化程序声明 void ch451_write(uint command); //ch451的12位命令函数声明 /*主函数*/ void main() { while(1) { uchar j; ch451_init(); //初始化,选着4线 ch451_write(0x0401); //关WD、KEY开显示 ch451_write(0x0590); //BCD译码,扫描极限一位,最亮 for(j=0;j<16;j++) //0~F的重复显示 { ch451_write(0x0b00|table[j]); delay(20); //显示延时0.2s } } } void ch451_init() { ch451_din=0; //初始化,选择4线 ch451_din=1; } void ch451_write(uint command) //单片机向ch451发送的十二位命令 { unsigned char i; ch451_load=0; for(i=0;i<12;i++) { ch451_dclk=0; ch451_din=command&1; ch451_dclk=1; command>>=1; } ch451_load=1; } void delay(uchar n) //延时n*10ms { uchar a,b,c; for(a=0;a for(b=0;b<14;b++) for(c=0;c<237;c++); }
系统参数命令在手册里面有详细的描述,你可以看一下操作命令里面,即0x403,当然你可以设置成0x401,仅开显示功能,对应你程序中的:ch451_write(0x0401); //关WD、KEY开显示 关于你想要得到的结果,有以下两种方法: (1)工作于非译码方式 程序需要定义显示0-9 const unsigned char BCD_decode_tab[10] = { 0X3F, 0X06, 0X5B, 0X4F, 0X66, 0X6D, 0X7D, 0X07, 0X7F, 0X6F}; 程序修改如下: void main() { uchar i; while(1) { ch451_init(); //初始化,选着4线 ch451_write(0x0401); //关WD、KEY开显示 for(i=0;i<10;i++) //这里的个数只是举个例子 { ch451_write(0x0b00| BCD_decode_tab[ i] ); delay(20); //显示延时0.2s } } }
(2) 工作于BCD方式 程序修改如下: void main() { uchar i; while(1) { ch451_init(); //初始化,选着4线 ch451_write(0x0401); //关WD、KEY开显示 ch451_write(0x0590); //BCD译码,扫描极限一位 for(i=0;i<10;i++) //这里的个数只是举个例子 { ch451_write(0x0800|table[ i ] ); //注意,当扫描极限设置成1的时候,只有DIG0上的 数码管亮.其他全不亮,不是由您自己定义的 delay(20); //显示延时0.2s } } }
明白了 ,谢谢下雨的天
其实应该是BCD译码的问题,不译码的00H是不显示数字的,BCD译码00H显示的是0,不向ch451发送显示命令,ch451默认的是00H,可以这么理解吧
呵呵!是的!可以这样理解!
继续发问 关于CH451的数码管动态驱动问题
我想让数码管第一位显示1,延时,然后第二位显示2,延时,....一直到数码管第八位显示8。本来想要的结果的每一次显示只显示一个数字(当然延时足够长了),现在的结果是第一位显示1,但一直保持着,接着第二位显示2,...最后八个都显示了,并不是一次显示一位。如下 本想要的结果: 1 2 3 4 . . . . 8
实际效果如下: 1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 1 2 3 4 5 6 1 2 3 4 5 6 7 1 2 3 4 5 6 7 8
我想问下 如何才能把前面的显示的 清除了 我用开显示 在关显示 也达不到效果
你好,在你使用ch451_write(CH451_DIG1 |2);时,由于之前写入的ch451_write(CH451_DIG0 |1);依然在执行,所以不能达到你要得效果,要重新将DIG0消隐,才可在DIG1上单独显示2,以此类推即可。
怎样消隐啊,开显示再关显示吗?0x0401和0x0400没用啊
在BCD译码方式下不能消隐,即使没有给数码管写入data,也是显示0,所以只能工作在非译码方式下来实现消隐的。即ch451_write(CH451_DIG0 |0x00);