Document 3
Document 3
.INCLUDE "M32DEF.INC"
.DEF COUNT=R20
.ORG 0
LDI R16,HIGH(RAMEND)
OUT SPH,R16
LDI R16,LOW(RAMEND)
OUT SPL,R16
LDI COUNT,0
BACK:
CALL DISPLAY
RJMP BACK
DISPLAY:
INC COUNT
OUT PORTB,COUNT
CALL DELAY
RET
DELAY:
LDI R16,0X01
AGAIN:
NOP
NOP
NOP
DEC R16
BRNE AGAIN
RET
6.Toggle bit 2 of port B using bit manipulation commands with delay.
.INCLUDE "M32DEF.INC"
SBI DDRB,2
AGAIN:
SBI PORTB,2
CALL DELAY
CBI PORTB,2
CALL DELAY
RJMP AGAIN
DELAY:
LDI R16,0X02
AGAIN1:
NOP
NOP
NOP
DEC R16
BRNE AGAIN1
RET
7. An led is connected to each pin of port D. Turn on each led from D0 to D7. Call a delay subroutine
before turn on the next LED
.INCLUDE "M32DEF.INC"
LDI R20,HIGH(RAMEND)
OUT SPH,R20
LDI R20,LOW(RAMEND)
OUT SPL,R20
LDI R20,0xFF
OUT DDRD,R20
SBI PORTD,0
CALL DELAY
SBI PORTD,1
CALL DELAY
SBI PORTD,2
CALL DELAY
SBI PORTD,3
CALL DELAY
SBI PORTD,4
CALL DELAY
SBI PORTD,5
CALL DELAY
SBI PORTD,6
CALL DELAY
SBI PORTD,7
CALL DELAY
DELAY:
LDI R21,0xFF
AGAIN: NOP
LDI R22,0XFF
AGAIN1: NOP
NOP
NOP
DEC R22
BRNE AGAIN1
DEC R21
BRNE AGAIN
RET
8. Keep monitoring PB2 bit until it becomes high. When PB2 becomes high write the value $45 to port C
and send a HIGH to LOW pulse to PD3.
INCLUDE "M32DEF.INC"
SBI DDRB,2
LDI R16,0Xff
OUT DDRC,R16
SBI DDRD,3
AGAIN:SBIS PINB,2
RJMP AGAIN
LDI R16,0x45
OUT PORTC,R16
SBI PORTD,3
CALL DELAY
CBI PORTD,3
CALL DELAY
DELAY:
LDI R21,0xFF
AGAIN: NOP
LDI R22,0XFF
AGAIN1: NOP
NOP
NOP
DEC R22
BRNE AGAIN1
DEC R21
BRNE AGAIN
RET
9. Assume that bit PB3 is an input and represent the condition of a door alarm, if it goes low it means
that the door is open,monitor the bit continuously when-ever it goes low. Send a high or low pulse for
port PC5 to turn on a buzzer.
INCLUDE "M32DEF.INC"
CBI DDRB,3
SBI DDRC,5
HERE:
SBIC PINB,3
RJMP HERE
SBI PORTC,5
CALL DELAY
CBI PORTC,5
CALL DELAY
RJMP HERE
DELAY:
LDI R21,0xFF
AGAIN: NOP
LDI R22,0XFF
AGAIN1: NOP
NOP
NOP
DEC R22
BRNE AGAIN1
DEC R21
BRNE AGAIN
RET
10. Send value for ASCII character 0, 1, 2, 3, 4, 5, A, B, C, and D to port C
#include <avr/io.h>
int main(void)
unsigned char z;
DDRC=0xff;
for(z=0;z<10;z++)
PORTC=myList [z];
while(1);
return 0;
}
11: Toggle all the bits of Port B 200 times using delay function (_dealy_ms).
#include <avr/io.h>
#include <util/delay.h>
int main(void)
DDRB=0xFF;
unsigned char x;
for(x=0;x<=200;x++){
PORTB=0xFF;
17
_delay_ms(1000);
PORTB=0x00;
_delay_ms(1000);
return 0;
}
12. Write an AVR C program to send values of -4 to +4 to port B.
#include <avr/io.h>
#include <avr/delay.h>
int main(void)
unsigned char z;
DDRB=0xff;
for(z=0;z<=8;z++) {
PORTB=myList[z];
_delay_ms(1200);
while(1);
return 0;
}
13. Write an AVR C program to toggle only bit 4 of Port B continuously without disturbing the rest of the
pin of Port B.
#include <avr/io.h>
#include <avr/delay.h>
int main(void)
DDRB=0xff;
while(1)
PORTB=PORTB|0b00010000;
// _delay_ms(200);
PORTB=PORTB&0b11101111;
// _delay_ms(200);
return 0;
}
14. Write an AVR program to monitor bit 5 of port C, if it is high send 55H to port B otherwise AAH to
port B.
#include <avr/io.h>
#include <avr/delay.h>
int main(void)
DDRC=0x00;
DDRB=0xFF;
while(1)
if(PINC &0b00100000)
_delay_ms()
PORTB=0x55;
else
PORTB=0xAA;
_delay_ms()
return 0;
}
15. Write an AVR C program to convert ASCII digits of ‘4’ and ‘7’ to packed BCD and display them on
PORTB.
#include <avr/io.h>
int main(void)
DDRB = 0xff;
w=w&0x0f;
w=w<<4;
z=z&0x0f;
bcdbyte=w|z;
PORTB = bcdbyte;
return 0;
}
16: Write an AVR C program to send out the value 44H serially one bit at a time via port C, pin 3. The
MSB should go out first.
#include <avr/io.h>
#include <avr/delay.h>
#define pin 3
int main(void)
unsigned char x;
regalsb = conbyte;
DDRC |= (1<<pin);
for (x=0;x<8;x++)
PORTC |= (1<<pin);
else
//_delay_ms(1000);
return 0;
}
17.Write an AVR C program to create a square wave of 50% duty cycle on the Port B.5 bit. Timer 0 is
used to generate the time delay in normal mode. Analyze the program.
#include <avr/io.h>
int main()
DDRB=0b00100000;
TCCR0=0X01;
TCNT0=0;
PORTB = PORTB|0B00100000;
while(1)
if(TCNT0==255)
PORTB=~PORTC;
TCNT0=0;
return 0;
}
18 : Write an AVR C program to create a square wave of 50% duty cycle on the Port B.5 bit. Timer 0 is
used to generate the time delay in CTC mode. Analyze the program.
#include <avr/io.h>
int main()
DDRB=0b00100000;
TCCR0=0X09;
TCNT0=0;
OCR0=100;
PORTB = PORTB|0B00100000;
while(1)
if(TCNT0==OCR0)
PORTB=~PORTB;
TCNT0=0;
return 0;
}
19. LCD Interfacing with AVR.
#include <avr/io.h>
void delay (char x);
void lcd_command (char c);
void lcd_data (char d);
int main(void)
{
DDRC=0xFF;
DDRD=0xFF;
lcd_command(0X38);
lcd_command(0X80);
lcd_command(0X0C);
lcd_command(0X06);
lcd_command(0X01);
delay(5);
lcd_data('A');
while(1)
{
}
}
void delay (char x)
{
int i,j;
for(j=0;j<x;j++)
for(i=0;i<3000;i++);
}
void lcd_command(char c)
{
PORTC=c;
PORTD&=~(1<<6);
PORTD|=(1<<7);
delay(2);
PORTD&=~(1<<7);
}
void lcd_data(char d)
{
PORTC=d;
PORTD|=(1<<6);
PORTD|=(1<<7);
delay(2);
PORTD&=~(1<<7);
}
21. Sensor Interfacing with AVR.
#include <avr/io.h>
void delay (char x);
void lcd_command (char c);
void lcd_data (char d);
void lcd_puts (const char *p);
void dec_con (char u);
char con[4];
char temp=0;
int main(void)
{
DDRA=0X00;
DDRC=0xFF;
35
DDRD=0xFF;
ADCSRA=0X87;
ADMUX=0X60;
lcd_command(0X38);
lcd_command(0X80);
lcd_command(0X0C);
lcd_command(0X06);
lcd_command(0X01);
delay(5);
lcd_puts(" ARVIN ");
lcd_command(0Xc0);
lcd_puts("Temperature: ");
while(1) {
ADCSRA|=(1<<ADSC);
while((ADCSRA&(1<<ADIF))==0);
temp=(ADCH*500)/256;
dec_con(temp);
lcd_command(0xCD);
lcd_puts(con);
}
}
void delay (char x) {
int i,j;
for(j=0;j<x;j++)
for(i=0;i<3000;i++);
}
void lcd_command(char c) {
PORTC=c;
PORTD&=~(1<<6);
PORTD|=(1<<7);
delay(2);
PORTD&=~(1<<7); }
void lcd_data(char d) {
PORTC=d;
PORTD|=(1<<6);
PORTD|=(1<<7);
delay(2);
PORTD&=~(1<<7); }
void lcd_puts(const char *p)
36
{
while(*p)
{
lcd_data(*p++);
}
}
void dec_con(char u)
{
con[3]='\0';
con[2]=(u%10)+0x30;
u=u/10;
con[1]=(u%10)+0x30;
con[0]=(u/10)+0x30;
}