//头文件部分 #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; |