📄 main.c
字号:
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/eeprom.h>
#define uchar unsigned char
#define uint unsigned int
#define RS_CLR PORTB &= ~(1 << PB2)
#define RS_SET PORTB |= (1 << PB2)
#define RW_CLR PORTB &= ~(1 << PB1)
#define RW_SET PORTB |= (1 << PB1)
#define EN_CLR PORTB &= ~(1 << PB0)
#define EN_SET PORTB |= (1 << PB0)
uchar table[]={'0','1','2','3','4','5','6','7','8','9'};
// 显示用指针变量
char *line1;
char *line2;
char *line3;
char *line4;
uchar v;
uchar nb,ns,ng;
void num_do(uchar d)
{
nb=d/100;
ns=(d%100)/10;
ng=(d%100)%10;
}
void IO_INT(void)
{
DDRB=0xff;
PORTB=0xff;
DDRD=0xff;
PORTD=0xff;
PORTC |= (1 << PC1);
ADMUX = (1<<REFS0);
ADCSRA = (1<<ADEN)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1);
}
void busy_check(void)
{
uchar i;
PORTD=0Xff;
while(1)
{
RS_CLR;
RW_SET;
EN_SET;
i=PIND;
EN_CLR;
if((i&0X80)==0X00)
asm("nop");
asm("nop");
break;
}
}
void wcom(uchar com)//并口写命令
{
busy_check();
RS_CLR;
RW_CLR;
EN_SET;
asm("nop");
PORTD=com;
asm("nop");
EN_CLR;
}
void wdata(uchar dat)//并口写数据
{
busy_check();
RS_SET;
RW_CLR;
EN_SET;
asm("nop");
PORTD=dat;
asm("nop");
EN_CLR;
}
void initlcd(void)
{
wcom(0x30);//基本指令
wcom(0x0c);//0000,1100 游标显示关
wcom(0x02);//0000,0010 显示RAM 地址归位
wcom(0x80);//1000,0000 设定显示RAM 地址到地址计数器
wcom(0x06);//右移位
wcom(0x0c);//开显示
}
void clear(void)
{
wcom(0x30);
wcom(0x01);//clear
}
void display(void)
{
wcom(0x80);
while( *line1!=0x00 )
{
wdata(*line1);
line1++;
}
wcom(0x90);
while( *line2!=0x00 )
{
wdata(*line2);
line2++;
}
wcom(0x88);
while( *line3!=0x00 )
{
wdata(*line3);
line3++;
}
wcom(0x98);
while( *line4!=0x00 )
{
wdata(*line4);
line4++;
}
//line1 = "";
// line2 = "";
// line3 = "";
// line4 = "";
}
void system_init(void)
{
line1 = "";
line2 = "";
line3 = "";
line4 = "";
initlcd();
clear();
}
uchar get_ad(void)
{ uchar i;
ADMUX = 0x60; /*基准AVCC、左对齐、通0*/
ADCSRA = 0xC2; /*使能、开启、4分频*/
ADMUX = 0x67; /*基准AVCC、左对齐、通道7*/
ADCSRA = 0xC2; /*使能、开启、4分频*/
while(!(ADCSRA & (1 << ADIF))); /*等待*/
i=ADCH;
ADCSRA &= ~(1 << ADIF); /*清标志*/
ADCSRA &= ~(1 << ADEN); /*关闭转换*/
return i;
}
int main(void)
{
uchar i;
IO_INT();
system_init();
PCICR=0x03;
PCIFR=0x03;
PCMSK1=0x02;
PCMSK0=0x40;
sei();
while(1)
{
get_ad();
i=get_ad();
v=i;
num_do(v);
wcom(0x94);
wdata(table[nb]);
wcom(0x95);
wdata(table[ns]);
wcom(0x96);
wdata(table[ng]);
line1 = "AVR_ATmega48 PRO";
line2 = "ADC-7 V=";
display();
PORTB |=(1 << PB7);
_delay_ms(255);
_delay_ms(255);
PORTB &=~(1 << PB7);
}
}
ISR(PCINT1_vect)
{
line3 = "写入V=";
display();
num_do(v);
wcom(0x8b);
wdata(table[nb]);
wcom(0x8c);
wdata(table[ns]);
wcom(0x8d);
wdata(table[ng]);
eeprom_write_byte (0x00,v);
}
ISR(PCINT0_vect)
{
uchar i;
line4 = "读出V=";
display();
i=eeprom_read_byte (0x00);
num_do(i);
wcom(0x9b);
wdata(table[nb]);
wcom(0x9c);
wdata(table[ns]);
wcom(0x9d);
wdata(table[ng]);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -