void delay(void)
{
asm("del1: ldi r24,0x01");
asm("dl: dec r24");
asm('brne dl");
asm("dec r25");
asm("brne del1");
}
void STR0B_WR1(void)
{
asm("sbi 0x18,5");
delay();
asm("cbi 0x18,5");
}
void STR0B_ADR(void)
{
asm("cbi 0x18,4"):
delay();
asm("sbi 0x18,5");
delay();
asm("cbi 0x18,5");
delay();
asm("sbi 0x18,4");
}
void Set_Bus(unsigned char A)
{
If ((A&0x01)==0x01) asm("sbi 0x18,0");
else asm("cbi 0x18,0");
If ((A&0x02)==0x02) asmC'sbi 0x18,1");
else asm("cbi 0x18,1");
if ((А&0х04)==0х04) asm("sbi 0x18,2");
else asm("cbi 0x18,2");
if ((А&0х08)==0х0в) asm("sbi 0x18,3");
else asmC'cbi 0x18,3");
}
void Init_LCD(void)
{
unsigned char temp;
Set_Bus(0x0f);
STR0B_ADR();
Set_Bus(0x01);
STR0B_WR1();
Set_Bus(0);
STR0B_ADR();
for (temp=0;temp<20;temp++) STR0B_WR1();
}
unsigned char code7(unsigned char code)
{
switch(code)
{
case 0: return 0xee;
case 1: return 0x60;
case 2: return 0x2f;
case 3: return 0x6d;
case 4: return 0xe1;
case 5: return 0xcd;
case 6: return 0xcf;
case 7: return 0x68;
case 8: return 0xef;
case 9: return 0xed;
case 10: return 0;
}
return 0;
}
void out(unsigned char num)
{
num=code7(num);
Set_Bus(num);
STR0B_WR1();
delay0;
asm("swap %num"); Set_Bus(num);
STR0B_WR1();
delay();
}
void display(unsigned int N, unsigned int N1, unsigned int N2)
{// NN N1N1N1N1 N2N2N2N2
Set_Bus(0);
STR0B_ADR();
out((unsigned int)(N/10)-10*(unsigned int)(N/100));
out(N-10*(unsigned int)(N/10));
out((unsigned int)(N1/1000)-10*(unsigned int)(N1/10000));
out((unsigned int)(N1/100)-10*(unsigned int)(N1/1000));
out((unsigned int)(N1/10)-10-(unsigned int)(N1/100));
out(N1-10*(unsigned int)(N1/10));
out((unsigned int)(N2/1000)-10*(unsigned int)(N2/10000));
out((unsigned int)(N2/100)-10*(unsigned int)(N2/1000));
out((unsigned int)(N2/10)-10*(unsigned int)(N2/100));
out(N2-10*(unsigned int)(N2/10));
}
«include
void main()
{
DDRB = 0xFF; /* Port С настроен на вывод */
P0RTB = 0xff; /* Все линии порта С = 1 */
Init_LCD();
display(0,1,7);
while(1);
}
Динамическая индикация с применением прерывания по переполнению таймера Timer 0. Вывод на индикатор происходит каждые 65 мс. Прерывания по таймеру 1 происходят с периодом примерно 1 с. При этом на единицу увеличивается значение на индикаторе. При достижении значения 20 происходит обнуление значения для вывода.
Микроконтроллер: AT90S2313.
Кварцевый резонатор: 4 МГц.
Текст программы: