📄 driver.c.bak
字号:
else if(c2>0x7f)c2--;
if(c2>=0xA1)
return (ulong)((c1-0xA1)*94+(c2-0xA1))*32+0xA7700;
else
return (ulong)((c1-0xA8)*96+(c2-0x40))*32+0xAE0C0;
}
else if(c1 >= 0xA1 && c3 == 0 && c4 == 0)//字符1区 A1A1 --- A9FE 0xA7700
{
return (ulong)((c1-0xA1)*94+(c2-0xA1))*32+0xA7700;
}
else if(c1 >= 0x81 && c3 == 0 && c4 == 0)//汉字3区 8140 --- A0FE 0xE46C0
{
if(c2>0x7f)c2--;
return (ulong)((c1-0x81)*190+(c2-0x40))*32+0xE46C0;
}
else if(c2>=0x30)//汉字4区
{
// four bytes HZ
h=(((ulong)(c1-0x81)*10+(c2-0x30))*126+(ulong)(c3-0x81))*10+(c4-0x30);
h-=12439;
if(h<0 || h>=6530) return(0);
h += 22046;
return h*32+0xA7700;
}
}
//功能:在LCD指定位置显示一行汉字或字符(16*16或8*16)
//参数说明:
//x 显示起行(0~63只能是8的倍数) y显示起始列(0~191)
//str需要显示的字符指针
//mode低4位=0:只显示不清除其它内容;
//mode低4位=1:清除本行原有内容并显示;
//mode低4位=2:清除整屏内容并显示;
//mode低4位=10D只显示不清除其它内容并在字符最上面补画一横线,用于画表用
//mode低4位=11D只显示不清除其它内容并在字符最下面补画一横线,用于画表用
//mode低4位=12D只显示不清除其它内容并在字符最上面和下面补画一横线,用于画表用
//mode高4位!=0:反白显示,
//mode高4位==0:正常显示。
//NotLen需要取反显示的字符长度
void LcdDisplay(uchar x,uchar y,uchar *str,uchar mode)
{
uchar Buff[2][192]; //显示缓冲区 上半行和下半行
uint i,j,poz,DisStart, DisEnd;
uchar len,val,k,bm1,bm2,bm3,bm4,hzi;
ulong addr;
uchar SendPos;
if(str[0]==0 || str[0]=='\0')return;
len = strlen(str); //字符长度
x/=8;
poz = y;
memset(Buff,0,sizeof(Buff)); //清显示缓冲区
for(i=0;i<len;i++) //读出点阵数据放入缓显示冲区
{
if(str[i]>0x80)
{
k=16;
hzi = i;
bm1=str[hzi++];
bm2=str[hzi++];
bm3=str[hzi++];
bm4=str[hzi];
if(bm1 >= 0x82 && bm2 > 0x35)
{
bm3 = bm4 = 0;
i += 1;
}
else i += 3;
addr = CountZkAdr(bm1,bm2,bm3,bm4);
}
else
{
k=8;
addr = 0x18A010+(str[i]-0x20)*16;
}
SerialFlashRead(Flashziku,addr,k,Buff[0]+poz);
SerialFlashRead(Flashziku,addr+k,k,Buff[1]+poz);
poz+=k;
if(poz>192)
{
poz=192;
break;
}
}
if(mode & 0xf0) //高4位为1反白显示,为0正常显示
{
for(j=y;j<poz;j++)
{
Buff[0][j] = ~Buff[0][j];
Buff[1][j] = ~Buff[1][j];
}
}
j=0;
switch(mode & 0x0f)
{
case 2: j=184; //清除其余三行(不包括滚动条)并显示
case 3: if(j==0)j=192;
for(i=0;i<8;i++) //清除其余三行(包括滚动条)并显示
{//清屏后显示输入内容
// if(i!=x || i!=x+1)
LcdClearLine(i,j);
}
case 0: DisStart = y; //只显示不清除其它内容
DisEnd = poz;
break;
case 1: DisStart = 0;
DisEnd = 184;
break; //清除本行原有内容并显示,保留滚动条
case 4: DisStart = 0; //清除本行原有内容并显示
DisEnd = 192; //不保留滚动条
break;
// case 5:
case 0x0A:
DisStart = y; //只显示不清除其它内容并在字符上面补画一横线,用于画表用
DisEnd = poz;
for(i=DisStart;i<DisEnd;i++)
{
Buff[0][i] |= 0x01;
}
break;
case 0x0B:
DisStart = y; //只显示不清除其它内容并在字符下面补画一横线,用于画表用
DisEnd = poz;
for(i=DisStart;i<DisEnd;i++)
{
Buff[1][i] |= 0x80;
}
break;
case 0x0C:
DisStart = y; //只显示不清除其它内容并在字符上下面都补画一横线,用于画表用
DisEnd = poz;
for(i=DisStart;i<DisEnd;i++)
{
Buff[0][i] |= 0x01;
Buff[1][i] |= 0x80;
}
break;
default:DisStart = 0;DisEnd = 184; break;//=case 1
}
for(j=0;j<2;j++)
{
val = x & 0x07 | 0xB8;
SendPos = DisStart;
if(SendPos<64)
{
LcdWriteCommand(val,LcdChip1); //设置行起始位置 页地址
LcdWriteCommand(0x40|SendPos,LcdChip1); //列地址设置指令
if(DisEnd<64)
{
for(i=SendPos;i<DisEnd;i++)
LcdWriteData(Buff[j][SendPos++],LcdChip1);
x++;
continue;
}
else
{
for(i=SendPos;i<64;i++)
LcdWriteData(Buff[j][SendPos++],LcdChip1);
}
}
if(SendPos<128)
{
LcdWriteCommand(val,LcdChip2); //设置行起始位置 页地址
LcdWriteCommand(0x40|(SendPos-64),LcdChip2); //列地址设置指令
{
if(DisEnd<128)
{//第三屏没有数据
for(i=SendPos;i<DisEnd;i++)
LcdWriteData(Buff[j][SendPos++],LcdChip2);
x++;
continue;
}
else
{//第三屏有数据
for(i=SendPos;i<128;i++)
LcdWriteData(Buff[j][SendPos++],LcdChip2);
}
}
}
if(SendPos>127)
{
LcdWriteCommand(val,LcdChip3); //设置行起始位置 页地址
LcdWriteCommand(0x40|(SendPos-128),LcdChip3); //列地址设置指令
for(i=SendPos;i<DisEnd;i++) //送第三屏数据
LcdWriteData(Buff[j][SendPos++],LcdChip3);
x++;
}
}
}
void ShowPicture(uchar startrow,uchar startcol,uchar endrow,uchar endcol,uchar *dat)
{//startrow,endrow(行/页地址)必须是8的倍数,*dat是点阵数据,必须是纵向取模,字节倒序
uchar i,j,column,row,val;//row:行;column:列
uint m;
m=0;
row=(endrow-startrow)/8;
// PCO &= 0x7f;
for(j=0;j<row;j++)
{
val = (startrow/8+j)|0xB8;
column = startcol;
if(column<64)
{
LcdWriteCommand(val,LcdChip1); //设置起始行/页地址
LcdWriteCommand(0x40|column,LcdChip1); //列地址设置指令
if(endcol<64)
{
for(i=column;i<endcol;i++)
{
LcdWriteData(dat[m++],LcdChip1);
}
continue;
}
else
{
for(i=column;i<64;i++)
{
LcdWriteData(dat[m++],LcdChip1);
column++;
}
}
}
if(column<128)
{
LcdWriteCommand(val,LcdChip2); //设置行起始位置 页地址
LcdWriteCommand(0x40|(column-64),LcdChip2); //列地址设置指令
{
if(endcol<128)
{//第三屏没有数据
for(i=column;i<endcol;i++)
LcdWriteData(dat[m++],LcdChip2);
continue;
}
else
{//第三屏有数据
for(i=column;i<128;i++)
{
LcdWriteData(dat[m++],LcdChip2);
column++;
}
}
}
}
if(column>127)
{
LcdWriteCommand(val,LcdChip3); //设置行起始位置 页地址
LcdWriteCommand(0x40|(column-128),LcdChip3); //列地址设置指令
for(i=column;i<endcol;i++) //送第三屏数据
LcdWriteData(dat[m++],LcdChip3);
}
}
// PCO |= 0x80;
}
//画矩形
void DisplayRectangle(uchar Dot_y1,uchar Dot_x1,uchar Dot_y2,uchar Dot_x2,uchar DisON)
{
unsigned char i,j;
for(i=Dot_y1;i<=Dot_y2;i++)
{
for(j=Dot_x1;j<=Dot_x2;j++)
LcdDisplayDot(j,i,DisON);
// LcdDisplayDot(Dot_x2,i);
}
}
//画空芯矩形
void DisplayFullRec(uchar Dot_y1,uchar Dot_x1,uchar Dot_y2,uchar Dot_x2,uchar DisON)
{ unsigned char i;
for(i=Dot_x1;i<=Dot_x2;i++)
{
LcdDisplayDot(i,Dot_y1,DisON);
LcdDisplayDot(i,Dot_y2,DisON);
}
for(i=Dot_y1;i<=Dot_y2;i++)
{
LcdDisplayDot(Dot_x1,i,DisON);
LcdDisplayDot(Dot_x2,i,DisON);
}
}
void Hint(uchar x,uchar y,uchar *str,uchar mode)
{
ulong t=0;
uchar k=0xFF;
LcdDisplay(x,y,str,mode);
while(k==0xFF)
{
k=GetKey();
t++;
if(t>10000)break;
BeepOn;
}
BeepOff;
}
void PowerOffHint(uchar *str,uchar *dat,uchar flg)
{
I2cWrite(PwrFlgAdr,1,&flg);
LcdDisplay(0,0,"操作过程中断电:",3);
LcdDisplay(16,0,str,0);
LcdDisplay(32,0,dat,0);
while(1);
}
void ErrorHint(uchar *str,uint num)
{
uchar dat[25];
TR1=0;TR0=0;
DisableCom;
DisableCs;
LcdDisplay(16,0,str,3);
strcpy(dat,"故障代码:");
// NumToStr(num,&dat[9],SwitchInt);
BcdToStr(2,&num,&dat[9],0);
LcdDisplay(32,0,dat,0);
LcdDisplay(48,0,"按<合计>键程序复位!",0);
while(KeyScan()!=K_HJ);
WDRST=0x70;
WDKEY=0;
while(1);
}
//---------------------------Lcd End----------------------------------------------------
//---------------------------Flash Begin--------------------------------------------------
///////////////////////////////////////////////////////////////////////////////
// Serial Flash Description
// chip D7 D6 D5 D4 D3 D2 D1 D0
// 0 0 0 0 X X X X ----->>M45PE80== 0x 0xAA
// 0 0 0 1 X X X X ----->>M25P80 == 1x 0x55
// 0 0 1 0 X X X X ----->>M25P16 == 2x
// 0 0 1 1 X X X X ----->> 3x Hold
// chip Hihg 4 bit = M25P80 or M45PE80 or M25P16
///////////////////////////////////////////////////////////////////////////////
//Function: Select chip AND port Low
//Control = 1 Port Low Control =0 Port High
//Compile: yongjibing
//Time: 2004-11-11 19:48
/////////////////////////////////////////////////////////////////////////////////
void Selectchip(uchar chip,uchar Control)
{
GS yB;
yB.bt=chip;
FlashEnable;
if(Control)
{
switch(yB.swap.bytHigh)
{
case 0: //Select M45PE80
SerialFlash[0]=0xAA;
break;
case 1: //Select M25P80
SerialFlash[0]=0x55;
break;
case 2: //Select M25P16
break;
default :return; // Input Unllity
}
switch(yB.swap.bytlow)
{
case 1:
Mcs1_Enable;
return; //Select chip = 1
case 2:
Mcs2_Enable;
return; //Select chip = 2
case 3:
Mcs3_Enable;
return; //Select chip = 3
case 4:
Mcs4_Enable;
return; //Select chip = 4
default:return; //Input Unllity
}
}
else FlashDisable;
}
uchar ReadFlashStatus(uchar chip,uchar type)
{
uchar value=0xf;
ulong Overtime;
if(type == FlashBE || type == FlashSE || type == FlashPE)//块擦除,扇区擦除,页擦除
Overtime = 352000; //22s
if(type == FlashPP || type == FlashPW) //页写与页编程
Overtime = 32000; //20ms
Selectchip(chip,1);
SpiSendChar(FlashRSR);//05
while(--Overtime)
{
if(value&0x01)
value=SpiReceiveChar();
else break;
}
Selectchip(chip,0);
if(Overtime != 0)
return 1;
else
return 0; //超时
}
//write status Regrister only M25P80 use
//void WriteFlashStatus(uchar chip)
//{
// Selectchip(chip,1);
// SpiSendChar(FlashRSR);
// SpiSendChar(0);
// Selectchip(chip,0);
//}
/*----------------------------------------------------------------------
write enable insturction
----------------------------------------------------------------------*/
void FlashWriteEnable(uchar chip)
{
Selectchip(chip,1);
SpiSendChar(FlashWE);
Selectchip(chip,0);
}
/*-----------------------------------------------------------------------
write num data to Flash
-------------------------------------------------------------------------*/
uchar FlashWriteData( uchar chip, ulong address, uint Len, uchar *Dat)//向某个25p80写num个数据
{
uint i;
gyt4 mydat1;
gyt2 mydat2;
mydat1.dat=address;
mydat2.dat=Len;
FlashWriteEnable(chip);//wriet enable insturction
Selectchip(chip,1);
for(i=0;i<Len;i++)
TxdBuf[i]=Dat[i];
SerialFlash[1]=mydat2.str[1];//写数据长度高位1字节
SerialFlash[2]=mydat1.str[1];//地址3字节
SerialFlash[3]=mydat1.str[2];
SerialFlash[4]=mydat1.str[3];
SpiSendData();
Selectchip(chip,0);
if(ReadFlashStatus(chip,FlashPP))
return SpiOK;
else
{
ErrorHint("写Flash出错!",0x8100|chip);
return SpiErr;
}
}
/*---------------------------------------------------------------------------------
调用方法: uchar SerialFlashWrite(uchar chip,ulong address,uint Len,uchar *Dat);
ch: 选择操作芯片 address: 写入地址 Len: 写入长度 Dat[]: 写入数组
返回 1 操作成功 返回 0 操作失败
----------------------------------------------------------------------------------*/
uchar SerialFlashWrite(uchar chip,ulong address,uint Len,uchar *Dat)
{
uint n,k;
// if(Len>256) return SpiWriteLenErr;
if(Len>256)Len=256;
n=256-(address%256);//一个扇区剩下多少字节
if(n>=Len)//本扇区所剩空间可以全写入本数组的内容
{
return FlashWriteData(chip,address,Len,Dat);
}
if(n<Len)//本扇区所剩空间不可以全写入本数组的内容
{
if(FlashWriteData(chip,address,n,Dat)!=SpiOK)
return SpiErr;
k=Len-n;
return FlashWriteData(chip,address+n,k,&Dat[n]);
}
}
/*------------------------------------------------------------------------------------
form Flash FlashRD num data to *Dat
调用方法: read_data(uchar chip,ulong add,uint Len,uchar *Dat);
说明: chip: 选择芯片 address: 读起始地址 Len: 读取长度 Dat[]: 读取存放数据
--------------------------------------------------------------------------------------*/
void SerialFlashRead(uchar chip,ulong address,uint Len,uchar *Dat)//读某个25P80的num个字节数据
{
uint i;
uchar flag=0;
gyt4 mydat1;
gyt2 mydat2;
if(Len>256)Len=256;
mydat1.dat=address;
mydat2.dat=Len;
Selectchip(chip,1);
SerialFlash[1]=mydat2.str[1];//读数据长度高位1字节
SerialFlash[2]=mydat1.str[1];//地址3字节
SerialFlash[3]=mydat1.str[2];
SerialFlash[4]=mydat1.str[3];
SpiReceiveData();
for(i=0;i<Len;i++)
Dat[i]=RxdBuf[i];
Selectchip(chip,0);
}
/*----------------------------------------------------------------------------
调用方式: sector_erase(uchar chip,ulong FlashSE);
说 明: chip: 选择芯片 Sector: 扇区(0--15)
//sector erase function
// M45Pe80 and M25P80
-----------------------------------------------------------------------------*/
uchar SerialFlashSectorErase(uchar chip,uchar Sector)//sector value form 0 to 15
{
ulong address;
gyt4 addr;
address=Sector*0x10000;
addr.dat = address;
FlashWriteEnable(chip);//wriet enable insturction
Selectchip(chip,1);
SpiSendChar(FlashSE);//FlashSE
SpiSendChar(addr.str[1]);
SpiSendChar(addr.str[2]);
SpiSendChar(addr.str[3]);
Selectchip(chip,0);
if(ReadFlashStatus(chip,FlashSE)) return SpiOK;
else
{
ErrorHint("Flash扇区擦除出错!",0x8200|chip);
return SpiErr;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -