cnfloatleaf 发表于 2023-8-27 01:36 感谢大佬,就是这个意思! |
|
1、这里不关P0的事。 2、你可以正常使用数组,完成你想要做的事。 3、驱动LED时,加一个【翻译】(自己写程序): 【翻译】这样工作: 3.1、取出的一个LED的显示数据是N,(假设你想显示3,这里的N也=3) 3.2、将N转LED码:M。(这里你可以做一个N转M的表格,其中N=3时,M=hgfedcba=01001111,h=dp),M一个字节共8位,M7-M0,每位对应一个LED的显示段。请自己先编一个码生产N-M表格。你想显示多少种N,就对应做出多少个M,不要怕麻烦。如显示3,abcdg=1,ef=0,dp=0。N=03H/M=40H。 3.3、取出M,因为M0=a,a接在P3.3上,就将M0送至P3.3(P3.3=M0)。类似处理M1-M7。 3.4、如果M需要显示在第2位G2,G2接在P3.7上,就让P3.7=0(共阴LED),其它3位G1/G3/G4=P3.2/P1.0/P1.2=1。 如果是共阳LED,则3.3、3.4、的结果需要求反。 总结:这个作业是为了让你真正地理解LED扫描显示的原理。就是不让你【顺心】,必须自己写驱动,并翻译LED码。 事实上,在实战产品中,大部分情况,为了省钱,也是以硬件优先,LED的引脚不一定与CPU【有序】。当然设计大师们为了方便软件,也会尽可能做成【有序】。不过,鱼和熊掌啊。 |
http://www.51hei.com/bbs/dpj-56990-1.html 看看这里或许能帮到你。 |
在这里敲程序真累啊,TABLE健不能用,一不小心没写完就发出了,应该现在编辑器上敲好复制过来 |
sbit TMP0 = temp^0; sbit TMP1 = temp^1; sbit TMP2 = temp^2; sbit TMP3 = temp^3; sbit TMP4 = temp^4; sbit TMP5 = temp^5; sbit TMP6 = temp^6; sbit TMP7 = temp^7; // 显示程序 P32 = 1; // 位选全部为1,不显示,假设数码管是共阴 P37 = 1; P10 = 1; P12 = 1; temp = table[0]; // 赋值第一个数码管,数码管 a b c ~ dp 对应bit0~bit7 P33 = TMP0; P11 = TMP1; P14 = TMP2; P54 = TMP3; P55 = TMP4; P36 = TMP5; P13 = TMP6; P15 = TMP7; P32= 0; // 显示第一位数码管 delay(); // 延时 P32= 1; temp= table[1]; // 赋值第二个数码管, // BIT位赋值同上 P37= 0; // 显示第二位数码管 |
可以吧每个bit分开送,然后驱动位选 unsigned char bdata tmp; // 先定义一个可位寻址RAM sbit |