www.pudn.com > TG12864.rar > time.c
#include#include #include #define uchar unsigned char #define uint unsigned int #define ulong unsigned long #define uint8 unsigned char #define DATA P0 code uchar hz[]= { 0x00,0x04,0x00,0x04,0x00,0x04,0xFE,0x04,0x92,0x04,0x92,0x04,0x92,0x04,0x92,0xFF, 0x92,0x04,0x92,0x04,0x92,0x04,0x92,0x04,0xFE,0x04,0x00,0x04,0x00,0x04,0x00,0x00,/*"早",0*/ };/*"。",31*/ //管脚定义//////////////////////////////////////////////////////////////// sbit CS=P2^1; sbit A0=P1^0; sbit WR=P2^6; sbit RD=P2^7; //函数列表////////////////////////////////////////////////////////////////// void wcode(uchar i); void wdata(uchar i); void lcd_busy(void); void rdata(uchar i); void init_12864(void); void startline(uchar i); void disoff(uchar o); void delay(ulong v) ; void setxy (uchar x1,uchar x2,uchar y) ; void lw(uchar x, uchar y, uchar dd) ; void dh(uchar xx, uchar yy, uchar n, uchar fb); void clear(void); ////////////////////////////////////////////////////////////////////////// //检测忙信号? //A0=0;RD=0;WR=1 void lcd_busy(void) { //函数名为lcd_busy 的判LCM忙子函数 //lcd_busy函数开始 CS=1; WR=1;_nop_(); A0=0; RD=0;_nop_(); DATA=0xff;_nop_(); //选择指令寄存器,选择读方式,LCM数据口置全1 CS=0; while(1) { //while循环体,无限循环 //使能,将LCM的状态读入MCU if(DATA&0x80)break; /*若读入状态的数据小于0x80,说明最高位为0,LCM空闲,执行break语句跳出while循环体*/ //禁能 } CS=1;_nop_(); }// / while循环体结束 ///////////////////////////////////////////////////////////////////////////// //写控制命令到lcd //A0=0;RD=1;WR=0 void wcode (uchar i) { lcd_busy(); //检测忙? CS=1; RD=1;_nop_(); // delay(0x04); A0=0; WR=0;_nop_(); CS=0;_nop_(); DATA=i; //delay(0x04); // DATA=i; _nop_(); _nop_(); CS=1;_nop_(); } ////////////////////////////////////////////////////////////////////////// //写显示数据到lcd void wdata (uchar i) //A0=1;RD=1;WR=0 { lcd_busy();//检测忙? CS=1; RD=1;_nop_(); // delay(0x04); A0=1; WR=0;_nop_(); CS=0;_nop_(); DATA=i; // delay(0x04); //DATA=i; _nop_(); _nop_(); CS=1;_nop_(); } /////////////////////////////////////////////////////////////////////// //lcd读显示数据 void rdata (uchar i) //A0=1;RD=0;WR=1 { lcd_busy();//检测忙? CS=1; WR=1;_nop_(); // delay(0x04); A0=1; RD=0;_nop_(); CS=0;_nop_(); DATA=i; //delay(0x04); //DATA=i; _nop_(); _nop_(); CS=1;_nop_(); } /////////////////////////////////////////////////////////////////// //液晶屏初始化 void init_12864(void) { /*函数名为lcd_init 的LCM初始化子函数*/ disoff(0x00);//开显示屏//0x00关显示;0x01开显示////1 wcode(0xa0); //设置ADC 为正常0---64 ///8 wcode(0xa6);//设置正常的开关状态/////9 wcode(0x2f);//设置能量控制16 wcode(0x81);wcode(0x00);//Electronic volume control setting 18 wcode(0xa2);//设置lcd bias///////11 wcode(0xc0);///选择输出状态寄存器////15 wcode(0xa5);//全屏亮///10 delay(4); ////// wcode(0xa4); //正常显示////// 10 startline(0x00);//从第一行开始显示//////2 clear();//清屏 /// disoff(0x01);//开显示屏//0x00关显示;0x01开显示////1 } ////////////////////////////////////////////////////////////////////// void startline (uchar i) //设置显示起始行 { i=i+0x40; wcode(i); } /////////////////////////////////////////////////////////////////////// void setxy (uchar x1,uchar x2,uchar y) //定位x方向、y方向的子函数 { y=y+0xb0; x2=x2+0x10; x1=x1+0x00; wcode(x1); wcode(x2); wcode(y); } /////////////////////////////////////////////////////////////////////// void disoff (uchar o)//显示屏关子函数 { o=o+0xae; wcode(o); } ////////////////////////////////////////////////////////////////////// void delay (ulong v) { while(v!=0)v--; } ///////////////////////////////////////////////////////////// /*-----------------------------------写数据至LCM子函数----------------------------------*/ void lw (uchar x, uchar y, uchar dd) /*函数名为lw 的写数据至LCM子函数。定义x、y、dd为无符号 字符型局部变量*/ {uchar temp,x1,x2; //lw子函数开始 temp=x; x=x&0x0f; x1=x; x=temp; x=x&0xf0; x=x/16; x=x&0x0f; x2=x; setxy(x1,x2,y); wdata(dd); } //////////////////////////////////////////////////////////// /*-------------------------------------显示汉字子函数------------------------------------------*/ void dh (uchar xx, uchar yy, uchar n, uchar fb) /*函数名为dh的显示汉字子函数。 定义xx、yy、n、fb为无符号字符型局部变量。其中xx、yy为列、页定位值, n为汉字库中的第n个汉字,fb为反白显示选择*/ { //dh子函数开始 uchar i,dx; //定义i、dx为无符号字符型局部变量 for(i=0;i<16;i++) //for循环体,用于扫描汉字的上半部分 {dx=hz[2*i+n*32]; //取得第n个汉字的上半部分数据代码 if(fb)dx=255-dx; //若fb不为0,获得反白数据代码 lw(xx*8+i,yy,dx); //将数据代码写入LCM dx=hz[(2*i+1)+n*32]; //取得第n个汉字的下半部分数据代码 if(fb)dx=255-dx; //若fb不为0,获得反白数据代码 lw(xx*8+i,yy+1,dx); //将数据代码写入LCM } //for循环体结束 } //dh子函数结束 /********************************************************/ void clear(void) { uchar x,y; for(y=0;y<8;y++) { for(x=0;x<=131;x++) lw(x,y,0x00); } } /****************************主函数******************************/ void main(void) { uchar loop;//定义字符型局部变量loop P0M1=0x00;P0M2=0x00; P1M1=0x0c;P1M2=0x00; P2M1=0x00;P2M2=0x00; P3M1=0x00;P3M2=0x00; wcode(0xe2); init_12864(); //LCM初始化 // delay(1000); //延时一会 while(1) //无限循环 { /************显示第一行(8个字)***********/ loop=0 ; dh(2*loop,0,loop,0); } /*************************/ //延时一会 }