📄 lcm.c
字号:
uint8 Data_from_Lcd;
volatile uint32 *ip;
ip = ( uint32 *)Right_Read_Com_ADDR; //设置读状态字的指针值(右边)
while(((*ip)&0x80)==0x80); //当"忙"标志位为1时继续读端口的数据。(右边)
ip = ( uint32 *)Right_Read_Data_ADDR;
Data_from_Lcd=*ip; //从lcd读数据到变量.Data_from_Lcd(右边)
return(Data_from_Lcd);
}
/**********************************************************************************************************
*函数名: LCD_Delay_1ms_unit()
*功能描述:用于lcd中需要延时的时候用
*调用函数:无
*全局变量:无
*输入:无
*返回:无
*设计者:潘江长 日期:2006.1.11
*修改者: 日期:
*版本:
***********************************************************************************************************/
void LCD_Delay_1ms_unit(uint8 n)
{
uint8 j;
while(n--)
{
j=73;
while(j--);
}
}
/**********************************************************************************************************
*函数名:lcdinit
*功能描述:对液晶初始化
*调用函数:无
*全局变量:无
*输入:无
*返回:无
*设计者:潘江长 日期:2006.1.11
*修改者: 日期:
*版本:
***********************************************************************************************************/
void Lcdinit(void)
{
uint8 i;
i=0xC0; //设置第一行为起始行
Wr_Com_LCD_Left(i);
Wr_Com_LCD_Middle(i);
Wr_Com_LCD_Right(i);
i=0xB8;
Wr_Com_LCD_Left(i); //设置页面地址为第一页
Wr_Com_LCD_Middle(i);
Wr_Com_LCD_Right(i);
i=0x40;
Wr_Com_LCD_Left(i); //设置列地址为第一列
Wr_Com_LCD_Middle(i);
Wr_Com_LCD_Right(i);
i=0x3F; //开显示开关
Wr_Com_LCD_Left(i);
Wr_Com_LCD_Middle(i);
Wr_Com_LCD_Right(i);
}
/**********************************************************************************************************
*函数名:lcdclear
*功能描述:对液晶清屏
*调用函数:无
*全局变量:无
*输入:无
*返回:无
*设计者:潘江长 日期:2006.1.11
*修改者:潘妙青 日期:2008.2.23
*版本:
***********************************************************************************************************/
void Lcdclear(void)
{
uint8 i,j;
uint8 c; //局部变量c用于存放命令字
c=0;
for(i=0;i<=7;i++)
{
c=i|0xb8; //得到对应的页面地址
Wr_Com_LCD_Left(c); //设置对应的页面地址(左)
Wr_Com_LCD_Middle(c); //设置对应的页面地址(中)
Wr_Com_LCD_Right(c); //设置对应的页面地址(右)
Wr_Com_LCD_Left(0x40); //设置对应的列地址(左)
Wr_Com_LCD_Middle(0x40); //设置对应的列地址(中)
Wr_Com_LCD_Right(0x40); //设置对应的列地址(右)
for(j=0;j<=63;j++) //写入数据0
{
Wr_Data_LCD_Left(0x00);
Wr_Data_LCD_Middle(0x00);
Wr_Data_LCD_Right(0x00);
}
}
}
void Lcdset(void)
{
uint8 i,j;
uint8 c; //局部变量c用于存放命令字
c=0;
for(i=0;i<=7;i++)
{
c=i|0xb8; //得到对应的页面地址
Wr_Com_LCD_Left(c); //设置对应的页面地址(左)
Wr_Com_LCD_Middle(c); //设置对应的页面地址(中)
Wr_Com_LCD_Right(c); //设置对应的页面地址(右)
Wr_Com_LCD_Left(0x40); //设置对应的列地址(左)
Wr_Com_LCD_Middle(0x40); //设置对应的列地址(中)
Wr_Com_LCD_Right(0x40); //设置对应的列地址(右)
for(j=0;j<=63;j++) //写入数据0
{
Wr_Data_LCD_Left(0xFF);
Wr_Data_LCD_Middle(0xFF);
Wr_Data_LCD_Right(0xFF);
}
}
}
/**********************************************************************************************************
*函数名:wrzw16x16
*功能描述:写16x16中文字
*调用函数:无
*全局变量:无
*输入:无
*返回:无
*设计者:潘江长 日期:2006.1.11
*修改者:潘妙青 日期:2008.2.23
*版本:
***********************************************************************************************************/
void Wrzw16x16(uint8 x,uint8 y,char *z) //x为列地址范围为0~11。y为行地址范围为0~3.
{
uint8 i,j,k;
uint8 x2,x3,y2;
uint8 d;
uint8 findflag; //此位为在字库的搜索结果标志位,0为没有找到,1为找到
findflag=0;
x2=0;
y2=0;
d=0;
x=x*16;
y=y*2;
x3=x; //下面的循环体实现在字库中搜索对应的点阵
k=0;
while(k<ZWZKZS16X16) //@@@@@@@@@@这里k不能超过字库的(总字数)@@@@@@@@@@@/
{
if((((*z)*256)+*(z+1)) == zwzk[k].index[0]*256+zwzk[k].index[1])
{
findflag=1;
for(i=0;i<=1;i++)
{
x=x3;
for(j=0;j<=15;j++)
{
if(x<64)
{
y2=(y+i)|0xb8; //y2为写入到lcd的命令字,用来设置行号
Wr_Com_LCD_Left(y2);
x2=x|0x40; //x2为写入到lcd的命令字,用来设置列号
Wr_Com_LCD_Left(x2);
d = zwzk[k].zwdot[16*!i+j];
Wr_Data_LCD_Left(d);
}
if(x >= 64 && x < 128)
{
y2=(y+i)|0xb8; //y2为写入到lcd的命令字,用来设置行号
Wr_Com_LCD_Middle(y2);
x2 = (x - 64)|0x40; //x2为写入到lcd的命令字,用来设置列号
Wr_Com_LCD_Middle(x2);
d = zwzk[k].zwdot[16*!i+j];
Wr_Data_LCD_Middle(d);
}
if(x >= 128)
{
y2=(y+i)|0xb8; //y2为写入到lcd的命令字,用来设置行号
Wr_Com_LCD_Right(y2);
x2=(x - 128)|0x40;
Wr_Com_LCD_Right(x2);
d=zwzk[k].zwdot[16*!i+j];
Wr_Data_LCD_Right(d);
}
x++;
}
}
}
k++;
}
if(findflag==0)
{
//如果找不到这个字模则会显示黑框
for(i=0;i<=1;i++)
{
x=x3;
for(j=0;j<=15;j++)
{
if(x<64)
{
y2=(y+i)|0xb8; //y2为写入到lcd的命令字,用来设置行号
Wr_Com_LCD_Left(y2);
x2=x|0x40; //x2为写入到lcd的命令字,用来设置列号
Wr_Com_LCD_Left(x2);
Wr_Data_LCD_Left(0xff);
}
if(x >= 64 && x < 128)
{
y2 = (y+i)|0xb8; //y2为写入到lcd的命令字,用来设置行号
Wr_Com_LCD_Middle(y2);
x2 = (x - 64) | 0x40; //x2为写入到lcd的命令字,用来设置列号
Wr_Com_LCD_Middle(x2);
Wr_Data_LCD_Middle(0xff);
}
if(x >= 128)
{
y2=(y+i)|0xb8; //y2为写入到lcd的命令字,用来设置行号
Wr_Com_LCD_Right(y2);
x2 = (x - 128)|0x40;
Wr_Com_LCD_Right(x2);
Wr_Data_LCD_Right(0xff);
}
x++;
}
}
}
}
void wrzw16x16_string(uint8 x,uint8 y,char *z,uint8 length)
{
uint8 i;
for(i=0;i<length;i++)
{
Wrzw16x16(x+i,y,(z+2*i));
}
}
/**********************************************************************************************************
*函数名:wryw16x8
*功能描述:写16x8的字
*调用函数:无
*全局变量:无
*输入:无
*返回:无
*设计者:潘江长 日期:2006.1.11
*修改者:潘妙青 日期:2008.2.23
*版本:
***********************************************************************************************************/
void wryw16x8(uint8 x,uint8 y,char *z)
{
uint8 i,j,k;
uint8 x2,x3,y2;
uint8 d;
uint8 findflag; //此位为在字库的搜索结果标志位,0为没有找到,1为找到
findflag=0;
x2=0;
y2=0;
d=0;
x=x*8;
y=y*2;
x3=x; //下面的循环体实现在字库中搜索对应的点阵
k=0;
while(k<YWZKZS16X8) //@@@@@@@@@@这里k不能超过字库的(总字数)@@@@@@@@@@@/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -