Код: #include <at89x51.h> #include "delay.h" #include "lcd.h" #define PRELOAD01 (65536 - (tWord)(OSC_FREQ / (OSC_PER_INST * 1020))) #define PRELOAD01H (PRELOAD01 / 256) #define PRELOAD01L (PRELOAD01 % 256) #define LED1 P1_6 //sin #define LED2 P1_7 //cherven #define BUT1 P3_4 #define BUT2 P3_5 #define CNTZAK #define LCD_RS P1_5 #define LCD_EN P1_4 #define LCD_DATA P1
__data __at (0x020) unsigned char BUT1FL;
__bit __at (0x00) BUT1FL_0; __bit __at (0x01) BUT1FL_1; __bit __at (0x02) BUT1FL_2; __bit __at (0x03) BUT1FL_3; __bit __at (0x04) BUT1FL_4; __bit __at (0x05) BUT1FL_5; __bit __at (0x06) BUT1FL_6; __bit __at (0x07) BUT1FL_7; __data __at (0x022) unsigned char BUT2FL; __bit __at (0x10) BUT2FL_0; __bit __at (0x11) BUT2FL_1; __bit __at (0x12) BUT2FL_2; __bit __at (0x13) BUT2FL_3; __bit __at (0x14) BUT2FL_4; __bit __at (0x15) BUT2FL_5; __bit __at (0x16) BUT2FL_6; __bit __at (0x17) BUT2FL_7; __data __at (0x030) unsigned char CNT1; __data __at (0x031) unsigned char CNTB1; __data __at (0x032) unsigned char CNT2; __data __at (0x033) unsigned char CNTB2;
void izobrazqvane () // { unsigned char counter_button[1]; counter_button[0] = CNT2+0x30; lcd_puts(counter_button); //display on LCD }
void led_sw (void) { LED2=!LED2; } void but1do () // count down { LED1=!LED1; BUT1FL_5=1; CNT2=CNT2-5; if(CNT2==5) { CNT2=15; } izobrazqvane ();// breakdown }
void but2do () // count up { LED1=!LED1; BUT2FL_5=1; CNT2=CNT2+5; if(CNT2==250) { CNT2=240; } izobrazqvane (); }
void but1obr () { if(BUT1FL_7==1) { if(BUT1FL_5==0) { if(BUT1FL_0==0) { BUT1FL_0=1; CNTB1=3; }
else { if(BUT1FL_2==0) { CNTB1--; if(CNTB1==0) { BUT1FL_2=1; }
else { ; } }
else { but1do(); } } }
else { ; } } else { BUT1FL=0; } }
void but2obr () { if(BUT2FL_7==1) { if(BUT2FL_5==0) { if(BUT2FL_0==0) { BUT2FL_0=1; CNTB2=3; }
else { if(BUT2FL_2==0) { CNTB2--; if(CNTB2==0) { BUT2FL_2=1; }
else { ; } }
else { but2do(); } } }
else { ; } } else { BUT2FL=0; } }
void main(void) {
lcd_init();
{ TMOD = 0x11; // timer 0 TR0 = 1; TH0 = 0xDF; //5 ms ? TL0 = 0x75; ET0 = 1; IT0 = 1; EA = 1; CNT1 = 50; __asm // nulira operativnata pamet MOV R0,#0x2F RES1: MOV @R0,#0 DJNZ R0,RES1 __endasm; SP=0x40; }
while(1) { if(BUT1==0) { BUT1FL_7=1; } else { BUT1FL_7=0; } if(BUT2==0) { BUT2FL_7=1; } else { BUT2FL_7=0; }
} }
void timer_0 (void) __interrupt 1 { TH0 = 0xEF; //5 ms TL0 = 0xBA; CNT1--; if(CNT1==0) { CNT1=CNT2; led_sw(); } but1obr(); but2obr();
}
/*============================================================================================ Programa za LCD ==============================================================================================*/
void LCD_STROBE (void);
int reverse(unsigned char byte_to_shift) { unsigned char U8byte_new = byte_to_shift;
unsigned char bit0_Mask = 0x01; unsigned char bit1_Mask = 0x02; unsigned char bit2_Mask = 0x04; unsigned char bit3_Mask = 0x08; unsigned char bit4_Mask = 0x10; unsigned char bit5_Mask = 0x20; unsigned char bit6_Mask = 0x40; unsigned char bit7_Mask = 0x80;
U8byte_new = ((byte_to_shift&bit7_Mask)>>3)|((byte_to_shift&bit6_Mask)>>1)|((byte_to_shift&bit5_Mask)<<1)|((byte_to_shift&bit4_Mask)<<3)| ((byte_to_shift&bit3_Mask)>>3)|((byte_to_shift&bit2_Mask)>>1)|((byte_to_shift&bit1_Mask)<<1)|((byte_to_shift&bit0_Mask)<<3);
return U8byte_new; }
void lcd_write(unsigned char c) { unsigned char data = (unsigned char)(( c >> 4 ) | (LCD_RS << 5)) ;// 0x0F original || // delay_70u(); LCD_DATA = data; LCD_STROBE(); data = (unsigned char)((c & 0x0F) | (LCD_RS << 5)); LCD_DATA = data; LCD_STROBE();
}
/* * Clear and home the LCD */
void lcd_clear(void) { LCD_RS = 0; lcd_write(0x1); delay_10u(); }
/* write a string of chars to the LCD */
void lcd_puts(const char *s) { LCD_RS = 1; // write characters while(*s) { lcd_write(reverse(*s)); s++; } }
/* write one character to the LCD */
void lcd_putch(char c) { LCD_RS = 1; // write characters lcd_write( c ); }
/* * Go to the specified position */
void lcd_goto(unsigned char pos) { LCD_RS = 0; lcd_write(0x80+pos); } /* initialise the LCD - put into 4 bit mode */
void lcd_init() { char init_value;
init_value = 0x3;
LCD_RS = 0; LCD_EN = 0; delay_70ms(); // delay for 150ms delay_70ms(); delay_10ms();
LCD_DATA =0xC; LCD_STROBE(); delay_5ms();
LCD_DATA =0xC; LCD_STROBE(); delay_100u();
LCD_DATA =0xC; LCD_STROBE(); delay_100u();
LCD_DATA =0x4; LCD_STROBE(); delay_100u();
LCD_DATA =0x4; LCD_STROBE(); LCD_DATA =0x1; LCD_STROBE(); delay_100u();
LCD_DATA =0x0; LCD_STROBE(); LCD_DATA =0x1; LCD_STROBE(); delay_100u();
LCD_DATA =0x0; LCD_STROBE(); LCD_DATA =0x8; LCD_STROBE(); delay_5ms();
LCD_DATA =0x0; LCD_STROBE(); LCD_DATA =0x6; LCD_STROBE(); delay_100u();
LCD_DATA =0x0; LCD_STROBE(); LCD_DATA =0x3; LCD_STROBE(); delay_100u();
LCD_RS = 1; }
void LCD_STROBE(void) { LCD_EN = 1; delay_10u(); LCD_EN= 0; } |