这个程序里面搭配了火焰检测模块,使用的是ADC0,AD转换,显示的电压值可以根据光谱亮度进行变动。网上的1602字库,大多用汇编语言编写,可移植性太低。我这个是用C语言编写的。1602的字库,你们可以看到,显示了中文“月”与“工”。
#include "iom16v.h"
#include "macros.h"
#include "led.h"
#define uint unsigned int
#define uchar unsigned char
#define D0 PORTD=PORTD&0xbf;
#define D1 PORTD=PORTD|0x40;
unsigned char const lcd1602[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
unsigned char const lcd1602_yue[]={0x0e,0x0a,0x0e,0x0a,0x0e,0x0a,0x12,0x00};
unsigned char const lcd1602_gong[]={0x1f,0x04,0x04,0x04,0x04,0x04,0x1f,0x00};
uint constant1=0,a1=0,a2=0,a3=0,a4=0;
void add_gong() //自造字库“工”
{
int a,b;
for (a=0x48;a<=0x4f;a++)
{
PORTB=a;
enable_lcd();
b=a&0x07;
PORTB=lcd1602_gong[b];
data();
}
}
void add_yue() //自造字库“月”
{
int a=0x40,b;
for (a=0x40;a<0x48;a++)
{
PORTB=a;
enable_lcd();
b=a&0x0f;
PORTB=lcd1602_yue[b];
data();
}
}
void delay(unsigned long a)
{
while(a--);
}
void enable_lcd()
{
PORTD=PORTD&0xcf;
D0;
delay(400);
D1;
}
void data()
{
PORTD=PORTD&0xdf;
PORTD|=0x10;
D0;
delay(400);
D1;
}
void initial()
{
DDRA&=0xfe;//PA0设置为输入 ADC0输入部分
DDRA|=0x40;
PORTA|=0x40;
DDRD|=0x70;//PD4-6设置为输出 1602显示部分 不许改动
D1;
DDRB=0xff;//PB0-7设置为输出 1602显示部分
}
void displayinitial()
{
PORTB=0x00;//清显示
enable_lcd();
PORTB=0x06;//光标右移
enable_lcd();
PORTB=0x10;;//移动光标
enable_lcd();
PORTB=0x38;//4位总线,双行显示,5X7点阵字符
enable_lcd();
PORTB=0x80;//显示从第一行第二个开始
enable_lcd();
PORTB=0x0C;//开显示
enable_lcd();
}
void display1()
{
PORTB=0x80;
enable_lcd();
PORTB='V';
data();
PORTB='o';
data();
PORTB='l';
data();
PORTB='t';
data();
PORTB='a';
data();
PORTB='g';
data();
PORTB='e';
data();
PORTB=':';
data();
PORTB=lcd1602[a1];
data();
PORTB='.';
data();
PORTB=lcd1602[a2];
data();
PORTB=lcd1602[a3];
data();
PORTB=lcd1602[a4];
data();
PORTB='V';
data();
PORTB=0x00;
data();
PORTB=0x01;
data();
}
unsigned int adc()
{
uint a,b;
ADMUX=0x40;//内部REF关闭,直接使用外接的REF,右对齐,选择ADC0
ADCSRA=0xd8;//ADC使能,ADC开始转换,ADIF置位1,ADIE使能,2分频
do
{
;
}
while(ADCSRA&0x10!=0);
a=ADCL;
b=ADCH&0x03;
a=a+b*256;
return a;
}
void main()
{
unsigned int a;
initial();
displayinitial();
add_yue();
add_gong();
display1();
display(0);
strobe(5);
while(1)
{
a=adc();
constant1=a*4.98/1024*1000;
a1=constant1/1000;
a2=constant1%1000/100;
a3=constant1%1000%100/10;
a4=constant1%10;
display1();
delay(1000);
display(a2);
if (constant1<2460) PORTA&=0xbf;
else PORTA|=0x40;
}
}
自造字库,是安插在程序中,感兴趣的朋友,可以研究下。有不明白的地方,欢迎加我QQ:271715999