📄 lcd.c
字号:
#include <reg52.h>
#include <absacc.h>
#include <intrins.h>
#include <shiboliliang.h>
#define uint unsigned int
#define uchar unsigned char
#define lcmcw XBYTE [0x8001]
#define lcmdw XBYTE [0x8000]
#define RDKEY XBYTE [0x9000]
#define TDX_RDX XBYTE[0xc000]
#define kr XBYTE [0xB000]
#define TM_second XBYTE[0xa000] //秒
#define AM_second XBYTE[0xa001] //秒闹
#define TM_minute XBYTE[0xa002] //分
#define AM_minute XBYTE[0xa003] //分闹
#define TM_hour XBYTE[0xa004] //时
#define AM_hour XBYTE[0xa005] //时闹
#define TM_week XBYTE[0xa006] //周
#define TM_day XBYTE[0xa007] //日(2位数)
#define TM_month XBYTE[0xa008] //月(2位数)
#define TM_year XBYTE[0xa009] //年 (2位)
#define REG_a XBYTE[0xa00a] //寄存器A
#define REG_b XBYTE[0xa00b]
#define REG_c XBYTE[0xa00c]
#define REG_d XBYTE[0xa00d]
#define RAM_114 XBYTE[0xa00e]
//-----按键的相关定义--------------
#define quxiao 0x07
#define shang 0x0b
#define xia 0x0d
#define queren 0x0e
uchar jianzhi;
uchar caidan,caidan1=3;
sbit bkl = P1^3;
//--------------------------------------------------
//串口存储器相关定义及函数定义
//--------------------------------------------------
sbit SPI_CS = P1^7;
sbit SPI_SCK = P1^0;
sbit SPI_SO = P1^2;
sbit SPI_SI = P1^1;
uchar record_num;
//-----------------------------------
//主机读字节
uchar SPI_HostReadByte(void)
{
uchar i,rByte=0;
for(i=0;i<8;i++)
{
SPI_SCK=0;
SPI_SCK=1;
rByte<<=1;
rByte|=SPI_SO;
}
return rByte;
}
//-------------------------------------
//主机写字节
void SPI_HostWriteByte(uchar wByte)
{
uchar i;
for(i=0;i<8;i++)
{
if((wByte<<i)&0x80){SPI_SI=1;}
else{SPI_SI=0;}
SPI_SCK=0;
SPI_SCK=1;
}
}
//-------------------------------------------------
//读存储器状态寄存器
uchar AT45DB041B_StatusRegisterRead(void)
{
uchar i;
SPI_CS=0;
SPI_HostWriteByte(0xd7);
i=SPI_HostReadByte();
SPI_CS=1;
return i;
}
//存储器读数组
void Memroy_Array_Read(uint PA,uint BFA,uchar *pHeader,uint len)
{
uint i;
while(i++<255)
{
if(AT45DB041B_StatusRegisterRead()&0x80)
{break;}
}
SPI_CS=0; //选中本器件
SPI_HostWriteByte(0xe8); //Continuous Array Read
SPI_HostWriteByte((unsigned char)(PA>>7));
SPI_HostWriteByte((unsigned char)((PA<<1)|(BFA>>8)));
SPI_HostWriteByte((unsigned char)BFA);
for(i=0;i<4;i++)
{
SPI_HostWriteByte(0x00); //写入4个任意字节,然后读数据
}
for(i=0;i<len;i++)
{
pHeader[i]=SPI_HostReadByte(); //读出规定长度数据
}
SPI_CS=1; //失能本器件
}
/******************************************************************************/
/*描述: */
/* 将指定数据写入从某个地址(0~263)开始的BUFFER中。 */
/*参数: */
/* buffer - 选择BUFFER,01H选择BUFFER 1,02H选择BUFFER 2 */
/* 在该指令序列中,操作码84H选择BUFFER 1,87H选择BUFFER 2 */
/* BFA - BUFFER中的起始地址,0~263 */
/* pHeader - 待存数据的头指针 */
/* len - 待存数据的长度1~264 */
/******************************************************************************/
void AT45DB041B_BufferWrite(uchar buffer,uint BFA,uchar *pHeader,uchar len)
{
uint i;
while(i++<255)
{
if(AT45DB041B_StatusRegisterRead()&0x80) //判断存储器忙则等待,非忙退出
{break;}
}
SPI_CS=0; //选通本器件
switch(buffer) //选缓冲区
{
case 1:
SPI_HostWriteByte(0x84);
break;
case 2:
SPI_HostWriteByte(0x87);
break;
}
SPI_HostWriteByte(0x00); //"x"
SPI_HostWriteByte((unsigned char)(BFA>>8)); //BUFFER中的起始地址"xxxxxxxbfa8"
SPI_HostWriteByte((unsigned char)BFA); //强制转化为字节,"bfa7......bfa0"
for(i=0;i<len;i++)
{
SPI_HostWriteByte(pHeader[i]);
}
SPI_CS=1;
}
/****************************************************************************/
/* 将指定数据写入从某个地址(0~263)开始的页中:包含2个动作,首先将指定数据 */
/*描述: */
/* 写入到BUFFER 1或者BUFFER 2中,其中可以指定BUFFER中的起始写入地址,此写入 */
/* 动作不影响BUFFER中其它地址中的数据,然后再将BUFFER中的整个数据写入到某指 */
/* 定页中(带预擦除)。 */
/*参数: */
/* buffer - 选择BUFFER,01H选择BUFFER 1,02H选择BUFFER 2 */
/* PA - 页地址,0~2047 */
/* BFA - 指定BUFFER中的起始写入地址 */
/* pHeader - 指定数据的首地址 */
/* len - 指定数据的长度 4 */
/******************************************************************************/
void Memory_write_inErase(uchar buffer,uint PA,uint BFA,uchar *pHeader,uint len)
{
uint i;
AT45DB041B_BufferWrite(buffer,BFA,pHeader,len);
while(i++<1000) //等待存储器空闲
{
if(AT45DB041B_StatusRegisterRead()&0x80)
{break;}
}
SPI_CS=0;
switch(buffer)
{
case 1:SPI_HostWriteByte(0x83);break;
case 2:SPI_HostWriteByte(0x86);break;
}
SPI_HostWriteByte((unsigned char)(PA>>7)); //"rrrrpa10 pa9 pa8 pa7"
SPI_HostWriteByte((unsigned char)(PA<<1)); //"pa6......pa0 0"
SPI_HostWriteByte(0x00);
SPI_CS=1;
}
/******************************************************************************/
/*描述: 与上一个函数的唯一区别是不带预擦除。 */
/******************************************************************************/
void Memory_write_not_inErase(uchar buffer,uint PA,uint BFA,uchar *pHeader,uint len)
{
unsigned int i=0;
AT45DB041B_BufferWrite(buffer,BFA,pHeader,len);
while(i++<1000)
{
if(AT45DB041B_StatusRegisterRead()&0x80){break;}
}
SPI_CS=0;
SPI_HostWriteByte(0x88+buffer);
SPI_HostWriteByte((unsigned char)(PA>>7));
SPI_HostWriteByte((unsigned char)(PA<<1));
SPI_HostWriteByte(0x00);
for(i=0;i<len;i++)
{
SPI_HostWriteByte(pHeader[i]);
}
SPI_CS=1;
}
uchar idata time_buf[8];
uchar flag=0;
void settime() //设置系统时间
{
uchar xdata i;
i=REG_d;
REG_b=0xfe;
TM_second =time_buf[5];
TM_minute=time_buf[4];
TM_hour=time_buf[3];
TM_day=time_buf[2];
TM_month=time_buf[1];
TM_year=time_buf[0];
REG_b=0x7a;
i=REG_c;
}
void readtime() //读取系统时间
{
uchar idata a;
do{ a=REG_a;} while((a&0x80)==0x80);
time_buf[5]=TM_second;
time_buf[4]=TM_minute;
time_buf[3]=TM_hour;
time_buf[2]=TM_day;
time_buf[1]=TM_month;
time_buf[0]=TM_year;
}
void start12887(void) //启动时钟
{
REG_a=0x2f; //晶振启动,500ms中断周期
REG_b=0xfe; //芯片更新禁止,允许周期中断输出,允许闹钟中断输出,允许更新结束中断输出
//SQW输出设定频率的方波,数据为bcd码,24小时制,不允许夏时制.
AM_second=0; //每分钟发生闹钟中断
AM_minute=0xff; //
AM_hour=0xff; //
REG_b=0x7a; //芯片更新正常进行
}
void bintobcd(uchar shuju[])
{
uchar shi,ge,l;
for(l=0;l<6;l++)
{
shi=shuju[l]/10;
ge=shuju[l]%10;
shi<<=4;
shuju[l]=shi+ge;
if(l==1)
l++;
}
}
void bcdtobin(uchar shuju[])
{
uchar shi,ge,l;
for(l=0;l<6;l++)
{
shi=shuju[l]&0xf0;
shi>>=4;
shi=shi*10;
ge=shuju[l]&0x0f;
shuju[l]=shi+ge;
if(l==1)
l++;
}
}
uchar data cradd1,cradd2,dat2,dat0,com,ctrlcode;
uchar urow,ucol,h;
/*=======================================================*/
void short_delay(uint i)
{
uint j;
for(j=0;j<=i;j++);
}
void delayms(uchar tickms)
{
uchar count,i;
_nop_();
_nop_();
_nop_();
for(i=tickms;i>0;i--)
{
for(count=0;count<=58;count++) {;}
_nop_();
}
}
void wrdata(uchar dat0)/* 写显示数据子程序(左)*/
{
while((lcmcw&0x03)==0) ;
lcmdw=dat0;
}
void wrctrl0(uchar com)/* 写指令代码子程序(左)*/
{
while((lcmcw&0x03)==0);
lcmcw=com;
}
void wrctrl(dat1,dat2,ctrlcode)
{
wrdata(dat1);
_nop_();
_nop_();
_nop_();
wrdata(dat2);
_nop_();
_nop_();
_nop_();
wrctrl0(ctrlcode);
}
//--------------------------------------
//---------写满屏的f--------------------
void cls(uchar f)
{
uchar i,j;
wrctrl(0x00,0x08,0x24);
wrctrl0(0xb0);
for(i=0;i<128;i++)
{
for(j=0;j<30;j++)
{
wrdata(f);
}
}
}
//----------------------------------------
//----------- 设置当前地址-----------------
void fnSetPos(uchar urow, uchar ucol)
{
uint iPos;
iPos = urow * 30 + ucol;
wrctrl(iPos & 0xFF,iPos / 256+0x08,0x24);
}
//--------------------------------------------
//----------清图形内存------------------------
void clrg(urow,ucol)
{
uchar i,j;
fnSetPos(urow*16,ucol);
wrctrl0(0xb0);
for(i=urow*16;i<111;i++)
{
for(j=ucol;j<30;j++)
{
wrdata(0x00);
}
}
wrctrl0(0xb2);
}
//--------------------------------------------
//---------------写汉字子程序------------------
void wrhz(urow, ucol,uchar const shuju[],uchar l)
{
uint i,j;
uchar const *dpdat=shuju;
uchar k;
for(k=0;k<l;k++)
{
fnSetPos(urow*16, ucol);
for(i=0;i<16;i++)
{
wrctrl0(0xb0);
for(j=0;j<2;j++)
{
wrdata(*(dpdat++));
}
wrctrl0(0xb2);
fnSetPos(urow*16+(i+1), ucol);
}
ucol+=2;
}
}
//-------------------------------------
//-------------写字符------------------
void wrzf(urow,ucol,uchar c)
{
uchar i;
uint k;
k=c*16;
fnSetPos(urow*16, ucol);
for(i=0;i<16;i++)
{
wrctrl0(0xb0);
wrdata(ewzk[k]);
wrctrl0(0xb2);
k++;
fnSetPos(urow*16+(i+1), ucol);
}
}
//------------------------------------------------------------
//------------------------------------------------------------
uchar anjian(void)
{
jianzhi=RDKEY;
jianzhi=jianzhi&0x0f;
if(jianzhi!=0x0f)
{
short_delay(900);
jianzhi=RDKEY;
jianzhi=jianzhi&0x0f;
return 1;
}
else
return 0;
}
//--------------------------------------------------
//------------------显示时间-------------------------
void dptime(urow,ucol)
{
wrzf(urow,ucol+6,2); //year
wrzf(urow,ucol+7,0); //year
wrzf(urow,ucol+8,(time_buf[0]&0xf0)>>4); //year
wrzf(urow,ucol+9,time_buf[0]&0x0f); //year
wrzf(urow,ucol+10,22); //"-"
wrzf(urow,ucol+11,(time_buf[1]&0xf0)>>4); //mon
wrzf(urow,ucol+12,time_buf[1]&0x0f); //mon
wrzf(urow,ucol+13,22); //"-"
wrzf(urow,ucol+14,time_buf[2]/10); //day
wrzf(urow,ucol+15,time_buf[2]%10); //day
/* wrzf(urow,ucol+14,(time_buf[2]&0xf0)>>4); //day
wrzf(urow,ucol+15,time_buf[2]&0x0f);*/ //day
// wrzf(urow,ucol+14,22); //"-"
wrzf(urow,ucol+17,(time_buf[3]&0xf0)>>4); //hour
wrzf(urow,ucol+18,time_buf[3]&0x0f); //hour
wrzf(urow,ucol+19,19); //":"
wrzf(urow,ucol+20,(time_buf[4]&0xf0)>>4); //min
wrzf(urow,ucol+21,time_buf[4]&0x0f); //min
wrzf(urow,ucol+22,19); //":"
wrzf(urow,ucol+23,(time_buf[5]&0xf0)>>4); //sec
wrzf(urow,ucol+24,time_buf[5]&0x0f); //sec
}
//----------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------
//-------------------------------------------
//------------过压故障菜单--------------------
void lcd_guoya(void)
{
wrhz(0,0,guzhang,2);
wrzf(0,4,19);//wrzf(0,5,22); //"-"
wrhz(0,6,guoya,2);
wrhz(1,0,yuanyin,2); //"原因"
wrzf(1,4,19); //":"
wrzf(1,6,20);wrzf(1,7,1);wrzf(1,8,21);//(1)
wrhz(1,9,nibian,2); //"逆变"
wrhz(1,13,huo,1);wrhz(1,15,huanchong,2);wrhz(1,19,kailu,2);
dptime(7,0);
}
//----------------------------------------------------
//----------------缺相故障菜单-------------------------
void lcd_quexiang(void)
{
wrhz(0,0,guzhang,2);
wrzf(0,4,19);//wrzf(0,5,22); //"-"
wrhz(0,6,quexiang,2);
wrhz(1,0,yuanyin,2); //"原因"
wrzf(1,4,19); //":"
wrzf(1,6,20);wrzf(1,7,1);wrzf(1,8,21);//(1)
wrhz(1,9,gaoya,2); //"逆变"
wrhz(1,13,dianyuan,2);wrhz(1,17,guzhang,2);
wrzf(2,6,20);wrzf(2,7,2);wrzf(2,8,21);//(2)
wrhz(2,9,kuairong,2); //"逆变"
wrhz(2,13,sunhuai,2);
dptime(7,0);
}
//--------------------------------------------
//--------------逆变故障菜单-------------------
void lcd_nibian(void)
{
wrhz(0,0,guzhang,2);
wrzf(0,4,19);//wrzf(0,5,22); //"-"
wrhz(0,6,nibian,2);
wrhz(1,0,yuanyin,2); //"原因"
wrzf(1,4,19); //":"
wrzf(1,6,20);wrzf(1,7,1);wrzf(1,8,21);//(1)
wrhz(1,9,nibian,2); //"逆变"
wrhz(1,13,dianya,2);wrhz(1,17,yanzhong,2);wrhz(1,21,shiheng,2);
wrzf(2,6,20);wrzf(2,7,2);wrzf(2,8,21);//(2)
wrhz(2,9,nibian,2); //"逆变"
wrhz(2,13,chufa,2);wrhz(2,17,maichong,2);wrhz(2,21,no,1);wrhz(2,23,tongbu,2);
wrzf(3,6,20);wrzf(3,7,3);wrzf(3,8,21);//(2)
wrhz(3,9,nibian,2); //"逆变"
wrhz(3,13,jingzhaguan,3); //晶闸管
wrhz(3,19,sunhuai,2); //损坏
dptime(7,0);
}
//----------------------------------------------------
//------------失波故障菜单-----------------------------
void lcd_shibo(void)
{
wrhz(0,0,guzhang,2);
wrzf(0,4,19);//wrzf(0,5,22); //"-"
wrhz(0,6,shibo,2);
wrhz(1,0,yuanyin,2); //"原因"
wrzf(1,4,19); //":"
wrzf(1,6,20);wrzf(1,7,1);wrzf(1,8,21); //(1)
wrhz(1,9,zhanboqi,3); //"斩波器"
wrhz(1,15,jian,1);wrhz(1,17,sunhuai,2);
wrzf(2,6,20);wrzf(2,7,2);wrzf(2,8,21); //(2)
wrhz(2,9,waibu,2); //"外部"
wrhz(2,13,ganrao,2); //"干扰"
wrzf(3,6,20);wrzf(3,7,3);wrzf(3,8,21); //(3)
wrhz(3,9,guoya,1); //"过"
wrhz(3,11,fuhe,2); //负荷
wrzf(4,6,20);wrzf(4,7,4);wrzf(4,8,21); //(4)
wrhz(4,9,nibian,2); //"逆变"
wrhz(4,13,zhitong,2); //直通
dptime(7,0);
}
//-------------------------------------------
//-------------delay10ms---------------------
void delay10ms(unsigned int count1)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -