📄 hclcd.c.bak
字号:
j++;
Nowcol++;
k--;
}
}
}
//6*12点阵的ASC码显示程序
void ASC12disp(Uchar Nowrow,Uchar Nowcol,Uchar ASCplace)
{
Uchar i,tmp1,tmp2,k=6;
Uint j;
j = ASCplace*12;
if((Nowrow%2)==0) //
{
switch(Nowrow)
{
case 0: i=0;break;
case 2: i=3;break;
default: i=6;
}
while(k!=0)
{
if(Nowcol<0x40)
{CS1=0;CS2=1;}
else
{ if(Nowcol<0x80)
{CS1=1;CS2=0;}
else
{break;}
}
lcdwrite_cmd(i|0xb8);
lcdwrite_cmd(Nowcol|0x40);
lcdwrite_dat(ASC12[j]);
lcd_busy();
lcdwrite_cmd((i+1)|0xb8); //到下一页
lcdwrite_cmd(Nowcol|0x40);
tmp1 = lcdread_dat();
lcdwrite_cmd(Nowcol|0x40);
lcdwrite_dat((ASC12[j+6]&0x0f)|(tmp1&0xf0));
j++;
Nowcol++;
k--;
}
}
else
{
switch(Nowrow)
{
case 1: i=1;break;
default: i=4;
}
while(k!=0)
{
if(Nowcol<0x40)
{CS1=0;CS2=1;}
else
{
if(Nowcol<0x80)
{CS1=1;CS2=0;}
else
{break;}
}
lcdwrite_cmd(i|0xb8);
lcdwrite_cmd(Nowcol|0x40);
tmp1=lcdread_dat();
tmp1=tmp1&0x0f;
tmp1=(ASC12[j]<<4)|tmp1;
tmp2=(ASC12[j+6]<<4)|(ASC12[j]>>4);
lcdwrite_cmd(Nowcol|0x40);
lcdwrite_dat(tmp1);
lcd_busy();
lcdwrite_cmd((i+1)|0xb8);
lcdwrite_cmd(Nowcol|0x40);
lcdwrite_dat(tmp2);
j++;
Nowcol++;
k--;
}
}
}
//以动画的形式显示公司的标志,入口为在水平的第几个位置,现把它做,从32到1,由2张32X16的图组成
void flashlogo(Uchar Bmpcol)
{
Uchar i,j,p;
//把当前要用的区间清空
CS1=0,CS2=1;
lcdwrite_cmd(0xbe);
lcdwrite_cmd(0x40);
for(i=64;i>0;i--)
{
lcdwrite_dat(0x00);
lcd_busy();
}
lcdwrite_cmd(0xbf);
lcdwrite_cmd(0x40);
for(i=64;i>0;i--)
{
lcdwrite_dat(0x00);
lcd_busy();
}
//开始写要设定的数据(左半边)
lcdwrite_cmd(0xbe);
lcdwrite_cmd(0x40);
j=Bmpcol;
for(;j<=32;j++)
{
lcdwrite_dat(Bmp1zk[j-1]);
lcd_busy();
}
lcdwrite_cmd(0xbf);
lcdwrite_cmd(0x40);
j=Bmpcol;
for(;j<=32;j++)
{
lcdwrite_dat(Bmp1zk[j-1+32]);
lcd_busy();
}
//开始写要设定的数据(右半边)
j=Bmpcol;
lcdwrite_cmd(0xbe);
lcdwrite_cmd((32+j-1)|0x40);
p=0;
for(;j<=32;j++)
{
lcdwrite_dat(Bmp2zk[p++]);
lcd_busy();
}
j=Bmpcol;
lcdwrite_cmd(0xbf);
lcdwrite_cmd((32+j-1)|0x40);
p=0;
for(;j<=32;j++)
{
lcdwrite_dat(Bmp2zk[32+(p++)]);
lcd_busy();
}
}
//显示一幅128X64的图片,参数为图片在bmp12864放置的第几个图
void Disp128_64(Uchar BMPplace)
{
Uchar i,Nowcol,k;
Uint j;
j=(BMPplace-1)*1024; //计算出在图表格中的起始位置
lcdclrall();
for(i=0;i<8;i++)
{ Nowcol=0x00;
k=128;
while(k!=0)
{
if(Nowcol<0x40)
{CS1=0;CS2=1;}
else
{ if(Nowcol<0x80)
{CS1=1;CS2=0;}
else
{break;}
}
lcdwrite_cmd(i|0xb8);
lcdwrite_cmd(Nowcol|0x40);
lcdwrite_dat(bmp12864[j]);
lcd_busy();
Nowcol++;
j++;
k--;
}
}
}
void delay(void)
{
Uchar i,j,k;
for(i=0x02;i>0;i--)
{
for(j=0x96;j>0;j--)
{
for(k=0xfa;k>0;k--)
{
_nop_();
// _nop_();
}
}
}
}
/*----------------------I2C要用到的一些子程序---------------------------------*/
/***********************以下为一些用到的子程序*********************************/
/*延时子程序*/
void Delay_1ms(Uchar time)
{
Uchar j;
while(time--)
{
for(j=163;j!=0;j--)
{;}
}
}
/*I2C的起动程序*/
void I2CStart(void)
{
SDA = 1;
SomeNOP();
SCL = 1;
SomeNOP();
SDA = 0;
SomeNOP();
SCL = 0;
SomeNOP();
}
/*I2C的停止程序*/
void I2CStop(void)
{
SDA = 0;
SomeNOP();
SCL = 1;
SomeNOP();
SDA = 1;
SomeNOP();
}
void ACK(void) //Acknowledge信号
{
SDA = 0;
SomeNOP();
SCL = 1;
SomeNOP();
SCL = 0;
SomeNOP();
}
void NACK(void) //没有Acknowledge信号
{
SDA = 1;
SomeNOP();
SCL = 1;
SomeNOP();
SCL = 0;
SomeNOP();
}
void AutoACK(void) //在一定的时间内自动确定ACK的信号//
{
Uchar i = 0;
SCL = 1;
SomeNOP();
while((SDA == 1)&&(i<255))i++;
SCL = 0;
SomeNOP();
}
/*I2C写数据程序(向数据线上写一个BYTE)*/
void Writex(Uchar j)
{
Uchar i,temp;
temp = j;
for (i=0;i<8;i++) //串行移位,先送高位,再送低位//
{
temp =temp<<1;
SCL = 0;
SomeNOP();
SDA = CY;
SomeNOP();
SCL = 1;
SomeNOP();
}
SCL = 0;
SomeNOP();
SDA = 1;
SomeNOP();
}
/*I2C读数据程序(从数据线上读出一个BYTE)返回值为读出的数据(BYTE型)*/
Uchar Readx(void)
{
Uchar i,j,k=0;
SCL = 0;
SomeNOP();
SDA = 1;
for (i=0;i<8;i++) // 串行移位,先读出高位,后读出低位//
{
SomeNOP();
SCL = 1;
SomeNOP();
if(SDA ==1) j=1;
else j=0;
k =(k<<1)|j;
SCL = 0;
}
SomeNOP();
return(k); //返回读出的值//
}
//******************以下为对24CXX系列的读写程序******************************//
//*************24CXX的device address 为写0A0H,读为0A1H*********************//
/*某个地址写数据*/
void X24_Write(Uchar Addresshigh,Uchar Addresslow,Uchar Write_date)
{
I2CStart();
Writex(0xA0);
AutoACK();
Writex(Addresshigh);
AutoACK();
Writex(Addresslow);
AutoACK();
Writex(Write_date);
AutoACK();
I2CStop();
Delay_1ms(10);
}
/*对某个地址读操作,函数值为读出的数据*/
Uchar X24_Read(Uchar Addresshigh,Uchar Addresslow)
{
Uchar i;
I2CStart();
Writex(0xA0);
AutoACK();
Writex(Addresshigh);
AutoACK();
Writex(Addresslow);
AutoACK();
I2CStart();
Writex(0xA1);
AutoACK();
i =Readx();
//ACK(); //注意:这里不能有ACK应答信号//
I2CStop();
Delay_1ms(0);
return(i);
}
/*对内存中的数据块写入,入口为写EEPROM的地址,内存缓冲中的数据的起始地址(是IDATA的数据)*/
void X24_WritePage(Uchar Addresshigh,Uchar Addresslow,Uchar idata *Writeip)
{
Uchar i;
I2CStart();
Writex(0xA0);
AutoACK();
Writex(Addresshigh);
AutoACK();
Writex(Addresslow);
AutoACK();
for(i=0;i<64;i++)
{
Writex(*Writeip++);
AutoACK();
}
I2CStop();
}
/*把EEPROM中的数据读出来存放在内存缓冲中,起始地址为(是IDATA的数据)*/
void X24_ReadPage(Uchar Addresshigh,Uchar Addresslow,Uchar idata *Readip)
{
Uchar i;
I2CStart();
Writex(0xA0);
AutoACK();
Writex(Addresshigh);
AutoACK();
Writex(Addresslow);
AutoACK();
I2CStart();
Writex(0xA1);
AutoACK();
for(i=0;i<63;i++) //PAGE读的时候最后一个BYTE不要ACK信号//
{
*Readip = Readx();
Readip = Readip++;
ACK();
}
*Readip = Readx();
NACK();
I2CStop();
Delay_1ms(0);
}
//*******************以下为对PCF8383/PCF8563的读写子程序********************//
//**********时钟片device address的写地址为0A2H,读地址为0A3H******************//
/*对PCF8563的时钟读到内存中,以IDATA指针开始的连续7个BYTE*/
//****读出的内容依次为“秒,分钟,小时,日,星期,月/世纪,年********************//
//PCF8585依次为“秒,分钟,小时,日,星期月
void GetPCF8563(Uchar idata *Getip)
{
Uchar i;
I2CStart();
Writex(0xA2);
AutoACK();
Writex(0x02); //从秒地址开始读//
AutoACK();
I2CStart();
Writex(0xA3);
AutoACK();
for(i=0;i<6;i++)
{
*Getip = Readx();
Getip = Getip++;
ACK();
}
*Getip = Readx();
NACK();
I2CStop();
Delay_1ms(0);
}
/*设定8563/8583的时间内容依次为“秒,分钟,小时,日,星期,月/世纪,年*/
//PCF8585依次为“秒,分钟,小时,日,星期月
void SetPCF8563(Uchar idata *Setip)
{
Uchar i;
I2CStart();
Writex(0xA2);
AutoACK();
Writex(0x02);
AutoACK();
for(i=0;i<7;i++)
{
Writex(*Setip++);
AutoACK();
}
I2CStop();
}
Uchar ReadPCF8563(Uchar AddrePCF)
{
Uchar i;
I2CStart();
Writex(0xA2);
AutoACK();
Writex(AddrePCF);
AutoACK();
I2CStart();
Writex(0xA3);
AutoACK();
i =Readx();
//ACK(); //注意:这里不能有ACK应答信号//
I2CStop();
Delay_1ms(0);
return(i);
}
void WritePCF8563(Uchar AddrePCF,Uchar PCFdata)
{
I2CStart();
Writex(0xA2);
AutoACK();
Writex(AddrePCF);
AutoACK();
Writex(PCFdata);
AutoACK();
I2CStop();
Delay_1ms(10);
}
void SetWaring (Uchar Wyear,Uchar Wmonth,Uchar Wday)
{
X24_Write(0x07,0xf0,Wyear);
X24_Write(0x07,0xf1,Wmonth);
X24_Write(0x07,0xf2,Wday);
}
/*返回值为1和0,1为已溢出,0为没有溢出*/
bit CheckTime(void)
{
Uchar j,k;
j = X24_Read(0x07,0xcb);
k = ReadPCF8563(0x08 ); /*读年的时间*/
if(k<j)
{
return(0);
}
else
{
if(k>j)
{
return(1);
}
else
{
j = X24_Read(0x07,0xcc);
k = ReadPCF8563(0x07)&0x1f; /*读月的时间*/
if (k<j)
{
return(0);
}
else
{
if(k>j)
{
return(1);
}
else
{
j = X24_Read(0x07,0xcd);
k = ReadPCF8563(0x05)&0x3f; /*读日的时间*/
if (k>j)return(1);
else return(0);
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -