📄 atmega16l-ad.c
字号:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#define uchar unsigned char
#define DI1 PORTD|=_BV(0);
#define DI0 PORTD&=~_BV(0);
#define RW1 PORTD|=_BV(1);
#define RW0 PORTD&=~_BV(1);
#define E1 PORTD|=_BV(2);
#define E0 PORTD&=~_BV(2);
#define CS1_1 PORTD|=_BV(4);
#define CS1_0 PORTD&=~_BV(4);
#define CS2_1 PORTD|=_BV(5);
#define CS2_0 PORTD&=~_BV(5);
#define RST1 PORTD|=_BV(6);
#define RST0 PORTD&=~_BV(6);
uchar table[4]={0,0,0,0};//存放LCD液晶的显示数字
static uchar D100[16]={
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00};
static uchar D101[16]={
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00};
static uchar D102[16]={
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00};
static uchar D103[16]={
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00};
static uchar D104[16]={
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00};
static uchar D105[16]={
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00};
static uchar D106[16]={
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00};
static uchar D107[16]={
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00};
static uchar D108[16]={
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00};
static uchar D109[16]={
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00};
static uchar D149[16]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00};
void init(void);
void adc_init(unsigned char adc_channel);
void lcdClear(void);
void lcdRaadState(void);
void lcdCommand(uchar command); //发送命令字
void lcdOpen(void); //打开LCD
void lcdStartLine(uchar line); //设置起始行
void lcdSetPage(uchar page); //设置页地址
void lcdSetRow(uchar row); //设置列地址
void lcdWrite(uchar dat); //写显示数据
void lcdDisplay8x16 (uchar A[16] ,uchar page,uchar row,uchar cs); //显示 8X16的字符
void lcdDisplay16x16(uchar A[32],uchar page,uchar row,uchar cs); //显示16X16的字符
void display(void);
int main(void)
{
init();
lcdClear();
ADCSRA|=(1<<ADSC);//开始转换,扫描几次动态显示电路即开中断,使能AD转换
while(1)
display();
}
void init()
{
PORTA=0x00;
DDRA=0x00;//ADC2通道
PORTC=0x00;
DDRC=0xFF;
PORTD=0xFF;
DDRD=0xFF;
MCUCSR=(1<<JTD);
MCUCSR=(1<<JTD);
}
//ADC initialize
void adc_init(unsigned char adc_channel)
{
ADCSRA=0x00;
ACSR=0x80;
ADMUX=(1<<REFS1)|(1<<REFS0)|adc_channel;
ADCSRA=(1<<ADEN)|(0<<ADSC)|(0<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
}
void lcdClear(void)
{
unsigned char i,j;
CS1_0;
CS2_1;
for(j=0;j<8;j++)
{
lcdSetPage(j); /*设置页地址为第j页*/
lcdSetRow(0); /*设置列地址为第0列*/
for(i=0;i<64;i++)
lcdWrite(0x00); /*写数据0x00*/
}
CS1_1;
CS2_0;
for(j=0;j<8;j++)
{
lcdSetPage(j);
lcdSetRow(0);
for(i=0;i<64;i++)
lcdWrite(0x00);
}
}
void lcdRaadState(void)
{
DDRC=0x00;
PORTC=0xFF;
DI0; //将D/I清零
RW1; //将R/W置1
E1; //下降沿
E0;
while(PINC&0x80);
}
void lcdCommand(uchar command)
{
lcdRaadState();
DDRC=0xFF;
DI0;
RW0;
PORTC=command;
E1; //下降沿
E0;
}
void lcdOpen()
{
lcdCommand(0x3f);
}
void lcdStartLine(uchar line)
{
line|=0xc0;
lcdCommand(line);
}
void lcdSetPage(uchar page)
{
page&=0x07;
page|=0xb8;
lcdCommand(page);
}
void lcdSetRow(uchar row)
{ //设置列地址
row&=0x3f;
row|=0x40;
lcdCommand(row);
}
void lcdWrite(uchar dat)
{ //写显示数据
lcdRaadState();
DDRC=0xFF;
DI1;
RW0;
PORTC=dat;
E1; //下降沿
E0;
}
void lcdDisplay8x16 (uchar A[16] ,uchar page,uchar row,uchar cs)
{
uchar i;
if(cs==1)
{
CS1_1;
CS2_0;
}
else
{
CS1_0;
CS2_1;
}
lcdStartLine(0);
lcdSetPage(page);
lcdSetRow(row);
for(i=0;i<8;i++)
lcdWrite(A[i]);
lcdSetPage(page+1);
lcdSetRow(row);
for(i=8;i<16;i++)
lcdWrite(A[i]);
lcdOpen();
}
void lcdDisplay16x16(uchar A[32],uchar page,uchar row,uchar cs)
{
uchar i;
if(cs==1)
{
CS1_1;
CS2_0;
}
else
{
CS1_0;
CS2_1;
}
lcdStartLine(0);
lcdSetPage(page);
lcdSetRow(row);
for(i=0;i<16;i++)
lcdWrite(A[i]);
lcdSetPage(page+1);
lcdSetRow(row);
for(i=16;i<32;i++)
lcdWrite(A[i]);
lcdOpen();
}
void display(void)//显示程序,循环扫描五次
{
uchar i,j=0;
unsigned int adc_value=0,temp=0;
adc_init(MUX1);
for(i=0;i<255;i++)
for(j=0;j<255;j++)
;
for(i=0;i<2;i++)
{
ADCSRA|=(1<<ADSC);
cli();
while((ADCSRA & 0x10)==0);
sei();
ADCSRA |= (1<<ADIF);
temp = ADCL;
temp |= (int)ADCH<<8;
}
for(i=0;i<5;i++)
{
ADCSRA|=(1<<ADSC);
cli();
while((ADCSRA & 0x10)==0);
sei();
ADCSRA |= (1<<ADIF);
temp = ADCL;
temp |= (int)ADCH<<8;
adc_value = adc_value + temp;
}
adc_value = adc_value/5 ;
//value=(value*2.56)/1024;
adc_value=adc_value*10/4;//电压
table[3]=adc_value/1000;
table[2]=adc_value%1000/100;
table[1]=adc_value%100/10;
table[0]=adc_value%10;
ADMUX =0xC2;//|(1<<ADLAR);/ 2.56v 片内基准电压 /select adc input 2
for(i=4;i>0;i--)
{
switch(i)
{
case 1:
j=32;break;
case 2:
j=24;break;
case 3:
j=16;break;
case 4:
j=0 ;break;
default:
break;
}
switch(table[i-1])
{
case 0:
lcdDisplay8x16(D100,2,j+16,1);
break;
case 1:
lcdDisplay8x16(D101,2,j+16,1);
break;
case 2:
lcdDisplay8x16(D102,2,j+16,1);
break;
case 3:
lcdDisplay8x16(D103,2,j+16,1);
break;
case 4:
lcdDisplay8x16(D104,2,j+16,1);
break;
case 5:
lcdDisplay8x16(D105,2,j+16,1);
break;
case 6:
lcdDisplay8x16(D106,2,j+16,1);
break;
case 7:
lcdDisplay8x16(D107,2,j+16,1);
break;
case 8:
lcdDisplay8x16(D108,2,j+16,1);
break;
case 9:
lcdDisplay8x16(D109,2,j+16,1);
break;
default:
break;
}
lcdDisplay8x16(D149,2,24,1);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -