直接使用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);
}




