//FileName:delay.h #ifndef __LZP_DELAY_H_ #define __LZP_DELAY_H_ #define TRUE 1 #define FALSE 0 //设置波特率 #define OSC_FREQ 11059200L #define BAUD_115200 256 - (OSC_FREQ/192L)/115200L // 255 #define BAUD_57600 256 - (OSC_FREQ/192L)/57600L // 254 #define BAUD_38400 256 - (OSC_FREQ/192L)/38400L // 253 #define BAUD_28800 256 - (OSC_FREQ/192L)/28800L // 252 #define BAUD_19200 256 - (OSC_FREQ/192L)/19200L // 250 #define BAUD_14400 256 - (OSC_FREQ/192L)/14400L // 248 #define BAUD_9600 256 - (OSC_FREQ/192L)/9600L // 244 // Timer2 #define RCAP2_50us 65536L - OSC_FREQ/240417L #define RCAP2_1ms 65536L - OSC_FREQ/12021L void delay_ms(unsigned int num); void delay_50us(unsigned char num); void delay_us(unsigned char num); #endif //FileName:delay.c /******************************************** ** start51 study board ** delay function implementation ** author:bluehacker<kernelpaniccrash At gmail.com> ** QQ:282074921 **********************************************/ #include "delay.h" #include "reg52.h" void delay_ms(unsigned int num) { RCAP2H = (RCAP2_1ms>>8); RCAP2L=(RCAP2_1ms&0x00ff); TH2=(RCAP2_1ms>>8);; TL2=(RCAP2_1ms&0x00ff);; ET2 = 0; // Disable timer2 interrupt T2CON = 0x04; // 16-bit auto-reload, clear TF2, start timer while (num--) { while (!TF2); TF2 = FALSE; } TR2 = FALSE; } void delay_50us(unsigned char num) { RCAP2H=(RCAP2_50us>>8); RCAP2L=(RCAP2_50us&0x00ff); TH2=(RCAP2_50us>>8); TL2=(RCAP2_50us&0x00ff); ET2=0; T2CON=0x04; while(num--) { while(!TF2) TF2=FALSE; } TR2=FALSE; } void delay_us(unsigned char num) { unsigned char i; for (i=0;i<num;i++) { } } //FileName:lcd.h #ifndef __LZP_LCD_H_ #define __LZP_LCD_H_ #include "reg52.h" ///////////////////////////// //定义LCD控制引脚 //////////////////////////// sbit LCDRS="P2"^0; sbit LCDRW="P2"^1; sbit LCDE="P2"^2; void lcd_write_cmd(unsigned char cmd); void lcd_write_data(unsigned char dat); void lcd_clear(void); void lcd_init(void); unsigned char lcd_status(void); void lcd_set_mode(unsigned char cursor, unsigned char text); void lcd_write_str(unsigned char x,unsigned char y,unsigned char *s); void lcd_write_char(unsigned char x,unsigned char y, unsigned char d); #endif //FileName:lcd.c /******************************************************** **本开发板支持1602 字符型LCD **这种LCD的接口资料可以用google找到很多 **引脚定义: * 1---GND * 2---VDD * 3---VLCD:对比度调节 * 4---RS:寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器 * 5---R/W:读写信号线,高电平时进行读操作,低电平时进行写操作。 当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平 RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。 * 6---E:使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。 * 7~14---DB0~DB7数据线、 * 15---A:背光引脚,"A"接正 * 16---K:背光引脚,"K"接负 ** author:bluehacker<kernelpaniccrash AT gmail.com> ** QQ:282074921 **date :2007-11-15 *********************************************************/ #include "lcd.h" #include "delay.h" #include "intrins.h" /*向LCD写入命令*/ void lcd_write_cmd(unsigned char cmd) { unsigned char status; P0=cmd; LCDRS="0"; LCDRW="0"; LCDE="0"; delay_us(5); do{ status="lcd"_status(); }while(status&0x80); LCDE="1"; } void lcd_write_data(unsigned char dat) { unsigned char status; P0=dat; LCDRS="1"; LCDRW="0"; LCDE="0"; delay_us(5); do{ status="lcd"_status(); }while(status&0x80); LCDE="1"; } void lcd_clear(void) { lcd_write_cmd(0x01); } /*显示屏字符串写入函数*/ void lcd_write_str(unsigned char x,unsigned char y,unsigned char *s) { if (y == 0) { lcd_write_cmd(0x80 + x); } else { lcd_write_cmd(0xC0 + x); } while (*s) { lcd_write_data( *s); s ++; } /* unsigned char i; for(i=0;i<16&&s!=0;i++) { lcd_write_char(x+i,y,s); } */ } void lcd_write_char(unsigned char x,unsigned char y, unsigned char d) { if(y==0) { lcd_write_cmd(0x80+x); } else { lcd_write_cmd(0xc0+x); } lcd_write_data(d); } //光标复位 void lcd_reset_cursor(void) { lcd_write_cmd(0x02); } //设置显示模式 void lcd_set_mode(unsigned char cursor, unsigned char text) { unsigned char mode="0x04"; if(cursor){//光标右移 mode|=0x02; } else{//光标左移 mode|=0x00; } if(text){//文字移动 mode|=0x01; } else{//文字不移动 mode|=0; } lcd_write_cmd(mode); } void lcd_init(void) { P0=0; LCDE="1"; delay_ms(500); lcd_clear(); lcd_write_cmd(0x38);//设置lcd功能:8位总线,双行显示,5X7点阵字符 lcd_write_cmd(0x0f);//显示开关控制:显示ON,光标ON,闪烁ON lcd_write_cmd(0x06);//光标输入方式增量移位 lcd_write_cmd(0x80); //lcd_write_cmd(0x0c); //lcd_clear(); } //读取状态,是否忙 unsigned char lcd_status(void) { unsigned char tmp="0"; P0=0xff; LCDRS="0"; LCDRW="1"; LCDE="0"; _nop_(); LCDE="1"; //_nop_(); tmp="P0"; return tmp; } //FileName:test.c /******************************* ** Start51 study board test software ** test 1602LCD ** author: bluehacker<kernelpaniccrash AT gmail.com> ** QQ:282074921 ***********************************/ #include "lcd.h" #include "delay.h" #include "intrins.h" void main(void) { //初始化串口 SCON="0x50";/*mode 1,1 start bit ,8 data bit ,1 stop bit,enable receive*/ PCON="0x80";/*SMOD=1, Baud Rate twice*/ TMOD="0x21";/*timer 0--mode 1 and timer 1 ---mode2*/ //set baud rate,use timer 1 as baud rate generator TH1=BAUD_19200; TL1=TH1; TR1=TRUE; ET1=FALSE;//disable timer 1 interrupt EA="0"; //delay_ms(400); lcd_init(); // lcd_set_mode(1,0); //lcd_reset_cursor(); // lcd_write_char(3,1,'c'); lcd_write_str(2,0,"bluehacker"); lcd_write_str(2,1,"QQ:282074921"); while(1) { } }
用户1321576 2008-7-16 16:45