`
本帖最后由 dianzi_fans 于 2011-3-28 10:39 编辑
单片机数码静态管的显示
电路原理图如下:
数码管的示意图:
上面是6个数码管,是共阴极连接的,we1 we2 we3 we4 we5 we6是位选引脚分别接在了U4锁存器的输出端口上,标有a b c ,d, e, f g h的引脚全部是连在一起的,并且也连接在U3锁存器的输出端Q0-Q7上。如果要控制第一个共阴极数码管发光的话应该是we1输出要为0,如果要让它显示8的话,则a b c ,d, e, f g h全要点亮,小数点dp不能点亮这样才会显示数字8。
程序如下:
- #include
- ***it dula=P2^6;
- ***it wela=P2^7;
- void main()
- {
- wela=1;
- P0=0xfe;
- wela=0;
-
- dula=1;
- P0=0x7f;
- dula=0;
- while(1);
- }
复制代码
分析一下上面的程序,因为我们是把单片机的P0输出口用来控制锁存器的输入D0-D7电平进而控制其输出电平Q0-Q7,U3锁存器和U4锁存器的锁存端分别接在了单片机的P26,P27引脚上,wela=1是让U4锁存端开启,这样U4锁存器的输入与输出是连通的,其D端输入什么,Q端就输出什么电平,P0=0xfe=11111110的作用是让第一个数码管工作,其他的5个不工作,然后执行wela=0;关闭U4的锁存端,使位选的电平保持住了,之后是控制第一个数码管显示8了,要显示8的话则a b c ,d, e, f g h全要点亮,小数点dp不能点亮,再来看看编码是什么a=1 b=1 c=1 d=1 e=1 f=1 g=1 h=0于是P0=01111111B=0x7f,然后dula=0关闭锁存端,这样段选的电平就保持住了,直到,段选电平改变时,才消失。
仿真结果:
按照上面的理解编写一个程序让实验板上的6个数码管全工作,并且每隔0.5s依次显示0—F。
//让实验板上的六个数码管同时点亮,依次显示0-F,间隔为05S
- #include
- #define uchar unsigned char
- #define uint unsigned int
- ***it dula=P2^6;
- ***it wela=P2^7;
- uchar num;
- uchar code table[]={
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71}; //显示0-F P0口的输出端编码
- void delay_ms(uint);
- void main()
- {
- wela=1;
- P0=0xc0;
- wela=0;
- while(1)
- {
- for(num=0;num<16;num++)
- {
- dula=1;
- P0=table[num];
- dula=0;
- delay_ms(500);
- }
- }
- }
- void delay_ms(uint xms)
- {
- uint i,j;
- for(i=xms;i>0;i--)
- for(j=110;j>0;j--);
- }
复制代码
以上都参考自郭天祥的教程。
`
1