ds18s20_dq=1; }
//单总线字节写入
void ds18s20writebyte(char val) {
uchar i; uchar temp; for(i=0;i<8;i++) {
temp=val>>i; temp&=0x01;
ds18s20writebit(temp); }
ds18s20delay(5); }
//单总线位读取
uchar ds18s20readbit(void) {
uchar i;
ds18s20_dq=0; ds18s20_dq=1; for(i=0;i<3;i++) return ds18s20_dq; }
//单总线字节读取
uchar ds18s20readbyte(void) {
uchar i;
uchar value=0; for(i=0;i<8;i++) {
if(ds18s20readbit()) value|=0x01<
return(value); }
//实时时钟复位函数 void resetds1302() {
ds18s20delay(1); sclk=0;
ds18s20delay(1); rstb=0;
ds18s20delay(1); rstb=1;
ds18s20delay(1); }
//时钟字节读取函数 uchar readbyteds1302() {
uchar i; uchar rbyte; uchar tempbyte; rbyte=0x00; i_o=1; ds18s20delay(1); for(i=0;i<8;++i) { sclk=1; ds18s20delay(1); sclk=0; ds18s20delay(1); tempbyte=(uchar)i_o; tempbyte<<=7; rbyte>>=1; rbyte|=tempbyte; } return rbyte; }
//时钟字节写入函数
void writebyteds1302(uchar w_byte) {
uchar i;
ds18s20delay(1);
for(i=0;i<8;++i) {i_o=0; if(w_byte&0x01)i_o=1; sclk=0; ds18s20delay(1); sclk=1; ds18s20delay(1); w_byte>>=1; } }
//时钟初始化函数 void initds1302() {
resetds1302();
writebyteds1302(0x8e); writebyteds1302(0); resetds1302();
writebyteds1302(0x90); writebyteds1302(0xab); resetds1302();
writebyteds1302(0xbe); writebyteds1302(0); writebyteds1302(0); writebyteds1302(0); writebyteds1302(0); writebyteds1302(0); writebyteds1302(0); writebyteds1302(0); writebyteds1302(0); writebyteds1302(0); resetds1302(); }
//时钟字节写入函数
void writeclkbyte(uchar adress,uchar date) {
adress=((adress*2)|0x80); resetds1302();
writebyteds1302(adress); writebyteds1302(date); resetds1302(); }
//状态检查 , void CheckState() {
unsigned char dat; DI=0; RW=1; do{
GDM12864ADataPort=0x00; EN=1; dat=GDM12864ADataPort; EN=0;
dat=0x80 & dat; //仅当第7位为0时才可操作(判别busy信号) }while(!(dat==0x00)); }
//向LCD发送命令
//command :命令
void SendCommandToLCD(unsigned char command) {
CheckState(); RW=0;
GDM12864ADataPort=command; EN=1; EN=0; }
//写显示数据 //dat:显示数据
void WriteByte(unsigned char dat) {
CheckState(); DI=1; RW=0;
GDM12864ADataPort=dat; EN=1; EN=0; }
//设定行地址(页)--X 0-7
void SetLine(unsigned char line) {
line=line & 0x07; // 0<=line<=7 line=line|0xb8; //1011 1xxx SendCommandToLCD(line); }
//设定列地址--Y 0-63
void SetColumn(unsigned char column) {
column=column &0x3f; // 0= //设定显示开始行--XX void SetStartLine(unsigned char startline) //0--63 { startline=startline & 0x07; startline=startline|0xc0; //1100 0000 SendCommandToLCD(startline); } //开关显示 void SetOnOff(unsigned char onoff) { onoff=0x3e | onoff; //0011 111x SendCommandToLCD(onoff); } //选择屏幕 //screen: 0-全屏,1-左屏,2-右屏 void SelectScreen(unsigned char screen) { //cs1: 1--左; cs2: 1--右 switch(screen) { case 0: cs1=0;//全屏 _nop_(); _nop_(); _nop_(); cs2=0; _nop_(); _nop_(); _nop_(); break; case 1: cs1=0;//左屏 _nop_(); _nop_(); _nop_(); cs2=1; _nop_(); _nop_(); _nop_(); break; case 2: cs1=1;//右屏 _nop_(); _nop_(); _nop_(); cs2=0; _nop_(); _nop_(); _nop_(); break; } } //延时 delay(unsigned int t ) { unsigned int i=t,m,n; for(m=0;m //清屏 //screen: 0-全屏,1-左屏,2-右 ?分屏干嘛,直接全屏不好吗 void ClearScreen(unsigned char screen) { unsigned char i,j; SelectScreen(screen); for(i=0;i<8;i++){ SetLine(i); for(j=0;j<128;j++){ WriteByte(0x00); } } } //初始化LCD void InitLCD()