📄 12864welcome.c
字号:
void LCM12864_TestBusy(void){
LCM12864_E = 0;
LCM12864_RW = 1;
LCM12864_RS = 0;
_nop_;
LCM12864_E = 1;
_nop_;_nop_;
while(LCM12864_DB7_DB0 & LCM12864_STATUS_BUSY);
}
/*********************************************************************************************
//写指令到LCM12864 LCM12864_WriteCMD()
//
**********************************************************************************************/
void LCM12864_WriteCMD(unsigned char LCM12864_command){ //LCM12864_command 欲写入指令
LCM12864_TestBusy();
LCM12864_RW = 0; LCM12864_RS = 0;LCM12864_E = 0;
_nop_;
LCM12864_DB7_DB0 = LCM12864_command;
_nop_;
LCM12864_E = 1;
_nop_;
LCM12864_TestBusy();
}
/*********************************************************************************************
//写数据到LCM12864 LCM12864_WriteData()
//
**********************************************************************************************/
void LCM12864_WriteData(unsigned char LCM12864_data){ //LCM12864_command 欲写入数据
LCM12864_TestBusy();
LCM12864_RW = 0; LCM12864_RS = 1;
LCM12864_E = 0;
_nop_;
LCM12864_DB7_DB0 = LCM12864_data;
_nop_;
LCM12864_E = 1;
_nop_;
LCM12864_TestBusy(); //读LCM忙
}
/********************************************************************************************
//从LCM12864读数据 LCM12864_ReadData()
//
*********************************************************************************************/
unsigned char LCM12864_ReadData(void){
unsigned char LCM12864_data;
LCM12864_E = 0;
LCM12864_RW = 1; LCM12864_RS = 1;
LCM12864_E = 1;
LCM12864_data = LCM12864_DB7_DB0; //送入8位数据
LCM12864_TestBusy(); //读LCM忙
return LCM12864_data;
}
/********************************************************************************************
//向LCM12864指定点写一字节数据 LCM12864_Write1Byte_X_Y()
//
/********************************************************************************************/
void LCM12864_Write1Byte_X_Y( unsigned char x, //x坐标值(0-127)
unsigned char y, //y坐标值(0-63)
unsigned char LCM12864_data){ //LCM12864_data 所要写的数据
x = x&0x7f; y = y&0x3f; //参数过滤
LCM12864_CS1 = 1; LCM12864_CS2 = 1; //不选中左半屏及右半屏
if(x<64){ // 判断选择左、右半屏
LCM12864_CS1 = 0; // 选中左半屏
}
else{
LCM12864_CS2 = 0; // 选中右半屏
x = x-64;
}
LCM12864_WriteCMD(LCM12864_COL_START_ADDR+x); // 设置当前列地址,即x坐标
LCM12864_WriteCMD(LCM12864_PAGE_START_ADDR+y); // 设置当前页地址,即y坐标
LCM12864_WriteData(LCM12864_data); // 向LCM12864写数据
}
/********************************************************************************************
//从LCM12864指定点读取一字数据 LCM12864_Read1Byte_X_Y()
//
/********************************************************************************************/
unsigned char LCM12864_Read1Byte_X_Y( unsigned char x, //x坐标值(0-127)
unsigned char y){ //y坐标值(0-63)
unsigned char LCM12864_data;
x = x&0x7f; y = y&0x3f; //参数过滤
LCM12864_CS1 = 1; LCM12864_CS2 = 1; //不选中左半屏及右半屏
if(x<64){ // 判断选择左、右半屏
LCM12864_CS1 = 0; // 选中左半屏
}
else{
LCM12864_CS2 = 0; // 选中右半屏
x = x-64;
}
LCM12864_WriteCMD(LCM12864_COL_START_ADDR+x); // 设置当前列地址,即x坐标
LCM12864_WriteCMD(LCM12864_PAGE_START_ADDR+y); // 设置当前页地址,即y坐标
LCM12864_data = LCM12864_ReadData(); // 向LCM12864写数据
return LCM12864_data;
}
/********************************************************************************************
//向LCM12864填充数据 LCM12864_Fill_Screen()
//
*********************************************************************************************/
void LCM12864_Fill_Screen( unsigned char t, //设置涮屏速度(为1不涮屏,默认为60)
unsigned char LCM12864_FillData){ //欲写入的数据
unsigned char x,y;
LCM12864_CS1 = 0;LCM12864_CS2 = 0; // 选中左半屏及右半屏
LCM12864_WriteCMD(LCM12864_START_ROW+0); // 设置显示起始行为0
for(x=0;x<8;x++){
Delay(t); // 涮屏速度延时
LCM12864_WriteCMD(LCM12864_PAGE_START_ADDR+x); // 设置页地址
LCM12864_WriteCMD(LCM12864_COL_START_ADDR);// // 设置列地址
for(y=0;y<64;y++) LCM12864_WriteData(LCM12864_FillData);
}
LCM12864_CS1 = 1; // 不选中右半屏
LCM12864_CS2 = 1; // 不选中右半屏
}
/********************************************************************************************
//LCM12864清屏 LCM12864_Clear_Screen()
//
*********************************************************************************************/
void LCM12864_Clear_Screen(void){
LCM12864_Fill_Screen(60,0x00); //写入0到每个显示区
}
/********************************************************************************************
//LCM12864黑屏 LCM12864_Clear_black()
//
*********************************************************************************************/
void LCM12864_Clear_black(void){
LCM12864_Fill_Screen(0xff); //可写入其它数值以填满LCD屏
}
/********************************************************************************************
//显示128*64图片 LCM12864_Disp_Bitmap_12864()
//
*********************************************************************************************/
void LCM12864_Disp_Bitmap_12864( unsigned char t, //设置涮屏速度(为1不涮屏,默认为60)
unsigned char code *bitmap_12864){ //128*64点阵图像所在数组表
unsigned char j,k;
for(k=0;k<8;k++){ //设置8页的显示
Delay(t);
LCM12864_CS1 = 0;LCM12864_CS2 = 1; //半屏选中
LCM12864_WriteCMD(LCM12864_PAGE_START_ADDR+k); //选中页
LCM12864_WriteCMD(LCM12864_COL_START_ADDR+0); //选中列
for(j=0;j<64;j++){
LCM12864_WriteData(bitmap_12864[k*128+j]); //开始写入数据
}
LCM12864_CS1 = 1;LCM12864_CS2 = 0;
LCM12864_WriteCMD(LCM12864_PAGE_START_ADDR+k);
LCM12864_WriteCMD(LCM12864_COL_START_ADDR+0);
for(j=64;j<128;j++){
LCM12864_WriteData(bitmap_12864[k*128+j]);
}
}
}
/********************************************************************************************
//在LCM12864的指定点显示16*16点阵汉字 LCM12864_Disp_Chinese_16_16()
//
*********************************************************************************************/
void LCM12864_Disp_Char_x_16( unsigned char t, //设置书写速度(为1直接显示,默认为12)
unsigned char b, //输入8:8*16字符,16:16*16字符
unsigned char LCM12864_page, //LCM12864的页地址(0~7)
unsigned char LCM12864_col, //LCM12864的列地址(0~128)注意:右半屏起始是64
unsigned char code *Char_x_16){ //16*16点阵汉字字模(纵向取模,字节倒序)
unsigned char j=0,i=0;
if(LCM12864_col < 64 ){
LCM12864_CS1 = 0; LCM12864_CS2 = 1; //判断屏幕使能
}
else{
LCM12864_CS1 = 1; LCM12864_CS2 = 0;
LCM12864_col = LCM12864_col - 64;
}
for(j=0;j<2;j++){
LCM12864_WriteCMD(LCM12864_PAGE_START_ADDR+LCM12864_page+j);
LCM12864_WriteCMD(LCM12864_COL_START_ADDR+LCM12864_col);
for(i=0;i<b;i++){
LCM12864_WriteData(Char_x_16[b*j+i]);
Delay(t);
}
}
}
/********************************************************************************************
//LCM12864初始化 LCM12864_Init()
//
*********************************************************************************************/
void LCM12864_Init(void){
LCM12864_RESET = 0; //复位
Delay(300);
LCM12864_RESET = 1;
Delay(300);
LCM12864_Clear_Screen(); //清除屏幕
LCM12864_CS1 = 0; LCM12864_CS2 = 0; //选中双屏
LCM12864_WriteCMD(LCM12864_DISP_OFF); //关显示
LCM12864_WriteCMD(LCM12864_PAGE_START_ADDR+0); //第0页位置
LCM12864_WriteCMD(LCM12864_START_ROW+0); //第0行
LCM12864_WriteCMD(LCM12864_COL_START_ADDR+0); //第0列
LCM12864_WriteCMD(LCM12864_DISP_ON); //开显示
}
/*********************************************************************************************/
// 以上是 LCM12864液晶模块驱动程序
/*********************************************************************************************/
/********************************************************************************************
//LCM12864液晶模块驱动演示 main()
//
*********************************************************************************************/
void main (void){
unsigned char lx = 32,i;
LCM12864_Init(); // LCM12864初始化
//while(1){
//LCM12864_Disp_Bitmap_12864(60,doyleee); //显示LOGO图像
//Delay(1000); //延时1秒
//LCM12864_Clear_Screen(); //清除屏幕
//for(i=0;i<7;i++){ //显示字符串“Dy12864”
//LCM12864_Disp_Char_x_16(8,8,1,lx+8*i,nAsciiDot+16*i); //显示“Dy12864”,从第1页第32列
//}
//Delay(1000);
LCM12864_Disp_Char_x_16(1,16,4,25,huan1); //显示“欢”,在第4页第46列
Delay(200);
LCM12864_Disp_Char_x_16(1,16,4,66,ying2); //显示“迎”,在第4页第66列
Delay(200);
//}
while(1);
}
/*********************************************************************************************/
// DoYoung.net 电子技术 ---创造独立资源
/*********************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -