با سلام خدمت شما دوستان محترم.من دو تا مشکل کوچیک داشتم تو این برنامم که یکی این که چجوری فرکانس ورودیم از 1k-400khz تغییر کنه و دوم این که خروجی دومم مکمل اولی باشه با همون فرکانس ورودی و دیوتی سایکل.اینم برنامه :
#include <mega16.h>
#include <delay.h>
#asm
.equ __lcd_port=0x1B ;// PORTA
#endasm
9
#include <lcd.h>
#include <stdlib.h>
#include <stdio.h>
#define c1 PINC.4
#define c2 PINC.5
#define c3 PINC.6
#define c4 PINC.7
flash char row[]={0xfe,0xfd,0xfb,0xf7};
flash char data_key[]={
'1','2','3','A& #039;,
'4','5','6','B& #039;,
'7','8','9','C& #039;,
'*','0','#','D& #039;};
unsigned char ac,table;
unsigned int r;
unsigned char DutyCycle1[]="00";
unsigned char freq1[]="00000";
unsigned char fn1,dn1,control=1;
unsigned int DC1,F1,bottom1;
float helper=0.0;
//__________________________________________________ ___
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCCR0=0x00;
TCNT0=bottom1;
TCCR0=0x6B;
}
//__________________________________________________ ___
void keypad(void)
{
char lcd_buffer[32];
lcd_clear();
_lcd_ready();
_lcd_write_data(0x0f);
lcd_gotoxy(2,1);
lcd_putsf("F1="
;
lcd_puts(freq1);
lcd_putsf("HZ"
;
lcd_gotoxy(0,0);
lcd_putsf("freq1="
;
while (1)
{
for (r=0;r<4;r++)
{
ac=4;
PORTC=row[r];
delay_ms(1);
if (c1==0) ac=0;
if (c2==0) ac=1;
if (c3==0) ac=2;
if (c4==0) ac=3;
if (!(ac==4)){
table=data_key[(r*4)+ac];
//------------------------------------
if(table>='0' && table<='9'
{
10
if(control==1 && fn1<5)
{
freq1[fn1++]=table;
freq1[fn1++]='\0';
fn1--;
lcd_putchar(table);
}
if(control==2 && dn1<2)
{
DutyCycle1[dn1++]=table;
DutyCycle1[dn1++]='\0';
dn1--;
lcd_putchar(table);
}
}
//-----------------------------------
if(table=='#'
{
if(++control==3) control=1;
lcd_clear();
_lcd_ready();
_lcd_write_data(0x0f);
switch(control){
case 1 :
lcd_gotoxy(2,1);
lcd_putsf("F1="
;
lcd_puts(freq1);
lcd_putsf("HZ"
;
lcd_gotoxy(0,0);
lcd_putsf("freq1="
;
break;
case 2 :
lcd_gotoxy(4,1);
lcd_putsf("D.C1=%"
;
lcd_puts(DutyCycle1);
lcd_gotoxy(0,0);
lcd_putsf("DutyCycle1=%"
;
break;
}
fn1=0;
dn1=0;
}
//-----------------------------------------
if(table=='*'
{
F1=atoi(freq1);
DC1=atoi(DutyCycle1);
helper=(256.0)-((8000000.0)/(64.0*F1));
bottom1=helper;
TCNT0=bottom1;
helper=((DC1/100.0)*(256.0-bottom1))+bottom1;
OCR0=helper;
TCCR0=0x6B;
goto exit;
}
//---------------------------------------
11
while (c1==0){}
while (c2==0){}
while (c3==0){}
while (c4==0){}
delay_ms(50);
}
}
}
exit:
PORTC=0xF7;
control=1;
fn1=0;
dn1=0;
sprintf(lcd_buffer,"F=%uHZ DC=%%%u ",F1,DC1);
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts(lcd_buffer);
}
//__________________________________________________ _______
void main(void)
{
PORTC=0xF7;
DDRC=0x0f;
PORTB.3=0;
DDRB.3=1; //OC0 output
TIMSK=0x01;
lcd_init(16);
lcd_gotoxy(0,0);
lcd_putsf("press ~Enter"
;
#asm("sei"
while(1)
{
if(c4==0)
{ //if Key <Enter> press of Keypad
delay_ms(100);
if(c4==0)
{
while(c4==0); //for key to be set free
keypad(); //Call Function Scan Keypad
}
}
};
}
با تشکر از شما دوستان :smile:
#include <mega16.h>
#include <delay.h>
#asm
.equ __lcd_port=0x1B ;// PORTA
#endasm
9
#include <lcd.h>
#include <stdlib.h>
#include <stdio.h>
#define c1 PINC.4
#define c2 PINC.5
#define c3 PINC.6
#define c4 PINC.7
flash char row[]={0xfe,0xfd,0xfb,0xf7};
flash char data_key[]={
'1','2','3','A& #039;,
'4','5','6','B& #039;,
'7','8','9','C& #039;,
'*','0','#','D& #039;};
unsigned char ac,table;
unsigned int r;
unsigned char DutyCycle1[]="00";
unsigned char freq1[]="00000";
unsigned char fn1,dn1,control=1;
unsigned int DC1,F1,bottom1;
float helper=0.0;
//__________________________________________________ ___
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCCR0=0x00;
TCNT0=bottom1;
TCCR0=0x6B;
}
//__________________________________________________ ___
void keypad(void)
{
char lcd_buffer[32];
lcd_clear();
_lcd_ready();
_lcd_write_data(0x0f);
lcd_gotoxy(2,1);
lcd_putsf("F1="

lcd_puts(freq1);
lcd_putsf("HZ"

lcd_gotoxy(0,0);
lcd_putsf("freq1="

while (1)
{
for (r=0;r<4;r++)
{
ac=4;
PORTC=row[r];
delay_ms(1);
if (c1==0) ac=0;
if (c2==0) ac=1;
if (c3==0) ac=2;
if (c4==0) ac=3;
if (!(ac==4)){
table=data_key[(r*4)+ac];
//------------------------------------
if(table>='0' && table<='9'

{
10
if(control==1 && fn1<5)
{
freq1[fn1++]=table;
freq1[fn1++]='\0';
fn1--;
lcd_putchar(table);
}
if(control==2 && dn1<2)
{
DutyCycle1[dn1++]=table;
DutyCycle1[dn1++]='\0';
dn1--;
lcd_putchar(table);
}
}
//-----------------------------------
if(table=='#'

{
if(++control==3) control=1;
lcd_clear();
_lcd_ready();
_lcd_write_data(0x0f);
switch(control){
case 1 :
lcd_gotoxy(2,1);
lcd_putsf("F1="

lcd_puts(freq1);
lcd_putsf("HZ"

lcd_gotoxy(0,0);
lcd_putsf("freq1="

break;
case 2 :
lcd_gotoxy(4,1);
lcd_putsf("D.C1=%"

lcd_puts(DutyCycle1);
lcd_gotoxy(0,0);
lcd_putsf("DutyCycle1=%"

break;
}
fn1=0;
dn1=0;
}
//-----------------------------------------
if(table=='*'

{
F1=atoi(freq1);
DC1=atoi(DutyCycle1);
helper=(256.0)-((8000000.0)/(64.0*F1));
bottom1=helper;
TCNT0=bottom1;
helper=((DC1/100.0)*(256.0-bottom1))+bottom1;
OCR0=helper;
TCCR0=0x6B;
goto exit;
}
//---------------------------------------
11
while (c1==0){}
while (c2==0){}
while (c3==0){}
while (c4==0){}
delay_ms(50);
}
}
}
exit:
PORTC=0xF7;
control=1;
fn1=0;
dn1=0;
sprintf(lcd_buffer,"F=%uHZ DC=%%%u ",F1,DC1);
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts(lcd_buffer);
}
//__________________________________________________ _______
void main(void)
{
PORTC=0xF7;
DDRC=0x0f;
PORTB.3=0;
DDRB.3=1; //OC0 output
TIMSK=0x01;
lcd_init(16);
lcd_gotoxy(0,0);
lcd_putsf("press ~Enter"

#asm("sei"

while(1)
{
if(c4==0)
{ //if Key <Enter> press of Keypad
delay_ms(100);
if(c4==0)
{
while(c4==0); //for key to be set free
keypad(); //Call Function Scan Keypad
}
}
};
}
با تشکر از شما دوستان :smile:
دیدگاه