《lcd12864(st7920)串行驱动程序》由会员分享,可在线阅读,更多相关《lcd12864(st7920)串行驱动程序(38页珍藏版)》请在金锄头文库上搜索。
1、完整功能版的 ST7920驱动的12864液晶(并行驱动),MCU=Mega16 2007-07-04 23:40:11| 分类: AVR 单片机 | 标签:avr |字号大中小 订阅/*工 程:ST7920驱动的12864液晶的并行驱动模式创建日期:2007年7月3 日创 建 人:朱海峰邮 箱: QQ:543376422引脚定义:RS(CS)=PB0RW(SID)=PB1EN(SCLK)=PB2D0=PA0:D7=PA7PSB 为硬件控制,接高电平为8 位或4位的并行模式,接低电平为串行模式*/#include #include #define uint8_t unsigned char#d
2、efine uint16_t unsigned int#define nop() NOP()#define DATA_PORT PORTA#define Set_RS() DDRB |= (1* QQ:282074921* Date:2007-11-18*/#ifndef _LZP_START51_12864LCDS_H#define _LZP_START51_12864LCDS_H#include reg52.h/12864 串行口定义sbit LCD_CS=P23;sbit LCD_CLK=P25;sbit LCD_SID=P24;/12864LCD 指令定义#define CMD_CLE
3、AR 0x01#define CMD_RESET 0x02/设置波特率#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 -
4、(OSC_FREQ/192L)/19200L / 250#define BAUD_14400 256 - (OSC_FREQ/192L)/14400L / 248#define BAUD_9600 256 - (OSC_FREQ/192L)/9600L / 244void Delay_us(unsigned char nUs);void Delay_ms(unsigned int nMs);bit lcd_busy(void);void write_command(unsigned char cmd);unsigned char read_data(void);void write_data(
5、unsigned char dat);void clear_lcd();void lcd_init();void lcd_setxy(unsigned char x,unsigned char y);void lcd_display_str(unsigned char x, unsigned char y,unsigned char *str);#endif我的是 ST7920 控制的.接了 RS(CS),与 WR(SID)两个至单片机,节约了串口.另外 PSB(串行为 0,并行接 1)跟 LED-接 GND,RS 与 LED+接 VCC.这个程序可能还有点问题,接上背光(LED+,LED-)
6、显示就不很清晰了,关了之后很清晰.显示最后三个汉字李正平 错误 ,为李掌可笑.查查程序哪里有问题了/FileName:12864lcds.c/* start51 study board test software* test 12864LCD* using serial interface* author:bluehacker* QQ:282074921* Date:2007-11-18*/#include 12864.hvoid Delay_us(unsigned char nUs)unsigned char i;while(nUs-)for(i=0;i10;i+);void Delay_m
7、s(unsigned int nMs) unsigned char i;while(nMs-)for(i=0;i120;i+);bit lcd_busy()unsigned char i;bit dat;/先产生连续 5 个1LCD_CS=1;for(i=0;i5;i+)LCD_CLK=0;LCD_SID=1;LCD_CLK=1;/再发送一个1,表示读操作LCD_CLK=0;LCD_SID=1;LCD_CLK=1;/再发送一个0,表示写命令操作LCD_CLK=0;LCD_SID=0;LCD_CLK=1;/再发送一个0,这是表示第一个字节结束LCD_CLK=0;LCD_SID=0;LCD_CLK
8、=1;/Delay_us(1);dat=0;LCD_CLK=0;dat=LCD_SID;LCD_CLK=1;LCD_CS=0;return dat; void write_command(unsigned char cmd)unsigned char i;while(lcd_busy();/先产生连续 5 个1LCD_CS=1;for(i=0;i5;i+)LCD_CLK=0;LCD_SID=1;LCD_CLK=1;/再发送一个0,表示写操作LCD_CLK=0;LCD_SID=0;LCD_CLK=1;/再发送一个0,表示写命令操作LCD_CLK=0;LCD_SID=0;LCD_CLK=1;/再发
9、送一个0,这是表示第一个字节结束LCD_CLK=0;LCD_SID=0;LCD_CLK=1;/下面发送具体指令,先发送高 4 位for(i=0;i4;i+)LCD_CLK=0;if(cmd&0x80)LCD_SID=1;elseLCD_SID=0;LCD_CLK=1;cmd=1;/发送连续 4 个0for(i=0;i4;i+)LCD_CLK=0;LCD_SID=0;LCD_CLK=1;/下面发送指令的低 4 位for(i=0;i4;i+) LCD_CLK=0;if(cmd&0x80)LCD_SID=1;elseLCD_SID=0;LCD_CLK=1;cmd=1;/发送连续 4 个0for(i=
10、0;i4;i+)LCD_CLK=0;LCD_SID=0;LCD_CLK=1;LCD_CS=0;/结束void write_data(unsigned char dat)unsigned char i;while(lcd_busy();/先产生连续 5 个1LCD_CS=1;for(i=0;i5;i+)LCD_CLK=0;LCD_SID=1;LCD_CLK=1;/再发送一个0,表示写操作LCD_CLK=0;LCD_SID=0;LCD_CLK=1;/再发送一个1,表示写数据操作LCD_CLK=0;LCD_SID=1;LCD_CLK=1;/再发送一个0,这是表示第一个字节结束LCD_CLK=0;LC
11、D_SID=0;LCD_CLK=1; /下面发送具体数据,先发送高 4 位for(i=0;i4;i+)LCD_CLK=0;if(dat&0x80)LCD_SID=1;elseLCD_SID=0;LCD_CLK=1;dat=1;/发送连续 4 个0for(i=0;i4;i+)LCD_CLK=0;LCD_SID=0;LCD_CLK=1;/下面发送数据的低 4 位for(i=0;i4;i+)LCD_CLK=0;if(dat&0x80)LCD_SID=1;elseLCD_SID=0;LCD_CLK=1;dat=1;/发送连续 4 个0for(i=0;i4;i+)LCD_CLK=0;LCD_SID=0;
12、LCD_CLK=1;LCD_CS=0;/结束 unsigned char read_data()unsigned char i,dat;while(lcd_busy(); /先产生连续 5 个1LCD_CS=1;for(i=0;i5;i+)LCD_CLK=0;LCD_SID=1;LCD_CLK=1;/再发送一个1,表示读操作LCD_CLK=0;LCD_SID=0;LCD_CLK=1;/再发送一个1,表示数据操作LCD_CLK=0;LCD_SID=1;LCD_CLK=1;/再发送一个0,这是表示第一个字节结束LCD_CLK=0;LCD_SID=0;LCD_CLK=1; /下面读具体数据/先读高
13、4 位dat=0;for(i=0;i4;i+)LCD_CLK=0;dat=1;LCD_CLK=1;dat|=LCD_SID;/再接受 4 个连续0,没什么意义,直接丢掉for(i=0;i4;i+)LCD_CLK=0;Delay_us(1);LCD_CLK=1;Delay_us(1);/接受低 4 位for(i=0;i4;i+)LCD_CLK=0;dat=1; LCD_CLK=1;dat|=LCD_SID;/再接受 4 个连续0,没什么意义,直接丢掉for(i=0;i4;i+)LCD_CLK=0;Delay_us(1);LCD_CLK=1;Delay_us(1);LCD_CS=0;return
14、dat;void clear_lcd()write_command(CMD_CLEAR);void lcd_setxy(unsigned char x,unsigned char y)unsigned char addr;switch(y)case 0:addr=0x80+x;break;case 1:addr=0x90+x;break;case 2:addr=0x88+x;break;case 3:addr=0x98+x;break;write_command(addr);void lcd_display_str(unsigned char x, unsigned char y,unsigned char *str) unsigned char i;lcd_setxy(x,y);for(i=0;stri!=0;i+)write_da