LCD_Delay();LCD_Delay();LCD_Delay(); LCD_SCL = 0; dat <<= 1; //左移一位,先发的是高位 } LCD_Delay();LCD_Delay();LCD_Delay(); LCD_SCL = 0; LCD_Delay();LCD_Delay();LCD_Delay(); //等待硬件反应(等待数据发送完全) } /********************************************************** 据
* 函数功能 ---> LCD写入一个字节命令或者数据 * 入口参数 ---> dat:要写入的命令或者数据
* ord:命令或者数据判断为。0为命令,1为数
* 返回数值 ---> none * 功能说明 ---> none
**********************************************************/ void LCD_Write_Byte(u8 dat,u8 ord) { u8 tem; u8 i,j;
tem = dat & 0xf0; //先发送高4位 LCD12864_Start((ord << 1) | 0xf0); //置RW为“0”、RS为“ord”并启动串行传输为数据格式 for(j = 0;j < 2;j++) //一个字节数据或者命令分两次发送 { 化 LCD_Delay();LCD_Delay();LCD_Delay(); 放上数据,屏蔽低4位
LCD_SCL = 0; //允许数据线电平变
for(i = 0;i < 8;i++) { if(tem & 0x80) LCD_SDA = 1; //
else LCD_SDA = 0;
LCD_Delay();LCD_Delay();LCD_Delay();
}
LCD_SCL = 0;
tem <<= 1; //左移一位,先
LCD_SCL = 1; //发送数据,上升
沿有效 LCD_Delay();LCD_Delay();LCD_Delay(); 发的是高位
tem = (dat << 4) & 0xf0; //发完高4位,再次发送低4位 } LCD_Delay();LCD_Delay();LCD_Delay(); LCD_SDA = 0; LCD_Delay();LCD_Delay();LCD_Delay(); LCD_SCL = 0; LCD_Delay();LCD_Delay();LCD_Delay(); LCD_CS = 0; LCD_Delay();LCD_Delay();LCD_Delay(); //等待硬件反应(等待数据发送完全) } //========================================================= #endif #endif
//=========================================================
/**********************************************************
* 函数功能 --->设置LCD显示位置
* 入口参数 ---> x:行,取值范围:1 ~ 4 * y:列,取值范围:0 ~ 7 * 返回数值 ---> none * 功能说明 ---> none
**********************************************************/ void LCD_Set_xy(u8 x,u8 y) { switch(x) { case 1: LCD_Write_Byte((One_LineAddress + y),0); //写入操作地址 break; case 2:
case 3: case 4: default:
LCD_Write_Byte((Two_LineAddress + y),0); //写入操作地址 break;
LCD_Write_Byte((Three_LineAddress + y),0); break;
//写入操作地址
LCD_Write_Byte((Four_LineAddress + y),0); //写入操作地址 break;
LCD_Write_Byte((One_LineAddress + y),0); //写入操作地址 break; } }
/********************************************************** * 函数功能 --->写入自定义字符到LCD的CGRAM * 入口参数 ---> *data_code:写入的数组 * 返回数值 ---> none * 功能说明 ---> none
**********************************************************/ void LCD_Write_CGRAM_ALL(const u8 *data_code) { u8 i; LCD_Write_Byte(0x34,0); //打开字符扩展指令 LCD_Write_Byte(0x02,0); //SR=0,允许输入 LCD_Write_Byte(0x30,0); //恢复基本指令 LCD_Write_Byte(0x40,0); //CGRAM地址 for(i = 0;i < CGRAM_Value;i++) { LCD_Write_Byte(data_code[i*2],1); LCD_Write_Byte(data_code[i*2+1],1); } }
/********************************************************** * 函数功能 ---> Modify the character content of the first CGRAM space * 入口参数 ---> *data_code:写入的数组 * 返回数值 ---> none * 功能说明 ---> none
**********************************************************/ void LCD_Write_CGRAM_ONE(const u8 *data_code,u8 add_h,u8 add_l) { u8 i; //Locked flag check if(LCD12864_LockedFlag==1)return;
else LCD12864_LockedFlag = 1; LCD_Write_Byte(0x34,0); //打开字符扩展指令 LCD_Write_Byte(0x02,0); //SR=0,允许输入 LCD_Write_Byte(0x30,0); //恢复基本指令 LCD_Write_Byte(0x40,0); //CGRAM地址 if(add_l==0) { for(i = 0;i < 16;i ++) { CGROM_Code[i*2] = data_code[i*2]; CGROM_Code[i*2+1] = data_code[i*2+1]; } } else if(add_l==2) { for(i = 0;i < 16;i ++) { CGROM_Code[i*2+32] = data_code[i*2]; CGROM_Code[i*2+33] = data_code[i*2+1]; } } else if(add_l==4) { for(i = 0;i < 16;i ++) { CGROM_Code[i*2+64] = data_code[i*2]; CGROM_Code[i*2+65] = data_code[i*2+1]; } } else if(add_l==6) { for(i = 0;i < 16;i ++) { CGROM_Code[i*2+96] = data_code[i*2]; CGROM_Code[i*2+97] = data_code[i*2+1]; } } for(i = 0;i < CGRAM_Value;i++) { LCD_Write_Byte(CGROM_Code[i*2],1); LCD_Write_Byte(CGROM_Code[i*2+1],1);
} //Locked flag recovery LCD12864_LockedFlag = 0; }
/********************************************************** * 函数功能 --->显示一个CGRAM内容 * 入口参数 ---> x:行 * y:列
* add_h:CGRAM高位地址 * add_l:CGRAM低位地址 * 返回数值 ---> none * 功能说明 ---> none
**********************************************************/ void Display_CGRAM(u8 x,u8 y,u8 add_h,u8 add_l) { //Locked flag check if(LCD12864_LockedFlag==1)return; else LCD12864_LockedFlag = 1;
LCD_Set_xy(x,y); //设置显示地址 LCD_Write_Byte(add_h,1); LCD_Write_Byte(add_l,1); //Locked flag recovery LCD12864_LockedFlag = 0; }
/********************************************************** * 函数功能 ---> LCD显示字符串 * 入口参数 ---> x:行 * y:列
* *str:要显示的字符串 * len:显示的长度 * 返回数值 ---> none
* 功能说明 --->可以从显示数组的任意位置starsum开始显示len长度的字符串 **********************************************************/ void Display_String(u8 x,u8 y,u8 *str,u8 len) { //Locked flag check if(LCD12864_LockedFlag==1)return; else LCD12864_LockedFlag = 1; LCD_Set_xy(x,y); //设置显示地址 while(len--)