#include <DallasTemperature.h>
#include <OneWire.h>
#define ONE_WIRE_BUS 9
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
unsigned char LED_0F[] =
{// 0 1 2 3 4 5 6 7 8 9 A b C d E F -
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8C,0xBF,0xC6,0xA1,0x86,0xFF,0xbf
};
unsigned char LED[4]; //用于LED的4位显示缓存
int SCLK = 4;
int RCLK = 3;
int DIO = 2; //这里定义了那三个脚
int a;
int b;
int c;
int d;
void setup ()
{
pinMode(SCLK,OUTPUT);
pinMode(RCLK,OUTPUT);
pinMode(DIO,OUTPUT); //让三个脚都是输出状态
Serial.begin(9600);
Serial.println("Demo");
sensors.begin();
}
void loop()
{
Temperatures();
LED[3]=d;
LED[2]=a;
LED[1]=b;
LED[0]=12;
LED4_Display ();
Serial.println("TEXT");
}
void Temperatures()
{
Serial.print("Requesting temperatures...");
sensors.requestTemperatures();
Serial.println("DONE");
Serial.print("Temperature for the device 1(index 0) is:");
Serial.println(sensors.getTempCByIndex(0));
c=sensors.getTempCByIndex(0);
a=c/10;
b=c%10;
if (c>=0)
{
d=0;
}
else
{
d=16;
}
}
void LED4_Display ()
{
unsigned char *led_table; // 查表指针
unsigned char i;
//显示第1位
led_table = LED_0F + LED[0];
i = *led_table;
LED_OUT(i);
LED_OUT(0x01);
digitalWrite(RCLK,LOW);
digitalWrite(RCLK,HIGH);
delay(500);
//显示第2位
led_table = LED_0F + LED[1];
i = *led_table;
LED_OUT(i);
LED_OUT(0x02);
digitalWrite(RCLK,LOW);
digitalWrite(RCLK,HIGH);
delay(500);
//显示第3位
led_table = LED_0F + LED[2];
i = *led_table;
LED_OUT(i);
LED_OUT(0x04);
digitalWrite(RCLK,LOW);
digitalWrite(RCLK,HIGH);
delay(500);
//显示第4位
led_table = LED_0F + LED[3];
i = *led_table;
LED_OUT(i);
LED_OUT(0x08);
digitalWrite(RCLK,LOW);
digitalWrite(RCLK,HIGH);
delay(500);
}
void LED_OUT(unsigned char X)
{
unsigned char i;
for(i=8;i>=1;i--)
{
if (X&0x80)
{
digitalWrite(DIO,HIGH);
}
else
{
digitalWrite(DIO,LOW);
}
X<<=1;
digitalWrite(SCLK,LOW);
digitalWrite(SCLK,HIGH);
}
}
这个4位数码管只能从右到左依次显示,不能4位同时显示,做了个温度计,不能一起显示看起来很累啊,试了修改void LED4_Display ()里的延迟函数不管用,改到最小就闪的更快了,什么也看不清,改大了能显示清楚就是一位一位的显示。求问大神怎么改这个程序? |