12864液晶屏的串行、并行口驱动程序(已验证),注:晶振为7.3728MHz
[复制链接]
//********************************************************** //* 文件名: 12864.c // //* 液晶屏: 128*64 // //* 设计者: // //* 修改者: // //* 日期: 2011-08-29// //***********************************************************
#include<reg52.h> #include<string.h> #define PAGE 0x80 #define uint unsigned int #define uchar unsigned char // #define dateport_12864lcd P2 //并行模式下的数据线
//********************************************************* // 用户定义常量 //********************************************************* code uchar jieguo[16]={"天厚电子有限公司"}; sbit SCLK=P0^2; sbit SID=P0^1; sbit CS =P0^0; // sbit PSB=P0^4; //PSB=0时为串行模式,电路中该引脚接低电平;PSB=1时为并行模式,通过程序设置 //********************************************************* // 函 数 名: delay_12864LCD // 函数说明: 延时程序 // 调用函数: // 输入参数: X-延时时间 // 返回参数: 无 // 设 计 者: // 日 期: 2011年8月29日 //********************************************************* void delay_12864lcd(uint x) { while(x--); }
//********************************************************* // 函 数 名: send_byte_12864LCD // 函数说明: 串行传送模式下的串行口传送数据 // 调用函数: delay_12864lcd // 输入参数: send_data—传送数据 // 返回参数: 无 // 设 计 者: // 日 期: 2011年8月29日 //**********************************************************
void send_byte_12864lcd(uchar send_data) { uchar i; for(i=0;i<8;i++) { SID=(bit)(send_data&0x80); //取最高位 SCLK=0; delay_12864lcd(50); SCLK=1; send_data=send_data<<1; } } /* //********************************************************** // 函 数 名: send_command_12864LCD // 函数说明: 并行传送模式下的发送指令 // 调用函数: delay_12864lcd // 输入参数: com-要发送的指令值 // 返回参数: 无 // 设 计 者: // 日 期: 2011年8月29日 //***********************************************************
void send_com_12864lcd(uchar com) { delay_12864lcd(30); SCLK=1; CS=0; SID=0; dateport_12864lcd=com; delay_12864lcd(2550); SCLK=0; delay_12864lcd(2550); }
//********************************************************** // 函 数 名: send_data_12864LCD // 函数说明: 并行传送模式下的发送指令 // 调用函数: delay_12864lcd // 输入参数: com-要发送的数据 // 返回参数: 无 // 设 计 者: // 日 期: 2011年8月29日 //***********************************************************
void send_date_12864lcd(uchar date) { delay_12864lcd(30); SCLK=1; CS=1; SID=0; dateport_12864lcd=date; delay_12864lcd(2550); SCLK=0; delay_12864lcd(2550); } */ //********************************************************** // 函 数 名: send_command_12864LCD // 函数说明: 串行传送模式下的发送指令和数据 // 调用函数: delay_12864lcd、send_byte_12864lcd // 输入参数: command_data-要发送的值,com-选择是命令还是数据 1-命令;0-数据 // 返回参数: 无 // 设 计 者: // 修 改: 1、以前的发送命令和数据2个函数合并为一个 // 2、发送数据处理改变 // 3、发送1个字节编成函数 // 日 期: 2011年8月29日 //***********************************************************
void send_command_12864lcd(uchar command_data,uchar com) { uchar i_data; if(com==1) {i_data=0xf8;} //send order else { i_data=0xfa;} //send data delay_12864lcd(1000); //4.9ms CS=1; send_byte_12864lcd(i_data); i_data=command_data; i_data&=0xf0; //high 4bit send_byte_12864lcd(i_data); i_data=command_data; i_data<<=4; //low 4bit i_data&=0xf0; send_byte_12864lcd(i_data); CS=0; }
//********************************************************* // 函 数 名: Init_12864LCD // 函数说明: 串行传送模式下的液晶屏初始化 // 调用函数: send_command_12864lcd和delay_12864lcd // 输入参数: 无 // 返回参数: 无 // 设 计 者: // 日 期: 2011年8月29号 //********************************************************** void Init_12864LCD(void) { // PSB=0; delay_12864lcd(40); //47us send_command_12864lcd(0x30,1); //基本指令集 delay_12864lcd(20); //47us send_command_12864lcd(0x0e,1); //显示状态,整体显示ON delay_12864lcd(20); //47us send_command_12864lcd(0x01,1); //清屏 delay_12864lcd(20); //47us send_command_12864lcd(0x06,1); //游标右移,AC加一 delay_12864lcd(20); //72us
} /* //********************************************************* // 函 数 名: Init_12864LCD // 函数说明: 并行传送模式下的液晶屏初始化 // 调用函数: send_com_12864lcd和delay_12864lcd // 输入参数: 无 // 返回参数: 无 // 设 计 者: // 日 期: 2011年8月29号 //********************************************************** void Init_12864LCD(void) { PSB=1; delay_12864lcd(20); //47us send_com_12864lcd(0x30); //基本指令集 delay_12864lcd(20); //47us send_com_12864lcd(0x0e); //显示状态,整体显示ON delay_12864lcd(20); //47us send_com_12864lcd(0x01); //清屏 delay_12864lcd(20); //47us send_com_12864lcd(0x06); //游标右移,AC加一 delay_12864lcd(20); //72us
} */ //********************************************************* // 函 数 名: tab_12864lcd // 函数说明: 串行传送模式下的液晶屏显示 // 调用函数: send_command_12864lcd和delay_12864lcd // 输入参数: n-要显示的字符在第几行,m-显示的字符的位数, *ps-数据指针 // 返回参数: 无 // 设 计 者: //日 期: 2011年8月29号 //*********************************************************
void tab_12864lcd(uchar n,uchar m,uchar *ps) { uchar i,j; send_command_12864lcd(PAGE+n,1); delay_12864lcd(20); //72us for(i=0;i<m;i++) { j=*ps; send_command_12864lcd(j,0); ps++; } } /* //********************************************************* // 函 数 名: tab_pm_12864lcd // 函数说明: 并行传送模式下的液晶屏显示 // 调用函数: send_com_12864lcd、delay_12864lcd和send_date_12864lcd // 输入参数: n-要显示的字符在第几行,m-显示的字符的位数, *ps-数据指针 // 返回参数: 无 // 设 计 者: //日 期: 2011年8月29号 //*********************************************************
void tab_12864lcd(uchar n,uchar m,uchar *ps) { uchar i,j; send_com_12864lcd(PAGE+n); delay_12864lcd(30); //72us for(i=0;i<m;i++) { j=*ps; send_date_12864lcd(j); delay_12864lcd(30); ps++; } } */ //********************************************************** // 函 数 名: main // 函数说明: 主函数 // 调用函数: Init_12864LCD、delay_12864lcd和tab_12864lcd // 输入参数: 无 // 返回参数: 无 // 设 计 者: // 日 期: 2011年8月29号 //********************************************************** main() { while(1) { delay_12864lcd(5100); Init_12864LCD(); delay_12864lcd(2550); tab_12864lcd(0,16,jieguo); delay_12864lcd(2550); tab_12864lcd(16,16,jieguo); } }
|