wulin 发表于 2018-7-31 05:35 一直没出来这样的效果 |
李博文 发表于 2018-7-30 19:46 这与使用八数码管没有什么关系,程序是显示六位,后两位闲置而已。 ![]() |
wulin 发表于 2018-7-30 17:53 我用八位共阳极的数码管怎么 只显示小数点 和后两位数 |
李博文 发表于 2018-7-30 10:43 楼上好多朋友是瞎猜,此程序的共阳数码管加点当然是 P0 = table[z] & 0x7f; 。由于段码与位码共用P0,不加消隐指令肯定会出问题。楼主认为去掉 & 0x7f就显示正常的说法是不正确的,只是楼主用仿真软件看不出来,要是实际电路就可以看出问题来了。给你改了一下,你试试。#include<reg52.h> #include<intrins.h> #define uchar unsigned char #define MAIN_Fosc 11059200UL typedef unsigned int INT16U; sbit DU = P2^6; sbit WE = P2^7; uchar code table[]={ // 0 1 2 3 4 5 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, // 6 7 8 9 . 关显示 0x82, 0xf8, 0x80, 0x90, 0x7f, 0xff }; uchar code T_COM[] = { //1 2 3 4 5 6 0x01, 0x02, 0x04, 0x08, 0x10, 0x20 }; void Delay_Ms(INT16U ms) { INT16U i; do{ i = MAIN_Fosc / 96000; while(--i); //96T per loop }while(--ms); } void Display(uchar z) { //------------------------------ P0 = 0xff; DU = 0; DU = 1; P0 = table[z]; DU = 1; DU = 0; P0 = T_COM[0]; WE = 1; WE = 0; Delay_Ms(3); //------------------------------- P0 = 0xff; DU = 0; DU = 1; P0 = table[z] & 0x7f; DU = 1; DU = 0; P0 = T_COM[1]; WE = 1; WE = 0; Delay_Ms(3); //------------------------------ P0 = 0xff; DU = 0; DU = 1; P0 = table[z]; DU = 1; DU = 0; P0 = T_COM[2]; WE = 1; WE = 0; Delay_Ms(3); //------------------------------- P0 = 0xff; DU = 0; DU = 1; P0 = table[z] & 0x7f; DU = 1; DU = 0; P0 = T_COM[3]; WE = 1; WE = 0; Delay_Ms(3); //------------------------------ P0 = 0xff; DU = 0; DU = 1; P0 = table[z]; DU = 1; DU = 0; P0 = T_COM[4]; WE = 1; WE = 0; Delay_Ms(3); //------------------------------- P0 = 0xff; DU = 0; DU = 1; P0 = table[z] & 0x7f; DU = 1; DU = 0; P0 = T_COM[5]; WE = 1; WE = 0; Delay_Ms(3); } void main() { while(1) { Display(0); } } ![]() |
段码”或“0x7f才能显示,才是正解, |
段码”或“0x7f才能显示 |
去了小数点就可以完全显示 |
angmall 发表于 2018-7-29 12:16 设置成9之后数码管交替显示 还是不是一起显示 延时的时间太长了 |
guangshi_wq 发表于 2018-7-29 10:50 共阳极 直接和 0x7f与 最高位为0 数据的最高位也为0 这样就不需要判断了 |
要数码显示, 你把Delay_Ms(3); 设置成Delay_Ms(9); |
在实际中要做消影操作 |
wc86110 发表于 2018-7-29 03:13 哪里不对 |
楼主列出的二进制也不完全对啊 |