⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 atmega16l-ad.c

📁 本程序可以用于测试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 + -