| //选择显示数据位,4位输出数据只有一个置位,其为选择显示的位 void digit_select(int index) { BitAction v[4]; int i; for (i=0; i<4; i++){ //根据index选择显示位 if (index == i){ v[i] = Bit_SET; }else{ v[i] = Bit_RESET; } } GPIO_WriteBit(GPIOA, GPIO_Pin_11, v[0]); GPIO_WriteBit(GPIOA, GPIO_Pin_12, v[1]); GPIO_WriteBit(GPIOC, GPIO_Pin_14, v[2]); GPIO_WriteBit(GPIOC, GPIO_Pin_15, v[3]); } //根据输入数字点亮对应led,共8位,包括小数点以及7段数码管 void digit_show(int digit) { int segment, i, base; BitAction v[8]; switch (digit){ case 0 : segment = 0xc0; break; case 1 : segment = 0xf9; break; case 2 : segment = 0xa4; break; case 3 : segment = 0xb0; break; case 4 : segment = 0x99; break; case 5 : segment = 0x92; break; case 6 : segment = 0x82; break; case 7 : segment = 0xf8; break; case 8 : segment = 0x80; break; case 9 : segment = 0x90; break; default : segment = 0x86; break; } base = 1 << 8; // 由于数码管为共阳极,所以此处置位为不显示。 for (i=0; i<8; i++){ base >>= 1; if ((segment & base )== 0){ v[i] = Bit_RESET; }else{ v[i] = Bit_SET; } } GPIO_WriteBit(GPIOA, GPIO_Pin_0, v[0]); GPIO_WriteBit(GPIOA, GPIO_Pin_1, v[7]); GPIO_WriteBit(GPIOA, GPIO_Pin_2, v[6]); GPIO_WriteBit(GPIOA, GPIO_Pin_3, v[5]); GPIO_WriteBit(GPIOA, GPIO_Pin_4, v[4]); GPIO_WriteBit(GPIOA, GPIO_Pin_5, v[3]); GPIO_WriteBit(GPIOA, GPIO_Pin_6, v[2]); GPIO_WriteBit(GPIOA, GPIO_Pin_7, v[1]); } //控制时分复用,每调用一次显示对应的一位,使用静态变量控制选择位 void display(int digit){ static int index = -1; int i; int base = 1000; index = (index + 1) % 4; //index=0-3时分别对应从左到右四位 for (i=0; i<index; i++){ base /= 10; } digit = (digit / base) % 10; digit_select(index); digit_show(digit); } |