字幕列表 影片播放 列印英文字幕 So in a previous video we used an eeprom as a decoder for a seven segment display so by hooking up a binary input here, so this is [6] or you know 4 5 by inputting a different binary number on the address lines of the eeprom the eeprom would output Ones and zeros in the appropriate places to turn on or off the appropriate segment on the seven segment display But how can we build a decoder for [8] bits that outputs a number from 0 to 255? on three of these seven segment displays and That question came up in the comments on the video about using an e eeprom as a 7 segment decoder the YouTube Cuber asked what do I do if I have multiple seven segment displays is flying one decimal number and There's some good replies in here So rest little teapot says if I've got this correctly you would need one e eeprom for each seven segment display And that's exactly what what we've got here? We've got one e eeprom for each of the seven segment displays So we've got a one place a eeprom for the one stage at a tens place for the tens digit and a hundreds place for the hundreds digit and Then the address lines or at least the first eight of the address lines for the chips are all linked together So if we put an address value on these eight lines here in this case I'm putting that binary equivalent of 123 that same value is going to show up on each of these chips So this chip is going to be at address 123 This chip is going to be at address 123 and the chip is going to be at address 123 and so at that address for the hundred ship. It's programmed to display a [1] at that address for the tens chip It's programmed to display a 2 and the ones chip is programmed to display a 3 and then they go on to [say] Let's say we want to [represent] the numbers from 0 to 15 We can use 2 [e] [eproms] and this is this is exactly right here, so this shows for the address 0 through 9 That first the eeprom is just outputting all zeros and the second one Outputs the numbers from 0 [to] 9 and then it wraps around here And that first year you promised a 4 10 through through 15 And then Jason Masters here [sort] [of] kind of restates that and then says Yeah if you link the address lines of the chips together so all the chips get the same address you put the binary number on the address Line and The output of the chips will display the decimal : that's that's a yes That's absolutely right so simple But then this is this is interesting the [YouTube] cuber again says another thing that I thought of is multiplexing through the eeprom so you get the binary number and the digit number as input and Then you get a you know binary coded decimal or I guess you'd get the Decoded set and segment [things] [as] your output and so you need a binary counter on the digit number input to [start] multiplexing I like this idea rather than needing [to] have three of these [ee] problems one for each digit We can do it with a single the eeprom that drives all three digits now It's going to be a little bit more complex But it's I don't think we're going to need to do anything that we haven't already done elsewhere in our computer build So let's give it a try and I'll explain more about how those Multiplexing works as we as we build out the circuit, so this display module is going to be part of our computer It's going to [be] output for our computer So I'm going to connect a new breadboard here right below the b register for a computer and build the display Output here, and so we're going to use a single eeprom that's the the idea of this multiplexing idea the 28 C 16 [I'll] start by connecting it to a single [seven] segment display, and this is a common cathode Instead of common anode which were the ones we were using before so I'm going to connect the common cathode here to ground through this 330 Ohm resistor and There is the reason I'm using a common cathode Display here which I'll go into later and so I'm just going to check the eight output pins for the eeprom to the seven segments of the of the seven segment display plus the decimal point And it really is just kind [of] hard to follow with everything on top of each other there But basically what's going on is we've got these i/o pins [io0] [one] [two] [three] [four] [five] [six] [seven] Those are the pins that are connected here, and they're connected to the seven segment display basically like this So you know this is what our seven segment display is going to do just zero through nine [since] we're just getting decimal at this point and each of the segments it has a letter designator, so Abcde F and then g is the one in the middle And then of course there's also the decimal point over here, and so this is the way that I've arranged the the bit order So the decimal point is the most significant bit so that corresponds With Io7 here, and then it goes Abcdefg where g is the least significant bit corresponding with io 0 over [here]? So that's that's how I hooked this up [but] of course you can hook it up any way you want you just got to make sure you know which bits need to be On for each of the numbers that you [want] to display? now we can also hook up power and ground for the eeprom so that [it's] powers and Then the control signals that we've got we've got our chip enable our output enable and our write enable And chip enable we want that to be active, so that's active low Output enable we also want to be active, and that's also active low and Then write enable we don't want that to be active We don't wanna be writing to this and so that's active low So we want to tie that high so that we're not Going to accidentally write anything to this chip and so that leads just the address line So there's eight address lines over on this side, and then address eight nine and ten over on that side and for now I'm just going to temporarily tie those all low That's the first eight address lines are all tied low there and then I'll also tie the remaining three address lines over here Low as well, so with all of the address lines tied low This tip is going to be addressing address location zero and we'll see whichever bits are set on the output here so let's add power and We can see that. We're getting all the bits set so all seven segments plus the decimal point are on so Address locations, they're on this chip is apparently programmed with with all ones and if we go to some other address so address one Two so it looks like this chip is probably erased if all it's giving us is all ones on the output So let's pull the chip out in and program with something So I've got the eeprom in our Arduino programmer And I'm going to come over to the code here and because we're using a common capital display now instead of a common anode I'm going to make sure I've got the [right] programming for that So this is the right bit that we want to have set for common cathode so I'm going to add and upload that and I look at my serial monitor, and so it's programming and Okay, it looks like it's going to start by erasing the eeprom and then it programs it and it looks like it's got that program In there for the first 16 bytes okay, so let's pull it out and put it back in our other circuit to put this back in here now and connect power So now we've got a zero and if we go to address location one. We've got a one and This is working as we would expect but of course we want [to] have more than one digit and so [the] way the Multiplexing is going to work is we're actually going to drive all the digits using the same data bits And then we're going to switch on certain [digits] at certain times, which will hopefully make more sense in a minute here So I'm going to add a couple more digits here and what I'm going [to] do is I'm going to connect all of these essentially in parallel so that the outputs of the Eeprom go to all of them in the same way So I put all of the pinch of the [segments] together [so] if we connect the common cathodes for each of these to ground we should see each of the digits light up the same way Assuming everything is connected properly which They're getting pretty crowded down here. So let me see what's going on here there We go and so now if I change the input all three of these digits should change so there's one three Two and so on so of course this isn't what we want But it does mean that we can control all of these digits from the one chip And actually I've got a little extra room over here So I can add a fourth digit if I want and I think there might be a way to use it Because I think there will actually be a use for that fourth digit, which I'll get into later but now what we need to do is build the Multiplexing logic that cycles through each of these digits so we can display a different number on each digit and the sequence that we need a clock and I don't want to use the clock that is running the rest of the computer because We might want to run that it if different rate or whatever so I'm going to build a separate clock just for the output display using a five five five timer Let me connect a five five five timer over here. I'll connect ground and power And then I'm going to connect a 2 micro Farad capacitor from pin two to ground I'm also going to connect 10 2 over 2 10 6 10 [five], I'm going to connect to ground with a 10 nano farad capacitor and I'm going to put a 100k resistor between thousand six and seven and then a 1k resistor [between] 10 seven and and five volts between 10 seven and eight I guess [10/8] is already connected to [five] volts And so this is a simple a stable configuration For the five five five timer and if I hope the the output which is pin three up to an led Which is going through a resistor to ground. I should be able to see this pulsing so I connect power There we go, so we have a little clock running here And so next what we want to do is we want to use this clock to sequence through each of our displays and to do That what we need is a small counter, so the 74 LS. 76 has got two Jk. Flip-flops on it Which is just enough to make a simple two bit counter and we basically want to take [advantage] of the toggle Functionality of the Jk. Flip-flop to build a simple counter so we want to basically just connect the preset clear J And K inputs all high and then just use the clock every time the clock pulses [we'll] get a toggle and we can use that [to] build a counter So this is the preset and clear for the first Flip-flop tying both of those high as Well as the J input and the k input Those are all tied high and then also the preset and clear for the second flip-flop As well as the J and K inputs for the second flip-flop and then of course this chip also needs power and ground to power the chip so next we can connect the clock into our clock input for one of our flip-flops and Then we'll connect the output of that flip-flop into the clock input of the other Flip-flop to create a counter so we'll connect the output of our five five five timer to that clock for one of the Jk flip-flops And I'll connect an [led] to the output of that flip-flop and also connect the output that flip-flop around to the clock for the other Flip-flop and finally I'll look at the output of the [second] Flip-flop So now if we power this up, hopefully, we'll have a working counter And it looks like we do so we've got this counter now So counting from zero one two three zero one two three So that's counting from zero to three and so we can use that count to control which of our digits We want to display to control that I can use to these additional address lines So remember we've got our eighth address lines down here that we're using to put which value we want to show so right now We're inputting a [2] and we're seeing twos But we've also got these three additional address lines up here that we're not [using] They're all tied to 0 we can tie two of those to these these counting leds over here So instead of tying this address line to ground I can tie it to this Led here and instead of tying this to ground I can tie it to this led over here and What you see is that when both of these are 0 we see the same thing? We saw [before] we see that [2] So once every 4 clock cycles essentially we get a 2 here and then the other times We're getting just all eight with the dots so basically all all of the bits are set But what we could do is program this so that when the counter is at 0? It's outputting the number we want in the ones place and when the counter is [1] it's outputting the number we want in the tens Place and when the counter is 2 it's outputting the number we want in the hundreds place So let's go ahead and actually program the eeprom to do that so again I'm going to put the eeprom into our arduino eeprom programmer, and so just to summarize what we're trying to do here. We've got these 11 address bits and We're using the bottom eight of them a 0 through a 7 to input the number that we're trying to display so this could be anywhere from all zeros all 1 so 0 to 255 and Then we're using address 8 and address 9 to tell us which digit we want we want to display So if these are both zeros and we want to display the ones place and so if we put in for example if we put in the number 123 here, we'd want the output to display a 3 but if we set a a high if we put in 0 and a 1 for a 9 and a 8 Then we want this to display the tens place for that same number so again if we've got 123 let's say here Then we want to display [a] 2 so that would be the tens place and Then if a 9 is a 1 and a 8 is a 0 then [we'd] want to display a hundreds place for whatever is in Here so again if this is 123, [we'd] want to display a 1 so again just as an example here This is what we would actually want to see programmed in the eeprom for example so at address 0 0 0 and then this [0] 1 1 1 1 [zero-one-one], this is this is the binary for 123 in decimal and So because we've got [two] [zero] [zero] here the output is going to be the bits that we need to set in order to show a 3 But if our input is that same set of bits in the lower eight bits, so this is still representing the number 123 but in this case if we've got a [0] [1] in these upper bits Then we want to output something different one output the bits that we need in order to display the number two on [the] 7-segment display, and then same thing here for the hundreds place if a nine is one and [eighty-eight] is zero and The rest of these are the same this is still representing the number 123 Now we want to output whatever we need to output to display the number one this case is just these two segments And then you know because we've got four digits. There is also this case We have to handle where we've got a 1 and a 1 in a 9 and a 8 and in this case We'll just output nothing so all [zeros] will just mean none of the [segment's] are on so that fourth display I'll just be blank, so this is what we want to program So we don't really want to just type out all [of] those because that's that's going to be you know over a thousand Separate numbers, and we don't want to we [don't] want to type all that out like this so let's write some code that actually just fills in all of the numbers that we need to program into the eeprom so I am Going to use this this part here at least up [to] number nine. Yeah, so this this part here I'm actually going to copy that and then we'll comment that out and then down [here]. Let's see We don't need to erase the whole eeprom we're just going to be writing over a lot of this anyway, so I'm going to delete this code and Then here when we program the data bytes rather than just programming whatever was in that Data array [we] call this digits and so these are just the the hex codes that we need in order to display each of the digits from from 0 through [9] and So we want to start by programming all of the ones place so we can go from address 0 to 255 and we'll do right right [eeep] rom address and then we [want] the the digit that corresponds to the ones place for that address so to get the one place of the address we can do? address Mod 10 and this % is the Modulo operator which Essentially just divides a dress by 10 and gives you the remainder, so if a dress is 0 we divide by 10 the remainder is 0 if the address is 123 we divide that by 10 we get 12 with a remainder of 3 and so it'll you know so this will give us 3 Which is the ones place in 123 so this will give us whatever the value of the ones place is for a dress But we we don't want to write that we want to write the the digit for that So what we can do is we can just use this as an index into digit so if we say digit and then at that index because this This address mod 10 is always going to be a number between 0 [and] 9 Because whenever you divide something by 10 the remainder is going to be between 0 [and] 9 So that's always going to be a number between 0 9 and so that's just going to give us whichever of these values Corresponds with that position So this should write all [of] the ones places to the [eprom] next we need to write all the tens places So we'll go from 0 to 255 actually address is probably not the best name for this let's call this value Because the value in the address are only the same for the ones place So I'll just rename all these value to be consistent and so here We're going to write to value Plus 256 is The address that we're going to write to and that's because we're doing this case here where we're doing the the tens place and so a 8 is always going to be set and the value the place value of This bit is 256 so it's going to be whatever the value is plus 256 and that's the where we want to program the tens the you know [does] [a] appropriate code for the tens place And so here we want to get the tens place And so if we do address or not address value oops actually this [should] be value mod 10, so if we do value Divided by 10 because value is declared as an integer here this divided by 10 will be an integer division So it won't give us a decimal place It'll just give us a truncated value so if it's 123 and we divide by 10 If these give us 12 it won't give us 12 point 3 and so if we take that and then we do a mod 10 We'll get the 2 for the tens place and so again we can use that as an index in two digits to get the appropriate code to display that digit So we'll write that and then we want [to] do the hundreds place, and it's going to be the same thing So we'll just go through all 256 values in this case they offset as 512 because we're writing now to this range here where a nine is set in a eight is not set and The place value [of] in binary of a nine is 512 so we just make sure [we] just add that to whatever our value is To put it in that address So value Plus 512 and then digit we're going to index into digits for value Divided by 100 to get to hundreds place and then mod by 10 although that's probably not going to be necessary because we're only going from 0 to 255 so this should only be 0 1 or [2] but we can do that anyway for consistency and So this will write all the [hundredths] place and then for that fourth digit because we do have four digits We just want that last one to be blank so we can do a loop that [just] Writes all zeros to that range, so this will be value plus 768 Because both A 9 and a 8 are set so you take the 256 plus the 512 and you get 768 and Then for that whole range. We're just going to write all zeros because we don't want that digit to display anything we'll just write all zeros and We don't need this loop to write our data So we'll do that, and then you know we can still print the output there So let's upload that and it's programming and it's done and Well, we just printed the first 255 bytes here, but you can see this should just be repeating the [first] 10 Things over and over again, it looks like it. Maybe is but yeah, let's give this a try Let's pull this out and put it into our Circuits we get the eeprom back in the circuit hook up power And we see [it's] cycling through to zero and blank but of course it's not putting the numbers on to the individual displays It's just showing them in sequence. Which is not quite what [we] want, but we're getting there, and so if we give this another number so let's say we give it that example like [that] 123 and you see three [two] one blank three two one blank and So what we want is we want the three here the tool here the one here and the blank there So what we need is some way to sequence through these Displays and for that what I'm going to do is I'm going to use our Counter to then feed into a decoder so to do that. I'm going to use the 74 LS 139 Which is a two to four line? decoder or D multiplexer and so what it does is it's got two inputs say 1 and b 1 and Depending on what those values are you get one of these data outputs? Goes low and so basically you can imagine just this a and B We're going to use our counter here which is counting from 0 through 4 and I nari we're going to use that a and B and It's going to cycle like this from both being low to a being high then b Then both so that's what we've we've already got that [and] then what happens is the outputs it just cycles each of these Going low in turn so just cycles to each of those and then what we can use this to do is is select which Output digit, we're displaying, so [the] way this chip works is pretty simple It's got the two inputs and it's essentially just using a series of [an] gates and inverters To pick based on how these inputs are set which output to turn on So if we put with 74 or less 139 up here, it's pretty simple to hook up We just need to give it power and ground like we do with all [of] these and then it has an enable pin here Pin 15 that's active. Low, so we want that to [be] active. So we'll type in 15 here to ground and Then the inputs are just [pins] 14 and 13 And I'm just using the top one because we're coming from from over here So stay on that side of the board so I'll just hook these two To those inputs so now let's take a look at the outputs which are on pins 9 10 11 and 12 And so you can see the outputs of this decoder You've got all of the outputs on except for one and the one that goes off corresponds to our input as we're counting This is very convenient and [is] also the reason that I used the common Caso displays because what we can do is we can hook these outputs up to the cathodes here rather than just [hi] all the cathodes to ground and That way the only cathode that will actually be hooked to ground Will be the one that we want to be displaying for example instead of connecting the ones place Cathode directly the ground to this resistor if I connect it to this first output here You'll see the ones place is only on When we're displaying that three and the three is what should be in the ones place, [so] in other words we're both displaying the correct digit and Putting the correct address into the eeprom to display that place value at the same time and so I can do the same thing for the tens place instead of connecting that directly to ground through that resistor I can connect it to the second sitting here And so now you see the one the tens place only shows up when we have a two there and remember the input here is is 123 So we get the two in the tens place? We get the three in the ones place just as we should and then the hundreds place Same thing rather than connecting that directly to ground we can connect it to this place here, and so now we only see the one When we're addressing the location in the eeprom for the hundreds place, and then finally [this] fourth digit We can do the same thing although We shouldn't see much there because remember we programmed all zeros Into that last block of memory and so now we've got the right digits in the right places but this isn't quite what we want right because we want our display to actually show us a Number we don't want to have to read it like this This is kind of kind of Janky, but [what] we can do is adjust the speed of our clock and so if I replace the 100k resistor with a 100k potentiometer [I] Can start to increase the speed by turning that potentiometer? And what you'll see is as it gets faster and faster it looks more like 123, and if I go fast enough You can't even tell that it's flashing like that So that's basically our display now instead of sticking this pot in here. I'm going to put the hundred K resistor back So now another way to slow this down is instead of using this 2 Micro Farad capacitor. I'm going to replace that With a 10 nano farad capacitor instead and that's going to give us a similar kind of effect and with it running this speed We don't really need any of these leds. They're not showing us anything interesting so I'm going to pull all those out as well [I'm] also going to clean up these wires here and just replace them with wires that are cut to length And so there we go We've got our 8 inputs here and we can switch these two different values and We get the decimal representation of whatever input is down here on our display Now we've also got this last address line that We could do something interesting with so right now if we take that [high] we just get all ones on everything because we haven't programmed The other half of this chip so we could actually have two different types of display we could program the first half of the chip the way we have four decimal display and Then the second half of the chip could be programmed with some other kind of display It could be hexadecimal if you want to do that or What I think would be interesting [and] since we have this fourth digit is You could program the second half of the chip to show negative numbers or more specifically you could you could have a decode two's complement numbers which could be positive or negative two's complement uses an 8-bit number to represent numbers from between Negative 128 up to a positive 127 and [so] we can use this first digit to show the negative sign if we need to So to display in in two's complement. We want to basically do the same thing, but instead of Right now we're programming values from the Rivermen memory locations essentially from 0 through 10 23 because this is going to be 255 plus 768 10 23 So we're programming simply the whole first half of the chip with our normal Unsigned integers and so for the signed integers that use the two's complement. We're going to start at Memory location 1024 so to program that we're going to want to go value from negative 128 oh you know what I just realized we might have a bug because look at this we're going from zero [to] values less than 255 so we might not actually be programming 255 so let's let's actually give that a try. Let's go back here Set this to here and let's try looking at position 255. I bet it's not programmed properly so if we go to Let's see that's 254 and if we change this to 1. Yeah look at that. We didn't program 255 because we said less than 255 so we need to do less than or equal to for all of these I'm glad I caught that Now if we come back down to here so our value is going to go from Negative 4 to [complement] our value is going to go from negative 128 to positive 127 and again Our our address is going to start at 1024 [but] we don't want to add value to it right because values start to negative 128 so if we add that to 1024 we're actually going to be writing [partway] into into this Area before so what we can do is we can take Value and cast it to a byte. So what this will do is it will take Value and treat it as an unsigned byte So it's if value has negative 128 in it then this will say well negative 128 is represented as a byte as 1 followed by seven zeros because that's how yeah, because this is going to use two's complement to represent that so this should take value and and Using a tooth compliment convert it to an 8-bit byte Which which should be a positive number? And then we'll use that as our as our address and then what we want to write there is Essentially the same thing as we have here digits For value Mod 10, but what I want to do is I want to take the absolute value of this So if it's you [know] that's negative 123 then this will take the absolute value of that and give us 123 and before we mod by 10 and look at the last digit if now I can move on to the tens place again It's going to go from 128 to 120 or negative 128 to 127 and basically the same thing But of course we're going to divide value by 10 first 2 gets tens place and our base here instead of being 1024 is going to be 12 8 right it's 1024 plus 256 and then for our hundreds place We can just copy this again, and so this will be divided by hundred to get our hundreds place and this will be 1280 Plus 256 which is 1536 and so that'll be our hundreds place And then we just need to do that fourth digit there which before we just set all [zeros] But in this case we could use [that] to Represent our sign by setting a negative sign there until we want to do is if if our value is negative so if value is less than Zero, so if it's negative then we want to write to our address so take value and cast it to a byte to get a positive two's complement representation of our value and Then here are off that's going to be 1536 plus 256 which is 1792 and so if it's negative we want to write a believe a 1 right, so one should be This should be the one That last bit should be segment g which which is the one in the middle that would look [like] a negative sign? and Otherwise if it's Nonzero we want to write to that location plus 1792 in [this] case we [just] want to write [0] we want to display to be blank if it's positive [and] I think that should do it Yeah, and I'm going [to] add one of the things. I'm just going to add some Some print lines here so we can just keep track of what it's doing well It's programming because it's programming the entire a eeprom where we're programming all all 2048 memory locations into CD promised over it's going to take a little while So I'll add these print lines so that it's easier to see what's going on [ok] so that should be it, so let's go ahead and upload this Ok our serial monitor, and this is taking a little while speed this up for you, and it's done So let's pop the eeprom back in our circuit here, so if you got our 255 here So that's fine, and so this should work [just] just normally so you know if we set some other values here 127 Or you know 123 122 123 so this is this is working normally And these values obviously are lower than 128, but if we go up to you know 251 that's going to be positive [so] because we've got this bit low, but [if] we want to look at our two's complement, and we set this bit high now We're looking at two's complement. So anything below 127 Or 128 should be the same so any of these other values should be the same if we set this high bit now to Something now. We've got a negative number, so this is negative 13 So let's see if we're in binary and we put in 1 1 1 1 0 0 1 1 in binary We convert that to decimal we get 243 and so that would be normally what it is So if we go to our normal mode so yeah, that's 243 if we go to two's complement Yeah, negative 13 so that's right. So we are getting we are getting the right thing And we can try some other things let's just I'm just going to move these around to just sort of some random Things we've got negative 46 in there. I don't know negative 62 let's say so this is 1 1 0 0 0 0 1 0 so if we go to decimal yep, negative 62 and then if we're in unsigned mode That should be 194 [yep], so it looks like this is programmed right and working now We've got an option where if we set this low We have a normal sort of unsigned mode, so this this will just represent numbers from 0 to 255 But if we set this high then our output will show us numbers from negative 128 Up to 127 and depending what we're using the computer for we may want one of those Output modes or the other and we can set that using this this input here So I [think] they're pretty much does it for our 8-bit display here so we've got [8] bits coming in and we're able to display it either is a Signed two's complement or unsigned and we did it with only a single 28c 16 ye prom So I think that's quite an improvement over the last time I built one of these where I use three of these one for each digit and we've got a Two's complement signs mode as well
A2 初級 為我們的8位計算機建立一個8位十進制顯示器。 (Build an 8-bit decimal display for our 8-bit computer) 10 0 林宜悉 發佈於 2021 年 01 月 14 日 更多分享 分享 收藏 回報 影片單字