长春公司做网站,自适应网站开发公司,门户网站建设背景,哈尔滨建设工程招投标信息网最近拿到了#xff0c;只要用6个脚就能驱动
具体来说#xff0c;原理是#xff0c;两个脚一个脚为正#xff0c;一个脚为负#xff0c;就能点亮一段数码管。其他脚保持关闭状态
这样理论上可以实现6x530种点亮方式。3位数码管每位8个管脚加上一个小数点#xff0c;刚好是…最近拿到了只要用6个脚就能驱动具体来说原理是两个脚一个脚为正一个脚为负就能点亮一段数码管。其他脚保持关闭状态这样理论上可以实现6x530种点亮方式。3位数码管每位8个管脚加上一个小数点刚好是27个灯一次点亮一个灯然后通过循环里一直切换实现完整的显示这里给一个数据手册的示意图不过具体的引脚排列每个厂家都不一样可以用万用表测出来。用红笔和黑笔接两个脚某个灯管就亮了管脚命名参考显示效果例程使用方法#includeDisplay_seg.hintmain(){SEG_Init();// 初始化引脚和变量while(1){SEG_Update();// 刷新显示SEG_Display_Num(DIGIT_1,1);// 第一位显示1SEG_Display_Num(DIGIT_2,2);SEG_Display_Num(DIGIT_3,3);}}适配方法注意每个单片机的函数不一样把#include sc.h换成自己单片机的头文件#define SEG1_PIN RB6 // 引脚1: PB6 ...引脚改为自己的引脚代码#define SEG1_INPUT() TRISB6 1 ...引脚方向改为自己的引脚方向设置函数灯序不一样的还要改一下这里的排序static const SegMap seg_map[] {{2, 3, SEG_A, DIGIT_1}, ...**{2,3…**表示电流方向是2-3时亮第一个管脚代码Display_seg.h#ifndef__SEG_DISPLAY_H#define__SEG_DISPLAY_H#includesc.h//---------------------------------// 用户自定义 数码管引脚//---------------------------------// 引脚定义根据您的接线#defineSEG1_PINRB6// 引脚1: PB6#defineSEG2_PINRB5// 引脚2: PB5#defineSEG3_PINRB4// 引脚3: PB4#defineSEG4_PINRA3// 引脚4: PA3#defineSEG5_PINRA4// 引脚5: PA4#defineSEG6_PINRA5// 引脚6: PA5// 引脚方向#defineSEG1_INPUT()TRISB61#defineSEG2_INPUT()TRISB51#defineSEG3_INPUT()TRISB41#defineSEG4_INPUT()TRISA31#defineSEG5_INPUT()TRISA41#defineSEG6_INPUT()TRISA51#defineSEG1_OUTPUT()TRISB60#defineSEG2_OUTPUT()TRISB50#defineSEG3_OUTPUT()TRISB40#defineSEG4_OUTPUT()TRISA30#defineSEG5_OUTPUT()TRISA40#defineSEG6_OUTPUT()TRISA50//---------------------------------// 函数声明voidSEG_Init(void);// 初始化数码管voidSEG_Clear(void);// 清空显示// 显示一位数字// 变量数码管数字voidSEG_Display_Num(unsignedchardigit,unsignedcharnum);// 显示一个小数点voidSEG_Display_DP(unsignedchardigit,unsignedcharstate);// 刷新屏幕需要在循环调用!!!重要voidSEG_Update(void);// 使用示例/* int main() { SEG_Init(); while(1) { SEG_Update();// 刷新显示 SEG_Display_Num(DIGIT_1, 1); // 第一位显示1 SEG_Display_Num(DIGIT_2, 2); SEG_Display_Num(DIGIT_3, 3); } } */// 数码管编号#defineDIGIT_10#defineDIGIT_21#defineDIGIT_32// 段码定义 (dp,g,f,e,d,c,b,a)#defineSEG_A0x01#defineSEG_B0x02#defineSEG_C0x04#defineSEG_D0x08#defineSEG_E0x10#defineSEG_F0x20#defineSEG_G0x40#defineSEG_DP0x80// 数码管字段A到G)// AAAAA// F B// F B// GGGGG// E C// E C// DDDDD DP//// 数字0-9的字库constunsignedcharseg_code[]{SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F,// 0SEG_B|SEG_C,// 1SEG_A|SEG_B|SEG_G|SEG_E|SEG_D,// 2SEG_A|SEG_B|SEG_G|SEG_C|SEG_D,// 3SEG_F|SEG_G|SEG_B|SEG_C,// 4SEG_A|SEG_F|SEG_G|SEG_C|SEG_D,// 5SEG_A|SEG_F|SEG_G|SEG_E|SEG_C|SEG_D,// 6SEG_A|SEG_B|SEG_C,// 7SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G,// 8SEG_A|SEG_B|SEG_C|SEG_D|SEG_F|SEG_G,// 9SEG_A|SEG_B|SEG_C|SEG_E|SEG_F|SEG_G,// A [10]SEG_C|SEG_D|SEG_E|SEG_F|SEG_G,// b [11]SEG_A|SEG_D|SEG_E|SEG_F,// C [12]SEG_B|SEG_C|SEG_D|SEG_E|SEG_G,// d [13]SEG_A|SEG_D|SEG_E|SEG_F|SEG_G,// E [14]SEG_A|SEG_E|SEG_F|SEG_G,// F [15]SEG_B|SEG_C|SEG_E|SEG_F|SEG_G,// H [16]SEG_D|SEG_E|SEG_F,// L [17]SEG_A|SEG_B|SEG_E|SEG_F|SEG_G,// P [18]SEG_E|SEG_G,// r [19]SEG_G// - [20]};#defineSEG_CODE_SIZE(sizeof(seg_code)/sizeof(unsignedchar))#endifDisplay_seg.c#includeDisplay_seg.h#includestdint.h// 显示缓冲区3位数码管staticunsignedcharseg_buffer[3]{0,0,0};// 当前扫描的数码管staticunsignedcharcurrent_digit0;// 引脚配置表// 格式: {阳极引脚, 阴极引脚, 段码位}// 需要根据实际数码管内部连接关系填写typedefstruct{unsignedcharanode;// 高电平引脚 (1-6)unsignedcharcathode;// 低电平引脚 (1-6)unsignedcharsegment;// 段码unsignedchardigit;// 数码管位 (0-2)}SegMap;// 这里需要根据实际接线测试并修改// 每个LED由两个引脚控制一个阳极一个阴极staticconstSegMap seg_map[]{// 第1位数码管{2,3,SEG_A,DIGIT_1},// A1: PB6-PB5{2,4,SEG_B,DIGIT_1},// B1: PB5-PB4{5,2,SEG_C,DIGIT_1},// C1: PB4-PA3{2,6,SEG_D,DIGIT_1},// D1: PA3-PA4{2,5,SEG_E,DIGIT_1},// E1: PA4-PA5{3,2,SEG_F,DIGIT_1},// F1: PA5-PB6{4,2,SEG_G,DIGIT_1},// G1: PB6-PB4{2,1,SEG_DP,DIGIT_1},// DP1: PB5-PA3// 第2位数码管{5,4,SEG_A,DIGIT_2},// A2: PB4-PA4{3,5,SEG_B,DIGIT_2},// B2: PA3-PA5{4,5,SEG_C,DIGIT_2},// C2: PA4-PB6{3,4,SEG_D,DIGIT_2},// D2: PA5-PB5{6,3,SEG_E,DIGIT_2},// E2: PB6-PA3{4,3,SEG_F,DIGIT_2},// F2: PB5-PA4{5,3,SEG_G,DIGIT_2},// G2: PB4-PA5{3,1,SEG_DP,DIGIT_2},// DP2: PA3-PB6// 第3位数码管{1,6,SEG_A,DIGIT_3},// A3: PA4-PB5{3,6,SEG_B,DIGIT_3},// B3: PA5-PB4{5,6,SEG_C,DIGIT_3},// C3: PB6-PA4{6,4,SEG_D,DIGIT_3},// D3: PB5-PA5{4,6,SEG_E,DIGIT_3},// E3: PB4-PB6{6,5,SEG_F,DIGIT_3},// F3: PA3-PB5{1,5,SEG_G,DIGIT_3},// G3: PA4-PB4{6,4,SEG_DP,DIGIT_3},// DP3: PA5-PA3};#defineSEG_MAP_SIZE(sizeof(seg_map)/sizeof(SegMap))// 初始化数码管voidSEG_Init(void){// 初始化所有引脚为输入高阻态TRISA|0b00111000;// RB4,RB5,RB6 - 输入WPUA|0b00111000;// 上拉电阻TRISB|0b01110000;// RB4,RB5,RB6 - 输入WPUB|0b01110000;// 上拉电阻// 初始化显示缓冲区seg_buffer[0]0;seg_buffer[1]0;seg_buffer[2]0;current_digit0;}// 清除显示voidSEG_Clear(void){// 初始化所有引脚为输入高阻态TRISA|0b00111000;// RB4,RB5,RB6 - 输入WPUA|0b00111000;// 上拉电阻TRISB|0b01110000;// RB4,RB5,RB6 - 输入WPUB|0b01110000;// 上拉电阻}// 操控6个引脚状态 (0:低电平, 1:高电平, 其他:高阻态)staticvoidset_pin(unsignedcharpin,unsignedcharstate){switch(pin){case1:if(state1){SEG1_OUTPUT();SEG1_PIN1;}elseif(state0){SEG1_OUTPUT();SEG1_PIN0;}else{// 高阻态SEG1_INPUT();SEG1_PIN0;}break;case2:if(state1){SEG2_OUTPUT();SEG2_PIN1;}elseif(state0){SEG2_OUTPUT();SEG2_PIN0;}else{SEG2_INPUT();SEG2_PIN0;}break;case3:if(state1){SEG3_OUTPUT();SEG3_PIN1;}elseif(state0){SEG3_OUTPUT();SEG3_PIN0;}else{SEG3_INPUT();SEG3_PIN0;}break;case4:if(state1){SEG4_OUTPUT();SEG4_PIN1;}elseif(state0){SEG4_OUTPUT();SEG4_PIN0;}else{SEG4_INPUT();SEG4_PIN0;}break;case5:if(state1){SEG5_OUTPUT();SEG5_PIN1;}elseif(state0){SEG5_OUTPUT();SEG5_PIN0;}else{SEG5_INPUT();SEG5_PIN0;}break;case6:if(state1){SEG6_OUTPUT();SEG6_PIN1;}elseif(state0){SEG6_OUTPUT();SEG6_PIN0;}else{SEG6_INPUT();SEG6_PIN0;}break;}}// 显示一位数字voidSEG_Display_Num(unsignedchardigit,unsignedcharnum){if(digit3num10){seg_buffer[digit]seg_code[num];}}// 显示一个小数点voidSEG_Display_DP(unsignedchardigit,unsignedcharstate){if(digit3){if(state1){seg_buffer[digit]|SEG_DP;}else{seg_buffer[digit]~SEG_DP;}}}// 更新显示需要在循环调用才能显示 !!!voidSEG_Update(void){// 一次更新一位数码管staticunsignedcharseg_num0;constSegMap*mapseg_map[seg_num];// 检查该段是否需要点亮if(seg_buffer[map-digit]map-segment){// 点亮这个LEDSEG_Clear();set_pin(map-anode,1);// 阳极set_pin(map-cathode,0);// 阴极}else{// LED不需要时关闭 //注意不加关闭会导致显示亮度不均SEG_Clear();}seg_num(seg_num1)%SEG_MAP_SIZE;}