***********************************************************************/
void Write_Char(uchar x,uchar y,uchar ch)
{
uchar i, dat;
uint StartAddr,StartAddr1;
StartAddr=x*240+y;
StartAddr1=x*240+y+1;
for(i=0;i<8;i++)
{
dat="ASCII"_DOT_LIB[ch];
LCD_WriteTCommand3(LCD_ADR_POS,StartAddr,StartAddr>>8);
LCD_WriteTCommand2(LCD_NOC_WR,dat);
StartAddr="StartAddr"+30;
}
for(i=0;i<8;i++)
{
dat="ASCII"_DOT_LIB[ch][i+8];
LCD_WriteTCommand3(LCD_ADR_POS,StartAddr1,StartAddr1>>8);
LCD_WriteTCommand2(LCD_NOC_WR,dat);
StartAddr1=StartAddr1+30;
}
}
/********************************************************************************************************/
void ReverseShowChar(uchar x,uchar y,uchar ch)//CGTAB
{
uchar i, dat;
uint StartAddr,StartAddr1;
StartAddr=x*240+y;
StartAddr1=x*240+y+1;
for(i=0;i<8;i++)
{
LCD_WriteTCommand3(LCD_ADR_POS,StartAddr,StartAddr>>8);
dat="ASCII"_DOT_LIB[ch];
dat=(0xff-dat); //取反
LCD_WriteTCommand2(LCD_NOC_WR,dat);
StartAddr="StartAddr"+30;
}
for(i=0;i<8;i++)
{
LCD_WriteTCommand3(LCD_ADR_POS,StartAddr1,StartAddr1>>8);
dat=ASCII_DOT_LIB[ch][i+8];
dat=(0xff-dat); //取反
LCD_WriteTCommand2(LCD_NOC_WR,dat);
StartAddr1=StartAddr1+30;
}
}
/********************************************************************************************************/
/**********************************
//= 函数原型: Pixel(unsigned char PointX,unsigned char PointY, bit Mode)
//= 功 能: 在指定坐标位置显示一个点
//= 参 数: 坐标,显示点或清除点
//= 返 回 值:
//= 函数性质:私有函数
//= 如果显示屏超过了256*256,请修改这个函数 PointX,PointY的类型
//= Mode 1:显示 0:清除该点
**********************************/
void Pixel(unsigned char PointX,unsigned char PointY, bit Mode)
{
unsigned int StartAddr;
uchar StartAddrL,StartAddrH;
unsigned char dat;
StartAddr=(uint)((uint)PointX*30 + PointY/8 );//grhome
StartAddrL=StartAddr&0xFF;
StartAddrH=StartAddr>>8;
dat="LCD"_BIT_OP+7-PointY%8; //生产位操作命令画点的数据
if(Mode) dat="dat|0x08";
LCD_WriteTCommand3(LCD_ADR_POS,StartAddrL,StartAddrH);//设置该点所在单元地址
LCD_WriteTCommand1(dat); // 利用位操作命令画点
}
/**********************************
//= 函数原型: void line( unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, bit Mode)
//= 功 能: 划线函数
//= 参 数: 坐标1,坐标2,显示点或清除点
//= 返 回 值:
//= 函数性质:私有函数
//= 其它:显示点阵不超过255*255
/**********************************/
void line( unsigned char y1,unsigned char x1, unsigned char y2,unsigned char x2, bit Mode)
{
unsigned char x,y;
float k,b;
if( abs(y1-y2) <= abs(x1-x2) ) // |k|<=1
{
k=((float)y2-y1) / ((float)x2-x1) ;
b="y1-k"*x1;
if( x1 <= x2 )
{
for(x=x1;x<=x2;x++)
{
y=(uchar)(k*x+b);
Pixel(x, y, Mode);
}
}
else
{
for(x=x2;x<=x1;x++)
{
y=(uchar)(k*x+b);
Pixel(x, y, Mode);
}
}
}
else // abs(y1-y2) > abs(x1-x2) |K|>1
{
k=((float)x2-x1) / ((float)y2-y1) ;
b="x1-k"*y1;
if( y1 <= y2 )
{
for(y=y1;y<=y2;y++)
{
x=(uchar)(k*y+b);
Pixel( x , y,Mode );
}
}
else
{
for(y=y2;y<=y1;y++)
{
x=(uchar)(k*y+b);
Pixel( x , y,Mode );
}
}
}
}
/***********************************************************************
* 名称:clr()
* 功能:清除某个特定行的数据
* 入口参数:row 要清除数据的行
* 出口参数:无
***********************************************************************/
void clr(uchar row) //清除指定行
{
uchar i;
for(i=0;i<16;i++)
{
Write_Char(i,row,75);
}
}
/********************************************************************************************************/
/***********************************************************************
* 名称:search()
* 功能:寻找该数据在ASCII数组的哪个位置
* 入口参数:adata 要寻找的数据
* 出口参数:返回该数据的位置
//ASCII数组数的位置与 ASCII_DOT_LIB数组位置一一对应
***********************************************************************/
uchar search(uchar adata) //返回查找ASCII数组数的位置
{
uchar rdata;
uchar i;
for(i=0;i<80;i++)
{
if(adata==ASCII){rdata=i;return (rdata);}
}
}
/***********************************************************************
* 名称:dis_rec(uchar d,uchar l)
* 功能:对寻找到的数据进行显示
* 入口参数:h:数据的长度
l:列
* 出口参数:
***********************************************************************/
void dis_rec(uchar size,uchar row,uchar buf[],bit mode)
{
uchar rdata_i;
uchar dsize;
uchar i;
uchar x,y,x1,y1;//x,y:起点,x1,y1终点
mode=1;
dsize=(14-((14-size)/2));
//显示字的边框
x=(row*8-1);
y=((dsize-size+1)*8-1);
x1=(x+17);
y1=(y+size*8+1);
line(x,y,x,y1,mode); //size=4;
line(x,y,x1,y,mode);
line(x1,y,x1,y1,mode);
line(x1,y1,x,y1,mode);
//显示字
for(i=0;i{
rdata_i=search(buf);
Write_Char(dsize-i,row,rdata_i);
}
/********************************************************************************************************/
void keypress(void)
{ if(keycount<5)
{ keyword="hc165"();
key="keyword";
if(keyword!=0x00)
{
fasterkey++;
if(fasterkey>3){fasterkey=5;key1st=15;}else key1st=75;
switch (keyword)
{
case 0x01: key8=1;key7=0;key6=0;key5=0;key4=0;key3=0;key1=0;key2=0;break;
case 0x02: key7=1;key6=0;key5=0;key4=0;key3=0;key1=0;key2=0;break;
case 0x04: key6=1;key5=0;key4=0;key3=0;key1=0;key2=0;break;
case 0x08: key5=1;key4=0;key3=0;key1=0;key2=0;break;
case 0x10: key4=1;key3=0;key2=0;key1=0;break;
case 0x20: key3=1;key2=0;key1=0;break;
case 0x40: key2=1;key1=0;key3=0;break;
case 0x80: key1=1;key2=0;key3=0;break;
default: break;
}
}
else {fasterkey=0;key1st=75;}
keycount="key1st";
}
}
/********************************************************************************************************/
void keyoption(void)
{
keypress();
///////////////////////////////////////
if((key)==0x80)//key1
{
rshow(4,2,recbuf1);
}
if(((key&0xff)==0x00)&&(key1==1))
{ clr(1);clr(2);clr(3);dis_rec(4,2,recbuf1,1);
key1=0;
}
//////////////////////////////////////
if((key)==0x40) //key2
{
rshow(4,7,recbuf2);
}
if(((key&0xff)==0x00)&&(key2==1))
{clr(6);clr(7);clr(8); dis_rec(4,7,recbuf2,1);
key2=0;
}
////////////////////////////////////////////
if((key)==0x20) //key3
{
rshow(4,12,recbuf3);
}
if(((key&0xff)==0x00)&&(key3==1))
{clr(11);clr(12);clr(13); dis_rec(4,12,recbuf3,1);
key3=0;
}
////////////////////////////////////////////
if((key)==0x10) //key4
{
rshow(4,17,recbuf4);
}
if(((key&0xff)==0x00)&&(key4==1))
{clr(16);clr(17);clr(18); dis_rec(4,17,recbuf4,1);//size_dis(4,7,0,1);
key4=0;
}
////////////////////////////////////////////
if((key)==0x08) //key5
{
rshow(4,22,recbuf5);
}
if(((key&0xff)==0x00)&&(key5==1))
{clr(21);clr(22);clr(23); dis_rec(4,22,recbuf5,1);//size_dis(4,7,0,1);
key5=0;
}
////////////////////////////////////////////
if((key)==0x04) //key4
{
rshow(4,27,recbuf6);
}
if(((key&0xff)==0x00)&&(key6==1))
{clr(26);clr(27);clr(28); dis_rec(4,27,recbuf6,1);//size_dis(4,7,0,1);
key6=0;
}
}
void main(void)
{
init();
light=0;
Check_Default_Setting();
W5100_Init();
LCD_Initialize();
LCD_FillAll(0x00);
lcddis_init();
while(1)
{
keyoption();
/////////////////////////////
}
}
用户377235 2014-4-22 20:50
用户163187 2008-10-15 16:08