| 
 
| 本帖最后由 li923661521 于 2011-8-16 21:21 编辑 
 一直在忙竞赛的事,抽空先把液晶1602编好了,熟悉下开发板结构,免得掉队太多。不好的地方大家拍砖。希望在以后的培训中可以用到助学板!
 
 
 #include"lcd1602.h"
 
 //***************程序说明*******************
 // 对字符型液晶显示器定义三根地址线:
 // sbit RS=P4^0;sbit RW=P4^1;sbit EN=P4^2;
 // 由于P4口在f020单片机上不可位寻址,故以下
 // 程序均采用对P4口赋值的形式给三根控制位赋值
 //*******************************************
 
 //*******************************************
 // 该部分主要是对要用到的函数进行申明
 // 后面将具体的对相关函数进行定义,可选择性的选
 // 择相关函数
 //*******************************************
 
 /*
 void Lcd1602_Initial( );
 void Lcd1602_Write_Command(uchar Command_Code);
 void Lcd1602_Write_Data(uchar row,uchar column,uchar Data);
 void Lcd1602_Write_String(uchar row,uchar column,uchar *dis_buffer);
 //void Lcd1602_Clear_Char(uchar row,uchar column);
 //void Lcd1602_Clear_Line(uchar line);
 void Lcd1602_Clear_All( );
 void Lcd_delay(uint t1,t2);*/
 
 
 //************************************************************
 // 功能说明:清除指定的位置的字符,光标返回最左边第一个字符位置
 // 输入变量:uchar row,uchar column ;全局变量:无
 // 返回值 : 无
 // 调用函数 : Lcd1602_Write_String()
 //************************************************************
 /*void Lcd1602_Clear_Char(uint8_t row,uint8_t column)
 {
 Lcd1602_Write_String(row,column," ");
 }*/
 
 //*************************************************************
 // 功能说明:清除指定的行,光标返回最左边第一个字符位置
 // 输入变量:uchar line ; 全局变量 : 无
 // 返回值 : 无
 // 调用函数 :Lcd1602_Write_String();Lcd1602_Write_Command()
 //*************************************************************
 /*void Lcd1602_Clear_Line(uint8_t line)
 {
 Lcd1602_Write_String(line,0," ");
 switch(line) //这种结构保持以后升级到多行显示液晶
 {
 case 1:Lcd1602_Write_Command(0x80);break; //将数据地址指针定位到第一行
 case 2:Lcd1602_Write_Command(0x80+0x40);break; //将数据地址指针定位到第二行
 default: break;
 }
 } */
 
 //**************************************************************
 // 功能说明:清屏,并将DDRAM指针指向第一行第一列
 // 输入变量:无 ;全局变量: 无 ;返回值:无
 // 调用函数:Lcd1602_Write_Command()
 //***************************************************************
 void Lcd1602_Clear_All( )
 {
 Lcd1602_Write_Command(0x01);//显示清屏。
 Lcd1602_Write_Command(0x80);//将数据指针设置到第一行的第一个字符。
 }
 
 //**************************************************************
 // 功能说明:延时
 // 输入变量:uint t1,t2 全局变量:无 ;返回值:无
 // 调用函数:无
 //*************************************************************
 void Lcd_delay(uint16_t t1,uint16_t t2)
 {
 uint16_t i,j;
 for(i=1;i<T1;I++)
 {
 for(j=1;j<T2;J++);
 }
 
 }
 
 
 
 
 //**********************************************
 // 功能说明:对字符型液晶显示器LCD1602进行初始化
 // 输入变量:无 ; 全局变量:无
 // 返回值: 无
 // 调用函数:Lcd1602_Write_Command()
 //**********************************************
 void Lcd1602_Initial( )
 {
 Lcd1602_Write_Command(0x38);//显示模式设置:0011(数据位8位),1(双行显示)0(5*7点阵)**
 Lcd1602_Write_Command(0x0c);//显示开关设置:0000,11(开显示),1(开光标),1(字符闪烁)
 Lcd1602_Write_Command(0x01);//清屏显示设置:显示清屏。
 Lcd1602_Write_Command(0x06);//输入方式设置:0000,011(光标自左向右移)0(整屏不移动)。
 Lcd1602_Write_Command(0x80);//将数据指针设置到第一行的第一个字符。
 Lcd1602_Write_Command(0x02);//光标复位命令:数据指针清零
 Lcd1602_Write_Command(0x0c);//开显示,显示光标,光标闪烁
 Lcd1602_Write_Command(0x80);//将数据指针设置到第一行的第一个字符。
 }
 
 //**************************************************
 // 功能说明:对字符型液晶显示器LCD1602写入控制字
 // 输入变量:uchar Command_Code ;全局变量:无
 // 返回值 :无
 // 调用函数 :无
 //**************************************************
 void Lcd1602_Write_Command(uint8_t Command_Code)
 {
 
 EN_Clr;RW_Clr;RS_Clr; //RS=0;RW=0;EN=0;开始写入指令
 DrvGPIO_SetPortBits(E_GPA, Command_Code); //将待写入指令赋给P5口
 Lcd_delay(10,10);
 EN_Set; //NE=1;开启使能
 Lcd_delay(10,10);
 EN_Clr; //EN=0;当EN由高向底转变时,LCD接收数据或指令
 
 }
 
 //**************************************************
 // 功能说明:对字符型液晶显示器LCD1602写入数据
 // 输入变量:uchar row,uchar column,uchar Data
 // 其中row的取值范围为1~2,column的取值范围为0~15
 // 全局变量 :无 ;返回值 : 无
 // 调用函数 :Lcd1602_Write_Command()
 //**************************************************
 void Lcd1602_Write_Data(uint8_t row,uint8_t column,uint8_t Data)
 {
 
 if (row==2)
 column |= 0x40; //当要显示第二行时,相应的地址码为当前列数+0x40;
 column |= 0x80; //算出指令码即让DDRAM指针指向相应的位置
 
 Lcd1602_Write_Command(column); //这里不检测忙信号,发送地址码
 RS_Set; RW_Clr; EN_Clr; //RS=1;RW=0;EN=0;开始写入数据
 DrvGPIO_SetPortBits(E_GPA, Data);
 Lcd_delay(20,10);
 EN_Set; //EN=1
 Lcd_delay(10,10); ////******baozhu
 EN_Clr; RS_Clr; RW_Clr; //EN=0
 
 }
 
 //***********************************************************
 // 功能说明:写字符串到LCD,如果一行写不下,则写到下一行
 // 如果一屏写不下,则只写一屏;
 // 输入变量:uchar row,uchar column,uchar *dis_buffer
 // 全局变量 :无 ;返回值 : 无
 // 调用函数 :Lcd1602_Write_Data();Lcd1602_Write_Command
 //***********************************************************
 void Lcd1602_Write_String(uint8_t row,uint8_t column,uint8_t *dis_buffer)
 {
 uint8_t i=0;
 
 while(dis_buffer!='\0')
 {
 Lcd1602_Write_Data(row,column,dis_buffer);
 i++;column++;
 if(column==40)
 {
 column=1;
 row++;
 if(row==2)
 return;
 else
 {
 switch(row) //这种结构保持以后升级到多行显示液晶
 {
 case 1:Lcd1602_Write_Command(0x80);break;
 case 2:Lcd1602_Write_Command(0x80+0x40);break;//重新调整数据地址指针
 default:break;
 }
 }
 }
 }
 }
 | 
 
×本帖子中包含更多资源您需要 登录 才可以下载或查看,没有账号?注册 
  |