This is a driver library for the popular QDSP-6064 bubble display. These miniature displays can be leveraged for small breadboard projects in order to display debug information or even in larger projects where LCD displays are unpractical.
Fork of BubbleDisplay by
bubble.cpp
00001 /* * * * * * * * * * * * * * * * * * * * * * * * * * * 00002 * This drives the popular QDSP-6064 bubble display. * 00003 * * 00004 * Created by: Michael Dushkoff (mad1841@rit.edu) * 00005 * * * * * * * * * * * * * * * * * * * * * * * * * * */ 00006 #include "bubble.h" 00007 00008 /* 00009 * 00010 */ 00011 void BubbleDisplay::init(PinName m0, PinName m1, PinName m2, PinName m3, 00012 PinName m4, PinName m5, PinName m6, PinName m7, 00013 PinName m8, PinName m9, PinName m10, PinName m11){ 00014 // Set up pins 00015 _cat1 = new DigitalOut(m0); 00016 _anE = new DigitalOut(m1); 00017 _anC = new DigitalOut(m2); 00018 _cat3 = new DigitalOut(m3); 00019 _anDP = new DigitalOut(m4); 00020 _cat4 = new DigitalOut(m5); 00021 _anG = new DigitalOut(m6); 00022 _anD = new DigitalOut(m7); 00023 _anF = new DigitalOut(m8); 00024 _cat2 = new DigitalOut(m9); 00025 _anB = new DigitalOut(m10); 00026 _anA = new DigitalOut(m11); 00027 00028 // Set the initial display number 00029 _seg = 0; 00030 00031 // Set the initial character values 00032 _chrs[0] = ' '; 00033 _chrs[1] = ' '; 00034 _chrs[2] = ' '; 00035 _chrs[3] = ' '; 00036 00037 // Initialize the Ticker 00038 _freq = DEF_DISPL_FREQ; 00039 _cycler.attach(this,&BubbleDisplay::cycle,1.0/(_freq)); 00040 } 00041 00042 /* 00043 * This is the default BubbleDisplay constructor that 00044 * maps the pins in a simple way for the LPC11U24. 00045 */ 00046 BubbleDisplay::BubbleDisplay(){ 00047 #if defined(TARGET_LPC1768) || defined(TARGET_LPC11U24) 00048 init(p21,p22,p23,p24,p25,p26,p36,p35,p34,p33,p30,p29); 00049 #endif 00050 } 00051 00052 /* 00053 * This allows a user to map the pins of the bubble display 00054 * to any possible pin that they desire. 00055 */ 00056 BubbleDisplay::BubbleDisplay(PinName m0, PinName m1, PinName m2, PinName m3, 00057 PinName m4, PinName m5, PinName m6, PinName m7, 00058 PinName m8, PinName m9, PinName m10, PinName m11){ 00059 init(m0,m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11); 00060 } 00061 00062 /* 00063 * Default destructor 00064 */ 00065 BubbleDisplay::~BubbleDisplay(){ 00066 // Clean up all of our pointers 00067 delete _cat1; 00068 delete _anE; 00069 delete _anC; 00070 delete _cat3; 00071 delete _anDP; 00072 delete _cat4; 00073 delete _anG; 00074 delete _anD; 00075 delete _anF; 00076 delete _cat2; 00077 delete _anB; 00078 delete _anA; 00079 } 00080 00081 /* 00082 * This sets the cycle frequency to a specific value instead of the 00083 * default 10kHz. 00084 */ 00085 void BubbleDisplay::setFreq(double freq){ 00086 // Detach the cycler and then reattach it with the new frequency 00087 _freq=freq; 00088 _cycler.detach(); 00089 _cycler.attach(this,&BubbleDisplay::cycle,1.0/(_freq)); 00090 } 00091 00092 /* 00093 * This cycles through the four seven segment displays on the 00094 * bubble display by switching on and off the correct cathodes. 00095 */ 00096 void BubbleDisplay::cycle(){ 00097 // Set anodes to current display 00098 (*_anDP) = ((dispTabl[_chrs[_seg]] >> 7) & (0x01)); 00099 (*_anA) = ((dispTabl[_chrs[_seg]] >> 6) & (0x01)); 00100 (*_anB) = ((dispTabl[_chrs[_seg]] >> 5) & (0x01)); 00101 (*_anC) = ((dispTabl[_chrs[_seg]] >> 4) & (0x01)); 00102 (*_anD) = ((dispTabl[_chrs[_seg]] >> 3) & (0x01)); 00103 (*_anE) = ((dispTabl[_chrs[_seg]] >> 2) & (0x01)); 00104 (*_anF) = ((dispTabl[_chrs[_seg]] >> 1) & (0x01)); 00105 (*_anG) = ((dispTabl[_chrs[_seg]] >> 0) & (0x01)); 00106 00107 switch(_seg){ 00108 case 0: 00109 // Switch appropriate cathodes 00110 (*_cat1) = 0; 00111 (*_cat2) = 1; 00112 (*_cat3) = 1; 00113 (*_cat4) = 1; 00114 _seg = 1; 00115 break; 00116 case 1: 00117 // Switch appropriate cathodes 00118 (*_cat1) = 1; 00119 (*_cat2) = 0; 00120 (*_cat3) = 1; 00121 (*_cat4) = 1; 00122 _seg = 2; 00123 break; 00124 case 2: 00125 // Switch appropriate cathodes 00126 (*_cat1) = 1; 00127 (*_cat2) = 1; 00128 (*_cat3) = 0; 00129 (*_cat4) = 1; 00130 _seg = 3; 00131 break; 00132 default: 00133 // Switch appropriate cathodes 00134 (*_cat1) = 1; 00135 (*_cat2) = 1; 00136 (*_cat3) = 1; 00137 (*_cat4) = 0; 00138 _seg = 0; 00139 break; 00140 } 00141 } 00142 00143 /* 00144 * This writes a sequence of characters from left to right 00145 * to the seven-segment displays. 00146 */ 00147 void BubbleDisplay::write(char c1, char c2, char c3, char c4){ 00148 _chrs[0] = c1; 00149 _chrs[1] = c2; 00150 _chrs[2] = c3; 00151 _chrs[3] = c4; 00152 } 00153 00154 /* 00155 * This writes a sequence of characters from left to right 00156 * to the seven-segment displays. 00157 */ 00158 void BubbleDisplay::write(char* c){ 00159 _chrs[0] = c[0]; 00160 _chrs[1] = c[1]; 00161 _chrs[2] = c[2]; 00162 _chrs[3] = c[3]; 00163 } 00164 00165 /* 00166 * This writes a sequence of integer number 00167 * to the seven-segment displays. 00168 */ 00169 void BubbleDisplay::write(uint16_t num){ 00170 num %= 10000; 00171 _chrs[0] = (num/1000); 00172 _chrs[1] = ((num/100)%10); 00173 _chrs[2] = (((num/10)%100)%10); 00174 _chrs[3] = (((num%1000)%100)%10); 00175 }
Generated on Mon Jul 18 2022 17:37:47 by 1.7.2