单片机的驱动程序
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
cs=1; /* bring cs high */
return k; /* return k */
}
void wip_poll()
{
char i;
i=0;
clflag0=1;
while((clflag0!=0)&&(i!=80)) /* if WIP bit '1' or i not equal*/
{
sck=0; /* bring sck low */
si=k&0x80; /* si is always equal to k's highest bit */
sck=1; /* bring sck high */
k<<=1; /* shift data k left 1 */
}
}
/******************************************************/
回答者:221.223.81.*2009-7-11 12:24
** 1602A液晶屏驱动程序**晶振频率:11.0592M*****************************************/#include <reg51.h>#define uchar unsigned char#define uint unsigned int sbit LCM_E=P3^5;//定义接口sbit LCM_RW=P3^6;sbit LCM_RS=P3^7; #define LCM_Data P1//数据接口void LCM_WriteData(uchar WDLCM);void LCM_WriteCommand(uchar WCLCM,BuysC);uchar LCM_ReadData(void);uchar LCM_ReadStatus(void);void LCM_Init(void);void DisplayOneChar(uchar X, uchar Y, uchar DData);void DisplayListChar(uchar X, uchar Y, uchar code *DData);void Delay5Ms(void);void Delay400Ms(void); uchar code uctech[] ={"1602A"};uchar code net[] = {"www.52c51.com"}; void main(void){Delay400Ms();//启动等待,等LCM讲入工作状态LCM_Init();//LCM初始化Delay5Ms();//延时片刻(可不要) DisplayListChar(6, 1, uctech);DisplayListChar(0, 0, net);LCM_ReadData();//测试用句无意义LCM_Data=255;while(1);} /****************************1602A写数据函数**************************//*函数原型:void LCM_WriteData(uchar WDLCM)/*函数功能:1602A写数据/*输入参数:要写入的数据/*输出参数:无/*调用模块:/**********************************************************************/ void LCM_WriteData(uchar WDLCM){LCM_ReadStatus();//检测忙LCM_Data = WDLCM;LCM_RS = 1;LCM_RW = 0;LCM_E = 0;//若晶振速度太高可以在这后加小的延时LCM_E = 0;//延时LCM_E = 1;} /****************************1602A写指令函数**************************//*函数原型:void LCM_WriteCommand(uchar WCLCM,BuysC)/*函数功能:1602A写指令/*输入参数:要写入的指令/*输出参数:无/*调用模块:/**********************************************************************/ void LCM_WriteCommand(uchar WCLCM,BuysC)//BuysC为0时忽略忙检测{if (BuysC) LCM_ReadStatus();//根据需要检测忙LCM_Data = WCLCM;LCM_RS = 0;LCM_RW = 0;LCM_E = 0;LCM_E = 0;LCM_E = 1;} /****************************1602A读数据函数**************************//*函数原型:uchar LCM_ReadData(void)/*函数功能:1602A读数据/*输入参数:无/*输出参数:1602A返回的数据/*调用模块:/**********************************************************************/ uchar LCM_ReadData(void){LCM_RS = 1;LCM_RW = 1;LCM_E = 0;LCM_E = 0;LCM_E = 1;return(LCM_Data);} /****************************1602A读状态函数**************************//*函数原型:uchar LCM_ReadData(void)/*函数功能:1602A读状态/*输入参数:无/*输出参数:1602A返回的状态/*调用模块:/**********************************************************************/ uchar LCM_ReadStatus(void){LCM_Data = 0xFF;LCM_RS = 0;LCM_RW = 1;LCM_E = 0;LCM_E = 0;LCM_E = 1;while (LCM_Data & 0x80);//检测忙信号return(LCM_Data);} /****************************1602A初始化函数**************************//*函数原型:void LCM_Init(void)/*函数功能:1602A初始化/*输入参数:无/*输出参数:无/*调用模块:/**********************************************************************/ void LCM_Init(void){LCM_Data = 0;LCM_WriteCommand(0x38,0);//三次显示模式设置,不检测忙信号Delay5Ms();LCM_WriteCommand(0x38,0);Delay5Ms();LCM_WriteCommand(0x38,0);Delay5Ms(); LCM_WriteCommand(0x38,1);//显示模式设置,开始要求每次检测忙信号LCM_WriteCommand(0x08,1);//关闭显示LCM_WriteCommand(0x01,1);//显示清屏LCM_WriteCommand(0x06,1);//显示光标移动设置LCM_WriteCommand(0x0C,1);//显示开及光标设置} /******************1602A按指定位置显示一个字符函数**********************//*函数原型:void DisplayOneChar(uchar X, uchar Y, uchar DData)/*函数功能:1602A按指定位置显示一个字符/*输入参数:X坐标Y坐标要显示的字符/*输出参数:无/*调用模块:/**********************************************************************/ void DisplayOneChar(uchar X, uchar Y, uchar DData){Y &= 0x1;X &= 0xF;//限制X不能大于15,Y不能大于1if (Y) X |= 0x40;//当要显示第二行时地址码+0x40;X |= 0x80;//算出指令码LCM_WriteCommand(X, 0);//这里不检测忙信号,发送地址码LCM_WriteData(DData);}/*******************1602A按指定位置显示一串字符函数*********************//*函数原型:void DisplayListChar(uchar X, uchar Y, uchar code *DData)/*函数功能:1602A按指定位置显示一个字符/*输入参数:X坐标Y坐标要显示字符串的首地址/*输出参数:无/*调用模块:/**********************************************************************/ void DisplayListChar(uchar X, uchar Y, uchar code *DData){uchar ListLength;ListLength = 0;Y &= 0x1;X &= 0xF;//限制X不能大于15,Y不能大于1while (DData[ListLength]>0x20)//若到达字串尾则退出{if (X <= 0xF)//X坐标应小于0xF{DisplayOneChar(X, Y, DData[ListLength]);//显示单个字符ListLength++;X++;}}} /********************5ms延时函数************************//*函数原型:void Delay5Ms(void)/*函数功能:5ms延时/*输入参数:无/*输出参数:无/*调用模块:/*********************
LCD_WtoiR(0x0e); /* (0x0c)?是否显示光标*/
LCD_WtoiR(0x06); /* (0x07)?光标左移或右移*/
}
void LCD_SFLine() /*显示第一行*/
{
LCD_WtoiR(0x80);
}
void LCD_SSLine() /*显示第二行*/
{
LCD_WtoiR(0xc0);
k=k|so; /* k or so */
/* k shift left one bit */
}
return k; /* return k */
}
/******************************************************/
void wren_cmd(char k) /* set write enable or disable latch */
void wren_cmd(char k);
char rdsr_cmd(void);
void wip_poll(void);
void wrsr_cmd(void);
void CheckBF() /*检查忙碌状态*/
{
char flag;
flag=0xff;
while((flag & 0x80)!=0)
{
i++;
ACC=rdsr_cmd(); /* read status register */
}百度文库
/* to 80 , continus polling */
}
void wrsr_cmd() /* write status register */
{ char k;
sck=0; /* bring sck low */
sbit si =P1^3;
sbit so =P1^2;
sbit clflag0 =ACC^0;
void CheckBF(void);
void LCD_WtoiR(char datas);
void LCD_WtData(char datas);
void LCD_Clr(void);
void LCD_Init(void);
Enable=1;
*p=P0;
number++;
p++;
CheckBF();
Enable=0;
}
*p='\0';
}
void outbyt(char k) /* sends byte to epprom */
{
char i;
for(i=0;i<8;i++) /* use i as bit counter to eight */
cs=0; /* bring cs low */
k=0x01; /* write status register instruction */
outbyt(k); /* send byte k=0x01 to epprom */
k=0x00; /* write command k to status register */
{
RS=0;
RW=1;
Enable=0;
Enable=1;
flag=P0;
Enable=0;
}
RW=0;
}
void LCD_WtoiR(char datas) /*指令函数*/
{
CheckBF();
Enable=0;
RS=0;
Enable=1;
P0=datas;
Enable=0;
}
void LCD_WtData(char datas) /*数据写入*/
void LCD_SFLine(void);
void LCD_SSLine(void);
void LCD_printf(char lines, char *p);
void ReadLine(char lines, char *p);
void outbyt(char k);
char inbyt(void);
{
char number,i;
if(lines==1)
{
number=0x80;
LCD_SFLine();
}
else
{
number=0xc0;
LCD_SSLine();
}
for(i=0;i<=19;i++)
{
LCD_WtoiR(number);
CheckBF();
Enable=0;
RS=1;
RW=1;
{
sck=0; /* bring sck low */
cs=0; /* bring cs low */
outbyt(k); /* set write enable latch 0x06 */
sck=0; /* set write disable latch 0x04 */
cs=1; /* bring cs high */
}
void LCD_printf(char lines, char *p) /*数据输出*/
{
if (lines==1)
LCD_SFLine();
else
LCD_SSLine();
while(*p=='$')
{
while(*p!='\0')
{
LCD_WtData(*p);
p++;
}
}
}
void ReadLine(char lines, char *p) /*读取数据*/
单片机液晶显示驱动程序(用C语言写的)
要求是:RS232接口单片机液晶显示模块PC机上使用串口调试助手的设置如下:
串口设置:波特率9600,无奇偶校验,数据位8位,停止位1位。
发送数据时必须以$开始,无结束字符。如$1234,就可以直接发送。
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
PCON=0x00;
{
CheckBF();
Enable=0;
RS=1;
RW=0;
Enable=1;
P0=datas;
Enable=0;
}
void LCD_Clr() /*清零*/
{
LCD_WtoiR(1);
}
void LCD_Init() /*初始化*/
{
LCD_WtoiR(0x38); /* (0x3c)?第一行或第二行*/
}
main()
{
char a[20];
LCD_Init();
LCD_Clr();
LCD_printf(1,"1234567"); /*读取第一行数据,在第二行输出*/
ReadLine(1,a);
LCD_printf(2,a);
wrsr_cmd();
while(1)
{
cs=0;
cs=1;
}
}
这是我的不知道对不对还需要补充什么的
outbyt(k); /* send byte k=0x00 to epprom */
sck=0; /* bring sck low */
cs=1; /* bring cs high */
wip_poll(); /* poll for completion of a nonvolatile write cycle */
k=0x05; /* read status register command byte 0x05 */
outbyt(k); /* send k=0x05 to epprom */
k=inbyt(); /* receieve k from epprom */
sck=0; /* bring sck low */
char inbyt(void) /* recieves byte from epprom */
{
char i,k;
for(i=0;i<8;i++) /* use i as bit counter to eight */
{
k<<=1;
sck=1; /* bring sck high */
sck=0; /* bring sck low */
}
/******************************************************/
char rdsr_cmd(void) /* read status register command */
{
char k;
sck=0; /* bring sck low */
cs=0; /* bring cs low */
SCON=0x50;
TR1=1;
ES=0;
#include <reg52.h>
#include <absacc.h>
#include <math.h>
sbit RS = P2^5;
sbit RW = P2^6;
sbit Enable = P2^7;
sbit cs =P1^0;
sbit sck =P1^1;
return k; /* return k */
}
void wip_poll()
{
char i;
i=0;
clflag0=1;
while((clflag0!=0)&&(i!=80)) /* if WIP bit '1' or i not equal*/
{
sck=0; /* bring sck low */
si=k&0x80; /* si is always equal to k's highest bit */
sck=1; /* bring sck high */
k<<=1; /* shift data k left 1 */
}
}
/******************************************************/
回答者:221.223.81.*2009-7-11 12:24
** 1602A液晶屏驱动程序**晶振频率:11.0592M*****************************************/#include <reg51.h>#define uchar unsigned char#define uint unsigned int sbit LCM_E=P3^5;//定义接口sbit LCM_RW=P3^6;sbit LCM_RS=P3^7; #define LCM_Data P1//数据接口void LCM_WriteData(uchar WDLCM);void LCM_WriteCommand(uchar WCLCM,BuysC);uchar LCM_ReadData(void);uchar LCM_ReadStatus(void);void LCM_Init(void);void DisplayOneChar(uchar X, uchar Y, uchar DData);void DisplayListChar(uchar X, uchar Y, uchar code *DData);void Delay5Ms(void);void Delay400Ms(void); uchar code uctech[] ={"1602A"};uchar code net[] = {"www.52c51.com"}; void main(void){Delay400Ms();//启动等待,等LCM讲入工作状态LCM_Init();//LCM初始化Delay5Ms();//延时片刻(可不要) DisplayListChar(6, 1, uctech);DisplayListChar(0, 0, net);LCM_ReadData();//测试用句无意义LCM_Data=255;while(1);} /****************************1602A写数据函数**************************//*函数原型:void LCM_WriteData(uchar WDLCM)/*函数功能:1602A写数据/*输入参数:要写入的数据/*输出参数:无/*调用模块:/**********************************************************************/ void LCM_WriteData(uchar WDLCM){LCM_ReadStatus();//检测忙LCM_Data = WDLCM;LCM_RS = 1;LCM_RW = 0;LCM_E = 0;//若晶振速度太高可以在这后加小的延时LCM_E = 0;//延时LCM_E = 1;} /****************************1602A写指令函数**************************//*函数原型:void LCM_WriteCommand(uchar WCLCM,BuysC)/*函数功能:1602A写指令/*输入参数:要写入的指令/*输出参数:无/*调用模块:/**********************************************************************/ void LCM_WriteCommand(uchar WCLCM,BuysC)//BuysC为0时忽略忙检测{if (BuysC) LCM_ReadStatus();//根据需要检测忙LCM_Data = WCLCM;LCM_RS = 0;LCM_RW = 0;LCM_E = 0;LCM_E = 0;LCM_E = 1;} /****************************1602A读数据函数**************************//*函数原型:uchar LCM_ReadData(void)/*函数功能:1602A读数据/*输入参数:无/*输出参数:1602A返回的数据/*调用模块:/**********************************************************************/ uchar LCM_ReadData(void){LCM_RS = 1;LCM_RW = 1;LCM_E = 0;LCM_E = 0;LCM_E = 1;return(LCM_Data);} /****************************1602A读状态函数**************************//*函数原型:uchar LCM_ReadData(void)/*函数功能:1602A读状态/*输入参数:无/*输出参数:1602A返回的状态/*调用模块:/**********************************************************************/ uchar LCM_ReadStatus(void){LCM_Data = 0xFF;LCM_RS = 0;LCM_RW = 1;LCM_E = 0;LCM_E = 0;LCM_E = 1;while (LCM_Data & 0x80);//检测忙信号return(LCM_Data);} /****************************1602A初始化函数**************************//*函数原型:void LCM_Init(void)/*函数功能:1602A初始化/*输入参数:无/*输出参数:无/*调用模块:/**********************************************************************/ void LCM_Init(void){LCM_Data = 0;LCM_WriteCommand(0x38,0);//三次显示模式设置,不检测忙信号Delay5Ms();LCM_WriteCommand(0x38,0);Delay5Ms();LCM_WriteCommand(0x38,0);Delay5Ms(); LCM_WriteCommand(0x38,1);//显示模式设置,开始要求每次检测忙信号LCM_WriteCommand(0x08,1);//关闭显示LCM_WriteCommand(0x01,1);//显示清屏LCM_WriteCommand(0x06,1);//显示光标移动设置LCM_WriteCommand(0x0C,1);//显示开及光标设置} /******************1602A按指定位置显示一个字符函数**********************//*函数原型:void DisplayOneChar(uchar X, uchar Y, uchar DData)/*函数功能:1602A按指定位置显示一个字符/*输入参数:X坐标Y坐标要显示的字符/*输出参数:无/*调用模块:/**********************************************************************/ void DisplayOneChar(uchar X, uchar Y, uchar DData){Y &= 0x1;X &= 0xF;//限制X不能大于15,Y不能大于1if (Y) X |= 0x40;//当要显示第二行时地址码+0x40;X |= 0x80;//算出指令码LCM_WriteCommand(X, 0);//这里不检测忙信号,发送地址码LCM_WriteData(DData);}/*******************1602A按指定位置显示一串字符函数*********************//*函数原型:void DisplayListChar(uchar X, uchar Y, uchar code *DData)/*函数功能:1602A按指定位置显示一个字符/*输入参数:X坐标Y坐标要显示字符串的首地址/*输出参数:无/*调用模块:/**********************************************************************/ void DisplayListChar(uchar X, uchar Y, uchar code *DData){uchar ListLength;ListLength = 0;Y &= 0x1;X &= 0xF;//限制X不能大于15,Y不能大于1while (DData[ListLength]>0x20)//若到达字串尾则退出{if (X <= 0xF)//X坐标应小于0xF{DisplayOneChar(X, Y, DData[ListLength]);//显示单个字符ListLength++;X++;}}} /********************5ms延时函数************************//*函数原型:void Delay5Ms(void)/*函数功能:5ms延时/*输入参数:无/*输出参数:无/*调用模块:/*********************
LCD_WtoiR(0x0e); /* (0x0c)?是否显示光标*/
LCD_WtoiR(0x06); /* (0x07)?光标左移或右移*/
}
void LCD_SFLine() /*显示第一行*/
{
LCD_WtoiR(0x80);
}
void LCD_SSLine() /*显示第二行*/
{
LCD_WtoiR(0xc0);
k=k|so; /* k or so */
/* k shift left one bit */
}
return k; /* return k */
}
/******************************************************/
void wren_cmd(char k) /* set write enable or disable latch */
void wren_cmd(char k);
char rdsr_cmd(void);
void wip_poll(void);
void wrsr_cmd(void);
void CheckBF() /*检查忙碌状态*/
{
char flag;
flag=0xff;
while((flag & 0x80)!=0)
{
i++;
ACC=rdsr_cmd(); /* read status register */
}百度文库
/* to 80 , continus polling */
}
void wrsr_cmd() /* write status register */
{ char k;
sck=0; /* bring sck low */
sbit si =P1^3;
sbit so =P1^2;
sbit clflag0 =ACC^0;
void CheckBF(void);
void LCD_WtoiR(char datas);
void LCD_WtData(char datas);
void LCD_Clr(void);
void LCD_Init(void);
Enable=1;
*p=P0;
number++;
p++;
CheckBF();
Enable=0;
}
*p='\0';
}
void outbyt(char k) /* sends byte to epprom */
{
char i;
for(i=0;i<8;i++) /* use i as bit counter to eight */
cs=0; /* bring cs low */
k=0x01; /* write status register instruction */
outbyt(k); /* send byte k=0x01 to epprom */
k=0x00; /* write command k to status register */
{
RS=0;
RW=1;
Enable=0;
Enable=1;
flag=P0;
Enable=0;
}
RW=0;
}
void LCD_WtoiR(char datas) /*指令函数*/
{
CheckBF();
Enable=0;
RS=0;
Enable=1;
P0=datas;
Enable=0;
}
void LCD_WtData(char datas) /*数据写入*/
void LCD_SFLine(void);
void LCD_SSLine(void);
void LCD_printf(char lines, char *p);
void ReadLine(char lines, char *p);
void outbyt(char k);
char inbyt(void);
{
char number,i;
if(lines==1)
{
number=0x80;
LCD_SFLine();
}
else
{
number=0xc0;
LCD_SSLine();
}
for(i=0;i<=19;i++)
{
LCD_WtoiR(number);
CheckBF();
Enable=0;
RS=1;
RW=1;
{
sck=0; /* bring sck low */
cs=0; /* bring cs low */
outbyt(k); /* set write enable latch 0x06 */
sck=0; /* set write disable latch 0x04 */
cs=1; /* bring cs high */
}
void LCD_printf(char lines, char *p) /*数据输出*/
{
if (lines==1)
LCD_SFLine();
else
LCD_SSLine();
while(*p=='$')
{
while(*p!='\0')
{
LCD_WtData(*p);
p++;
}
}
}
void ReadLine(char lines, char *p) /*读取数据*/
单片机液晶显示驱动程序(用C语言写的)
要求是:RS232接口单片机液晶显示模块PC机上使用串口调试助手的设置如下:
串口设置:波特率9600,无奇偶校验,数据位8位,停止位1位。
发送数据时必须以$开始,无结束字符。如$1234,就可以直接发送。
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
PCON=0x00;
{
CheckBF();
Enable=0;
RS=1;
RW=0;
Enable=1;
P0=datas;
Enable=0;
}
void LCD_Clr() /*清零*/
{
LCD_WtoiR(1);
}
void LCD_Init() /*初始化*/
{
LCD_WtoiR(0x38); /* (0x3c)?第一行或第二行*/
}
main()
{
char a[20];
LCD_Init();
LCD_Clr();
LCD_printf(1,"1234567"); /*读取第一行数据,在第二行输出*/
ReadLine(1,a);
LCD_printf(2,a);
wrsr_cmd();
while(1)
{
cs=0;
cs=1;
}
}
这是我的不知道对不对还需要补充什么的
outbyt(k); /* send byte k=0x00 to epprom */
sck=0; /* bring sck low */
cs=1; /* bring cs high */
wip_poll(); /* poll for completion of a nonvolatile write cycle */
k=0x05; /* read status register command byte 0x05 */
outbyt(k); /* send k=0x05 to epprom */
k=inbyt(); /* receieve k from epprom */
sck=0; /* bring sck low */
char inbyt(void) /* recieves byte from epprom */
{
char i,k;
for(i=0;i<8;i++) /* use i as bit counter to eight */
{
k<<=1;
sck=1; /* bring sck high */
sck=0; /* bring sck low */
}
/******************************************************/
char rdsr_cmd(void) /* read status register command */
{
char k;
sck=0; /* bring sck low */
cs=0; /* bring cs low */
SCON=0x50;
TR1=1;
ES=0;
#include <reg52.h>
#include <absacc.h>
#include <math.h>
sbit RS = P2^5;
sbit RW = P2^6;
sbit Enable = P2^7;
sbit cs =P1^0;
sbit sck =P1^1;