本文引用地址:https://www.eepw.com.cn/article/201611/315615.htm //头文件部分 #include //====================================================== //定义常用符号,LCD控制字符号常量,TIME0定时赋值常量 #define uchar unsigned char #define uint unsigned int
#define DISPON 0x3f #define DISPOFF 0x3e #define DISPFIRSTLINE 0xc0 #define LCDBUZY 0x80 #define LIMIT 0x80 //128列限制 #define TL0NUMB (65536-50000)%256 //定时50MS,20次溢出为一秒定时中断 #define TH0NUMB (65536-50000)/256 #define TCOUNTF 10 //========================================================= //定义引脚 sbit lck = P3^5; //锁存信号引脚
//========================================================= //定义全局变量 uchar combyte; //LCD命令变量 uchar data status; //状态变量,左右半屏标志量 uchar tcount = 0; //限制定时时间标志 //uchar pagebyte = 0; //上下移页控制量 uchar colbyte = 120; //左右移列控制量
//========================================================= //定义图形参数 uchar code A[]={0xe0, 0x0f, 0xf0, 0x0f, 0x98, 0x00, 0x8c, 0x00, // A,此处的参数是按照列输入来写的,英文内码是按照行输入来写的 0x98, 0x00, 0xf0, 0x0f, 0xe0, 0x0f, 0x00, 0x00};
//========================================================= //函数原型 void IniLcd(void); //初始化LCD void ClrLcd(uchar); //清屏LCD void WrComL(uchar); //写左半屏幕命令字 void WrComR(uchar); //写右半屏幕命令字 void WrData(uchar,uchar,uchar); //写数据 void Locate(uchar,uchar); //LCD屏定位 void delayus(uint); //微妙级延迟 void delay(void); //延迟个几秒 //void PicturePage(void); //图形下移函数 void PictureCol(void); //图像左移函数
void IniTime0(void); //初始化定时器0,利用MCU的内部定时完成图像的移动过程 //========================================================= //主程序部分 void main(void) { IniLcd(); IniTime0(); while(1); //对LCD的操作 /*{ Picture(); delay(); ClrLcd(0x00); }*/ } /******************************************************/ /* 以下部分是LCD12864的驱动模块 */ /******************************************************/
//========================================================= //初始化定时器0函数 void IniTime0(void) { TMOD = 0x01; //TCON = 0x00; TL0 = TL0NUMB; TH0 = TH0NUMB; TR0 = 1; ET0 =1; EA =1; } //========================================================= //定时器中断函数 void Time0(void) interrupt 1 { TR0 = 0; TL0 = TL0NUMB; TH0 = TH0NUMB; tcount++; if(tcount == TCOUNTF) { tcount = 0;
/*PicturePage(); pagebyte++; if(pagebyte > 6) pagebyte = 0;*/ PictureCol(); colbyte--; } TR0 = 1; } //========================================================= //初始化LCD函数 void IniLcd(void) { combyte = DISPOFF; WrComL(combyte); WrComR(combyte);
combyte = DISPON; WrComL(combyte); WrComR(combyte); combyte = DISPFIRSTLINE; WrComL(combyte); WrComR(combyte); ClrLcd(0x00); /*combyte = DISPFIRSTLINE; WrComL(combyte); WrComR(combyte);*/ Locate(0x00,0x00); } //========================================================= //清屏LCD函数 void ClrLcd(uchar cbyte) { uchar i,j; for(i=0;i<8;i++) { delayus(6); for(j=0;j{ delayus(6); WrData(cbyte,i,j); } } }
//========================================================= //微妙级延迟函数 void delayus(uint t) { while(t--); }
//========================================================= //延迟个几秒函数 void delay(void) { delayus(50000); delayus(50000); delayus(50000); delayus(50000); delayus(50000); delayus(50000); }
//========================================================= //写左半屏幕命令字函数 void WrComL(uchar cbyte) { lck = 0; P1 = 0x29; //E = 1;R/W = 1;D/I = 0; CS1 = 1; CS2 = 0; lck = 1; while(P0&LCDBUZY); lck = 0; P1 = 0x00; //E = 0; lck = 0;
lck = 0; P1 = 0x21; //E = 1;R/W = 0;D/I = 0; CS1 = 1; CS2 = 0; lck = 1; P0 = cbyte; lck = 0; P1 = 0x00; //E = 0; lck = 1; } //========================================================= //写右半屏幕命令字函数 void WrComR(uchar cbyte) { lck = 0; P1 = 0x2a; //E = 1;R/W = 1;D/I = 0; CS1 = 0; CS2 = 1; lck = 1; while(P0&LCDBUZY); lck = 0; P1 = 0x00; //E = 0; lck = 0;
lck = 0; P1 = 0x22; //E = 1;R/W = 0;D/I = 0; CS1 = 0; CS2 = 1; lck = 1; P0 = cbyte; lck = 0; P1 = 0x00; //E = 0; lck = 1; } //========================================================= //LCD屏幕点定位函数 void Locate(uchar page,uchar col) { uchar com_page,com_col,right; switch(col&0xc0) { case 0x00: //左半屏幕 { right = 0; break; } case 0x40: //右半屏幕 { right = 1; break; } default: break; } com_page = page&0x07|0xb8; //将页数据转换为页命令字 com_col = col&0x3f|0x40; //将列数据转换为列命令字
switch(right) { case 0x00: //左半屏幕 { WrComL(com_page); WrComL(com_col); status = 0; break; } case 0x01: //右半屏幕 { WrComR(com_page); WrComR(com_col); status = 1; break; } default: break; } } //========================================================= //写数据函数 void WrData(uchar databyte,uchar page,uchar col) { Locate(page,col);
P0 = databyte; lck = 0; if(status) P1 = 0x26; //E = 1; R/W = 0; D/I = 1; CS1 = 0; CS2 = 1; else P1 = 0x25; //E = 1; R/W = 0; D/I = 1; CS1 = 1; CS2 = 0; lck = 1; //P0 = databyte; lck = 0; P1 = 0x00; lck = 1; } //========================================================= //图形函数,图像按页下移 /*void PicturePage(void) { uchar col,page; uchar i = 0; ClrLcd(0x00); for(col=64;col<72;col++) { for(page=pagebyte;page{ WrData(A[i++],page++,col); } } }*/
//========================================================= //图形左移函数 void PictureCol(void) { uchar col,page; uchar i = 0; ClrLcd(0x00); for(col=colbyte;(col=0);) //列控制 { for(page=0;page<2;page++) //页控制 { WrData(A[i++],page,col); //写数据,“i++”同步跟新数据 } col++; } if(colbyte==0) colbyte = 120;
} |
评论