www.pudn.com > TG12864.rar > SPISerial.c
#include#include #include ///////////////////////////////////////////////////////////////////////////// #define uchar unsigned char #define uint unsigned int #define ulong unsigned long ////////////////////////////////////////////////////////////////////////////// code uchar ke[32]= { /*-- 文字: 克 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0x00,0x80,0x43,0x31,0x0F,0x01,0x01,0x01,0x3F,0x41,0x43,0x40,0x40,0x70,0x00, 0x00,0x04,0x04,0xE4,0x24,0x24,0x24,0x3F,0x24,0x24,0x24,0xE4,0x04,0x04,0x00,0x00, }; code uchar num[16*10]= //数字库 { /*-- 文字: 0 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/ 0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00, /*-- 文字: 1 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/ 0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00, /*-- 文字: 2 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/ 0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00, /*-- 文字: 3 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/ 0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00, /*-- 文字: 4 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/ 0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00, /*-- 文字: 5 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/ 0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00, /*-- 文字: 6 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/ 0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00, /*-- 文字: 7 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/ 0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00, /*-- 文字: 9 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/ 0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00, }; /////////////////////////////////////////////////////////////////////////// code uchar dot[16]= { /*-- 文字: . --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=9x16 --*/ 0x00,0x30,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }; //管脚定义//////////////////////////////////////////////////////////////// sbit A0=P2^1; sbit CS=P2^4; //函数列表////////////////////////////////////////////////////////////////// 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); ////////////////////////////////////////////////////////////////////////// //写控制命令到lcd void wcode (uchar i) //A0=0,CS=0 { SPSTAT=0xc0; CS=1;_nop_(); A0=0;_nop_(); CS=0;_nop_(); SPDAT=i; while(1) { if(SPSTAT&0x80) break; } CS=1;_nop_(); SPSTAT=0xc0; } ////////////////////////////////////////////////////////////////////////// //写显示数据到lcd //A0=1,CS=0 void wdata (uchar i) { SPSTAT=0xc0; CS=1;_nop_(); A0=1;_nop_(); CS=0;_nop_(); SPDAT=i; while(1) { if(SPSTAT&0x80) break; } CS=1;_nop_(); SPSTAT=0xc0; } /////////////////////////////////////////////////////////////////////// //液晶屏初始化 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(0xa3);//设置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 shownum (uchar xx, uchar yy, uchar n, uchar fb) /*函数名为shownum的显示数字的函数*/ { //shownum子函数开始 uchar i,dx; //定义i、dx为无符号字符型局部变量 for(i=0;i<8;i++) //for循环体,用于扫描汉字的上半部分 {dx=num[i+n*16]; //取得第n个数字的上半部分数据代码 if(fb)dx=255-dx; //若fb不为0,获得反白数据代码 lw(xx+i+2,yy+1,dx); } //将数据代码写入LCd for(i=0;i<8;i++) {dx=num[(i+8)+n*16]; //取得第n个数字的下半部分数据代码 if(fb)dx=255-dx; //若fb不为0,获得反白数据代码 lw(xx+i+2,yy,dx); //将数据代码写入LCM } //for循环体结束 } //shownum子函数结束 ////////////////////////////////////////////////////////// void dotshow (uchar xx, uchar yy, uchar dotshow[], uchar fb) { uchar i,dx; for(i=0;i<8;i++) {dx=dotshow[i]; if(fb)dx=255-dx; lw(xx+i+2,yy+1,dx); } for(i=0;i<8;i++) {dx=dotshow[i+8]; if(fb)dx=255-dx; lw(xx+i+2,yy,dx); } } ///////////////////////////////////////////////////////// void showsing (uchar xx, uchar yy, uchar team[], uchar fb) /*函数名为showsing的显示单个汉字子函数。 定义xx、yy、n、fb为无符号字符型局部变量。其中xx、yy为列、页定位值.带数组显示*/ { //showsing子函数开始 uchar i,dx; //定义i、dx为无符号字符型局部变量 for(i=0;i<16;i++) //for循环体,用于扫描汉字的上半部分 {dx=team[i]; //取得第n个汉字的上半部分数据代码 if(fb)dx=255-dx; //若fb不为0,获得反白数据代码 lw(xx+i+2,yy+1,dx); } //将数据代码写入LCd for(i=0;i<16;i++) {dx=team[i+16]; //取得第n个汉字的下半部分数据代码 if(fb)dx=255-dx; //若fb不为0,获得反白数据代码 lw(xx+i+2,yy,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 dispnum( ulong val) /*显示六位数*/ /* VAL为所显示的数*/ { ulong shiwan,wan,th,hu,ten,sig; ulong temper0,temper1,temper2,temper3; if((val<10)&&(val>=0)) { sig=val; shownum(64,2,sig,0); shownum(56,2,0,0); dotshow(48,2,dot,0); shownum(40,2,0,0); } if((val<100)&&(val>=10)) { sig=val%10; ten=(val-val%10)/10; shownum(64,2,sig,0); shownum(56,2,ten,0); dotshow(48,2,dot,0); shownum(40,2,0,0); } if((val<1000)&&(val>=100)) {temper0=val%100; sig=temper0%10; ten=(temper0-temper0%10)/10; hu=(val-ten*10-temper0%10)/100; shownum(64,2,sig,0); shownum(56,2,ten,0); dotshow(48,2,dot,0); shownum(40,2,hu,0); } if((val<10000)&&(val>=1000)) {temper0=val%1000; temper1=temper0%100; sig=temper1%10; ten=(temper1-temper1%10)/10; hu=(temper0-ten*10-temper1%10)/100; th=(val-hu*100-ten*10-temper1%10)/1000; shownum(64,2,sig,0); shownum(56,2,ten,0); dotshow(48,2,dot,0); shownum(40,2,hu,0); shownum(32,2,th,0); } if((val<100000)&&(val>=10000)) {temper0=val%10000; temper1=temper0%1000; temper2=temper1%100; sig=temper2%10; ten=(temper2-temper2%10)/10; hu=(temper1-ten*10-temper2%10)/100; th=(temper0-hu*100-ten*10-temper2%10)/1000; wan=(val-th*1000-hu*100-ten*10-temper2%10)/10000; shownum(64,2,sig,0); shownum(56,2,ten,0); dotshow(48,2,dot,0); shownum(40,2,hu,0); shownum(32,2,th,0); shownum(24,2,wan,0); } if((val<1000000)&&(val>=100000)) {temper0=val%100000; temper1=temper0%10000; temper2=temper1%1000; temper3=temper2%100; sig=temper3%10; ten=(temper3-temper3%10)/10; hu=(temper2-ten*10-temper3%10)/100; th=(temper1-hu*100-ten*10-temper3%10)/1000; wan=(temper0-th*1000-hu*100-ten*10-temper3%10)/10000; shiwan=(val-wan*10000-th*1000-hu*100-ten*10-temper3%10)/100000; shownum(64,2,sig,0); shownum(56,2,ten,0); dotshow(48,2,dot,0); shownum(40,2,hu,0); shownum(32,2,th,0); shownum(24,2,wan,0); shownum(16,2,shiwan,0); } } /////////////////////////////////////////////////////////////////////// /****************************主函数******************************/ void main(void) { ulong weigth=111111; P2M1=0xc0;P2M2=0xc0; SPCTL=0xdc; SPSTAT=0xc0; init_12864(); //LCM初始化 while(1) //无限循环 { dispnum(weigth); showsing(80,2,ke,0); } }