#include <STC89C5xRC.H> #include <intrins.h> #define uchar unsigned char #define uint unsigned int #define LCD_DB P0 sbit LCD_RS = P2^4; sbit LCD_RW = P2^3; sbit LCD_E = P2^2; sbit K1 = P1^0; sbit K2 = P1^1; sbit K3 = P1^2; sbit K4 = P1^3; sbit K5 = P1^4; sbit M1 = P1^5; sbit M2 = P1^6; sbit M3 = P1^7; sbit DCY1 = P3^0; sbit DCY2 = P3^1; sbit CLK = P3^2; sbit EN = P2^6; sbit UD = P2^5; sbit UD1 = P2^1; uchar bin2dec(uchar a ,uchar b ,uchar c); uchar bin2dec1(uchar a ,uchar b); void LCD_init(void); void LCD_write_command(uchar command); void LCD_write_date(uchar dat); void LCD_disp_char(uchar x,uchar y,uchar dat); void LCD_disp_str(uchar row,uchar * str); bit LCD_check_busy(void); void delay_n40us(uint n); void StartTime0(void); uchar code dis1[8][9] = {{"DIV:1/2"},{"DIV:1/8"},{"DIV:1/10"},{"DIV:1/16"},{"DIV:1/20"},{"DIV:1/32"},{"DIV:1/40"},{"DIV:1/64"}}; uchar code hz[8] = {1000,1000,1000,1000,1000,1000,1000,1000}; uchar selector = 0; uchar o = 0,m = 0,s = 0,save = 0,save1 = 0; void main() { EN = 1; CLK = 0; StartTime0(); UD = 0; UD1 = 1; while(1) { M1 = K1; M2 = K2; M3 = K3; DCY1 = K4; DCY2 = K5; o = bin2dec(M1,M2,M3); UD1 = 1; if(o != save) { s = 0; save = o; //selector = o; //ET0 = 0; } else { s = 1; save = o; //ET0 = 1; } m = bin2dec1(DCY2,s); if(save1 != m) { switch(m) { case 0 : { LCD_init(); LCD_disp_str(1,dis1[o]); LCD_disp_str(2,"CW:FORWORD"); UD1 = 1; } break; case 1 : { LCD_init(); LCD_disp_str(1,dis1[o]); LCD_disp_str(2,"CW:FORWORD"); UD1 = 1; } break; case 2 : { LCD_init(); LCD_disp_str(1,dis1[o]); LCD_disp_str(2,"CW:BACK"); UD1 = 0; } break; case 3 : { LCD_init(); LCD_disp_str(1,dis1[o]); LCD_disp_str(2,"CW:BACK"); UD1 = 0; } break; default : { LCD_init(); LCD_disp_str(1,dis1[o]); } } save1 = m; } } } uchar bin2dec(uchar a ,uchar b ,uchar c) { uchar i; a = a<<2; b = b<<1; i = a | b | c; return i; } uchar bin2dec1(uchar a ,uchar b) { uchar i; a = a<<1; i = a | b; return i; } void LCD_init(void) { LCD_write_command(0x38); delay_n40us(100); LCD_write_command(0x0c); delay_n40us(100); LCD_write_command(0x06); delay_n40us(100); LCD_write_command(0x01); delay_n40us(100); } void LCD_write_command(uchar command) { while(LCD_check_busy()); LCD_RS = 0; LCD_RW = 0; LCD_E=0; _nop_(); _nop_(); LCD_DB = command; _nop_(); _nop_(); _nop_(); _nop_(); LCD_E = 1; _nop_(); _nop_(); _nop_(); _nop_(); LCD_E = 0; } void LCD_write_data(uchar dat) { while(LCD_check_busy()); LCD_RS = 1; LCD_RW = 0; LCD_E = 0; LCD_DB = dat; _nop_(); _nop_(); _nop_(); _nop_(); LCD_E = 1; _nop_(); _nop_(); _nop_(); _nop_(); LCD_E = 0; delay_n40us(1); } void LCD_disp_char(uchar x,uchar y,uchar dat) { uchar address; if(y == 1) { address = 0x80 + x; } else { address = 0xc0 + x; } LCD_write_command(address); LCD_write_data(dat); } void LCD_disp_str(uchar row,uchar * str) { int i; if(row == 1) { for(i=0;str[i]!='\0';i++) { LCD_disp_char(i,1,str[i]); } } else { for(i=0;str[i]!='\0';i++) { LCD_disp_char(i,2,str[i]); } } } bit LCD_check_busy(void) { bit result; LCD_RS = 0; LCD_RW = 1; LCD_E = 1; _nop_(); _nop_(); _nop_(); _nop_(); delay_n40us(100); result = (bit)(LCD_DB & 0x80); LCD_E = 0; return result; } void delay_n40us(uint n) { uint i; uchar j; for(i=n;i>0;i--) { for(j=0;j<2;j++) { _nop_(); _nop_(); } } } void StartTime0(void) { ET0 = 1; TMOD = 0x01; TH0 = (65536-1000)/256; TL0 = (65536-1000)%256; TR0 = 1; EA = 1; } void CLKG(void) interrupt 1 { CLK = ~CLK; TH0 = (65536-1000)/256; TL0 = (65536-1000)%256; }