单片机通过模拟串口怎么用74hc164控制数码管的位信号?
比如我想用51单片机P2口控制(共阴、共阳随便)四位一体的数码管的七个段,P3.7、P3.6接74HC164的clock、data(A、B),再通过164的Q0~Q3控制...
比如我想用51单片机P2口控制(共阴、共阳随便)四位一体的数码管的七个段,P3.7、P3.6接74HC164的clock、data(A、B),再通过164的Q0~Q3控制四个位来分别显示1、2、3、4,书上我看过用RXD、TXD来控制的,我现在想用模拟串口来控制位选,请各位大哥帮帮忙写一个C程序。
还有想想问一下,通过两个I/O口控制七个段,驱动信号该怎么写,如(P1接a~f、P2.7接g)这种段驱动信号该怎么写。
想必这位大哥没用过51C吧,我个人认为C比汇编好用还高效,其实我自己用C写了段,1、2、3、4还是能显示出来,但显示效果不佳,模拟串口写的那个DATA怎么送数进行位选还是有点含糊。想参考一下各位大哥的意见。还有分两个不同的I/O口控制段选能不能也给点提示。
#include<reg51.h>
char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x83,0xf8,0x80,0x98};
char disp[]={4,3,2,1};
sbit clk=P3^7;
sbit dat=P3^6;
main()
{char i,j;
char scan;
unsigned char byte;
while(1)
{scan=tab[byte];
for(i=0;i<4;i++)
{clk=0;
dat=scan&0x40;
j=disp[i];
P2=tab[j];
clk=1;
scan<<=1;
}
}
}
加了个延时程序显示效果好了很多,
但10ms太长,调试效果成动太显示,
如果再延长50ms以上,还是动态显示,
成飞入状态,但显示数据不对,
四位要体数码管完全显示只要低于16ms,
我又用了4ms延时,显示正确,但有点抖动,
最后我延时了1ms效果很好。
我想如果用0.5ms可能会更好,
但今天我的烧写器有问题,
不能再实验,就此作罢,谢谢你的指点 展开
还有想想问一下,通过两个I/O口控制七个段,驱动信号该怎么写,如(P1接a~f、P2.7接g)这种段驱动信号该怎么写。
想必这位大哥没用过51C吧,我个人认为C比汇编好用还高效,其实我自己用C写了段,1、2、3、4还是能显示出来,但显示效果不佳,模拟串口写的那个DATA怎么送数进行位选还是有点含糊。想参考一下各位大哥的意见。还有分两个不同的I/O口控制段选能不能也给点提示。
#include<reg51.h>
char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x83,0xf8,0x80,0x98};
char disp[]={4,3,2,1};
sbit clk=P3^7;
sbit dat=P3^6;
main()
{char i,j;
char scan;
unsigned char byte;
while(1)
{scan=tab[byte];
for(i=0;i<4;i++)
{clk=0;
dat=scan&0x40;
j=disp[i];
P2=tab[j];
clk=1;
scan<<=1;
}
}
}
加了个延时程序显示效果好了很多,
但10ms太长,调试效果成动太显示,
如果再延长50ms以上,还是动态显示,
成飞入状态,但显示数据不对,
四位要体数码管完全显示只要低于16ms,
我又用了4ms延时,显示正确,但有点抖动,
最后我延时了1ms效果很好。
我想如果用0.5ms可能会更好,
但今天我的烧写器有问题,
不能再实验,就此作罢,谢谢你的指点 展开
2个回答
展开全部
串口是uart,你现在是SPI的用法,要自己控制引脚送出的。51用c太笑话了吧,就那么点空间还是用汇编吧。给你段汇编的,C我不知道怎么操作符号位,写不到那么高效。
SetCommandSpeed:
clr NSEL
mov a,#0C6H
lcall sendbyte
mov a,#04H
lcall sendbyte
setb NSEL
ret
sendbyte:
mov r2,#8
nextbit:
clr SCK
rlc a
mov SDI,c
LCALL delay2
setb SCK
LCALL delay2
djnz r2,nextbit
LCALL delay2
clr SCK
clr SDI
ret
你喜欢用C随便你,51还是很练功底的。164不清楚回去翻数点。
数组占着ram干嘛?const!
4位对吧,显示缓冲在哪里?你当一位的用
并转串要移位送出去,你移位呢?
P2是选位的,你段码跟位码混在一起了。
SetCommandSpeed:
clr NSEL
mov a,#0C6H
lcall sendbyte
mov a,#04H
lcall sendbyte
setb NSEL
ret
sendbyte:
mov r2,#8
nextbit:
clr SCK
rlc a
mov SDI,c
LCALL delay2
setb SCK
LCALL delay2
djnz r2,nextbit
LCALL delay2
clr SCK
clr SDI
ret
你喜欢用C随便你,51还是很练功底的。164不清楚回去翻数点。
数组占着ram干嘛?const!
4位对吧,显示缓冲在哪里?你当一位的用
并转串要移位送出去,你移位呢?
P2是选位的,你段码跟位码混在一起了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询