You are on page 1of 3

#include <avr/io.

h>
#include <util/delay.h>
#define AREF_MODE 0 //dien ap tham chieu ngoai,chan Vref
#define AVCC_MODE (1<<REFS0) //dien ap tham chieu AVcc
#define ADC_VREF_TYPE AVCC_MODE //dinh nghia kieu dien ap tham chieu
#define cbi(port, bit) (port) &= ~(1 << (bit))
#define sbi(port, bit) (port) |= (1 << (bit))
uint8_t temp; //dinh nghia cac bien tam
uint16_t ADC_val;
uint16_t read_adc(unsigned char adc_channel){ //ham chuyen doi ADC theo kenh dau
vao
ADMUX=adc_channel|ADC_VREF_TYPE;
ADCSRA|=(1<<ADSC);
loop_until_bit_is_set(ADCSRA,ADIF);//lap cho den khi bit ADIF=1
return ADCW; //tra lai gia tri chuyen doi tren ADC
}
char Read2Nib(){
char HNib, LNib;
PORTA |=0xF0;
sbi(PORTC,7); //enable
DDRA &=0x0F; //set 4 bits cao cua PORT DATA lam input
HNib=PINA & 0xF0;
cbi(PORTC,7); //disable
sbi(PORTC,7); //enable
LNib = PINA & 0xF0;
cbi(PORTC,7); //disable
LNib>>=4;
return (HNib|LNib);
}
void waitLcd() {
char temp_val;
while(1){
cbi(PORTC,5); //RS=0, the following data is COMMAND
sbi(PORTC,6); //LCD -> AVR
temp_val=Read2Nib();
if (bit_is_clear(temp_val,7)) break;
}
cbi(PORTC, 6); //ready for next step
DDRA=DDRA|0xF0;//Ready to Out
}
void writeComp(uint8_t Com){ //ghi lenh len LCD
uint8_t HNib, LNib, temp_data;
temp_data=PORTA & 0x0F; //doc 4 bit thap cua PORTD de mask,
cbi(PORTC,5); //xoa RS
cbi(PORTC,6); //xoa R/W
HNib=Com & 0xF0;
LNib=(Com<<4) & 0xF0;
PORTA =(HNib |temp_data);
sbi(PORTC,7); //enable
cbi(PORTC,7); //disable
PORTA =(LNib|temp_data);
sbi(PORTC,7); //enable
cbi(PORTC,7); //disable
waitLcd();
}
void LCD_Init(){ //khoi tao LCD
//DDRD=0xFF;
//writeComp(0x01);
cbi(PORTC,5);
cbi(PORTC,6);
sbi(PORTC,7);
sbi(PORTA,5);
cbi(PORTC,7);
waitLcd();
writeComp(0x28);
writeComp(0x0C);
writeComp(0x06);
}
void writeData(uint8_t Data){ //ghi du lieu len LCD
uint8_t HNib, LNib, temp_data;
temp_data=PORTA & 0x0F; //doc 4 bit thap cua PORTD de mask,
sbi(PORTC,5); //set RS
cbi(PORTC,6); //xoa R/W
HNib=Data & 0xF0;
LNib=(Data<<4) & 0xF0;
PORTA =(HNib |temp_data);
sbi(PORTC,7); //enable
cbi(PORTC,7); //disable
PORTA =(LNib|temp_data);
sbi(PORTC,7); //enable
cbi(PORTC,7); //disable
waitLcd();
}
void homeLcd(){ //dua con tro ve o dau tien cua dong 1
writeComp(0x02);
}
void move_Lcd(uint8_t y,uint8_t x){ //di chuyen con tro den vi tri nao do
uint8_t Ad;
Ad=64*(y-1)+(x-1)+0x80;//tinh do dai ma lenh
writeComp(Ad);
}
void writeString(char* str){ // viet 1 xau len LCD
unsigned char i=0;
while(str[i] !=0){
writeData(str[i]);
i++;
}
}
void writeKetqua(uint16_t Temp) { //viet ket qua len LCD
uint8_t chuc,donvi;
chuc=Temp/10;
donvi=Temp-(10*chuc);
writeData(chuc+48);
writeData(donvi+48);
}
int main(){
//uint16_t temp;
DDRA=DDRA|0xF0;
sbi(DDRC,5);
sbi(DDRC,6);
sbi(DDRC,7);
sbi(DDRC,4);
sbi(DDRC,3);
sbi(PORTC,4);
cbi(PORTC,3);
//DDRC=0XFF;
LCD_Init();
ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<ADPS0); //Enable ADC voi xung nhi
p=xung chip/32
ADMUX=ADC_VREF_TYPE;
move_Lcd(1,1);
writeString("TEMP = ");
while(1){
ADC_val=read_adc(0);
temp=ADC_val*500/1023;
move_Lcd(1,9);
writeKetqua(temp);
}
return 0;
}

You might also like