直接使用AVR的ATMega328,也就是说不使用Arudino。
上传程序使用USBASP,之后没有使用FT232RL之类的。
因为实施的方法是先在别的板子上调试(对,实际上是Arudino),然后再上传到实际集成电路中。这样的方法对AVR的芯片都可以,一般语法没有太大区别。
上传时的图
做一个简单的D13 LED测试。
电压显示使用ATMega328自带的模拟输入。使用一个简单的分压电路做出一个可调电路,实际上就是测量变阻器两边的电压。
数字显示,使用4位数字显示。实际使用三位。没有驱动芯片。直接用4路(实际是3路)选择数字,74HC595控制每个数字的显示。也就是靠视觉残留显示出来。
没连线时的图。
连好线了。
相比于一开始做Arduino,现在已经熟练很多了。靠这种实验板到实际电路的转换,如果现在这块面包板是PCB的话,也算是一种成品吧。
实际代码
#define PIN_DATA 6 #define PIN_LATCH 8 #define PIN_CLOCK 10 #define PIN_D_2 4 #define PIN_D_3 3 #define PIN_D_4 2 byte digits[] = {252, 96, 218, 242, 102, 182, 190, 224, 246, 238}; void setup() { Serial.begin(9600); pinMode(PIN_DATA, OUTPUT); pinMode(PIN_LATCH, OUTPUT); pinMode(PIN_CLOCK, OUTPUT); pinMode(PIN_D_2, OUTPUT); digitalWrite(PIN_D_2, HIGH); pinMode(PIN_D_3, OUTPUT); digitalWrite(PIN_D_3, HIGH); pinMode(PIN_D_4, OUTPUT); digitalWrite(PIN_D_4, HIGH); } void loop() { // read voltage int analogValue = analogRead(0); float voltage = 0.0048 * analogValue; byte numbers = voltage * 100; for(byte i = 0; i < 20; i++) { displayNumber(numbers / 100, true, PIN_D_2); displayNumber((numbers % 100) / 10, false, PIN_D_3); displayNumber(numbers % 10, false, PIN_D_4); } } void displayNumber(byte n, bool withPoint, byte pin) { digitalWrite(pin, LOW); digitalWrite(PIN_LATCH, LOW); shiftOut(PIN_DATA, PIN_CLOCK, LSBFIRST, digits[n] + (withPoint ? 1 : 0)); digitalWrite(PIN_LATCH, HIGH); delay(10); digitalWrite(pin, HIGH); }