📄 lcd.c
字号:
//文件名: lcd_ctrol.c
//功 能: LCD源程序
//版本号: V1.2
//日 期: 2003.2.17
//历史纪录: 在lcd_ctrol.c基础上修改:LCD显示以行刷新
#include "include.h"
uchar u1,u2,u3,u4,u5,u6=0;
/*
uchar zimobuf[32] =
{
// 0x7e,0x42,0x7e,0xff,0x89,0xf7,0x78,0x49,0x79,0x01,0xff,0x00,0x00,0x00,0x00,0x07,
// 0x00,0x00,0x00,0x00,0x04,0x04,0x07,0x00
// 0x80,0x40,0x20,0xf8,0x00,0x00,0x01,0x01,0x01,0x07,0x01,0x00,
0xf0,0xf8,0x0c,0xc4,0x0c,0xf8,0xf0,0x00,0x03,0x07,0x0c,0x08,0x0c,0x07,0x03,0x00
};
*/
//==============================================================================
void _write_cpld(uint _addr, uchar _date)
{
//PSD8xx_reg.PAGE|=0x40;
XBYTE[_addr]=_date;
//PSD8xx_reg.PAGE&=0xbf;
}
void write_cpld_u5(uchar enable_bit, uchar logic)
{
if(logic)
u5 |= enable_bit;
else
u5 &= ~enable_bit;
_write_cpld(0x8104,u5);
}
void write_cpld_u6(uchar enable_bit, uchar logic)
{
if(logic)
u6 |= enable_bit;
else
u6 &= ~enable_bit;
_write_cpld(0x8105,u6);
}
void Writ_cpld(uchar enable_bit, uchar logic)
{
if(logic)
u4 |= enable_bit;
else
u4 &= ~enable_bit;
_write_cpld(0x8103,u4);
}
/***********************************************************
*函数名: wrt_lcd_cmd()
*输入: uchar byte -- 要输入的命令
*输出: void
*功能: 向lcd中写入一字节命令
***********************************************************/
void wrt_lcd_cmd(uchar byte)
{
write_cpld_u5(EN_lcd,1);
write_cpld_u5(W_R_lcd,0); //RW=0; //读写控时位
write_cpld_u5(D_I_lcd,0); //CD=0; //数据类型控制位
_write_cpld(0x8102,byte);
write_cpld_u5(EN_lcd,0);
}
/***********************************************************
*函数名: wrt_lcd_data(uchar ubyte)
*输入: uchar ubyte -- 要输入的数据
*输出: void
*功能: 向lcd中写入一字节数据
*描叙: 用MCU模拟6800时序与LCM通讯
***********************************************************/
void wrt_lcd_data(uchar byte)
{
write_cpld_u5(EN_lcd,1);
write_cpld_u5(D_I_lcd,1); //CD=1;
write_cpld_u5(W_R_lcd,0); //RW=0;
_write_cpld(0x8102,byte);
write_cpld_u5(EN_lcd,0);
}
/***********************************************************
*函数名: select_p(uchar d_page)
*输入: uchar (输入的开通显示区号):0-选左64列,1-选中64列,2-选右64列,>=3-不选
*输出: void
*功能: 选择开放显示区
***********************************************************/
void select_p(uchar d_page)
{
uchar EAStatus;
EAStatus = EA;
EA = 0;
switch(d_page)
{
case 0:
write_cpld_u5(Cs1_lcd,0);//Cs1_lcd=csb
write_cpld_u5(Cs2_lcd,1); //Cs2_lcd=csa
write_cpld_u5(Cs3_lcd,1);
break;
case 1:
write_cpld_u5(Cs1_lcd,1);
write_cpld_u5(Cs2_lcd,0);
write_cpld_u5(Cs3_lcd,1);
break;
case 2:
write_cpld_u5(Cs1_lcd,1);
write_cpld_u5(Cs2_lcd,1);
write_cpld_u5(Cs3_lcd,0);
break;
default:
write_cpld_u5(Cs1_lcd,1);
write_cpld_u5(Cs2_lcd,1);
write_cpld_u5(Cs3_lcd,1);
break;
}
EA = EAStatus;
}
/***********************************************************
*函数名: init_lcd(uchar ubyte)
*输入: uchar ubyte --初始化状态字
0x3e 关显示;
0x3f 开显示;
0x0c0 定义显示起始行
*输出: void
*功能: LCD模块初始化显示
***********************************************************/
void init_lcd(uchar ubyte)
{
uchar i=0;
write_cpld_u5(W_R_lcd,0);//RW=1;
write_cpld_u5(EN_lcd,0);
write_cpld_u5(D_I_lcd,0);//CD=0;
do
{
select_p(i);
wrt_lcd_cmd(ubyte); //开显示
i++;
}while(i<3);
select_p(3);
}
//初始化LCD显示
//开显示,并定义显示起始行(0)
void InitialLCD(void)
{
_nop_ ( );
init_lcd(0x3e); //关显示
_nop_ ( );
init_lcd(0x3f); //开显示
_nop_ ( );
init_lcd(0x0c0); //设置显示起始行第0行开始
}
/***********************************************************
*函数名: con_data(uchar len,uchar *databuf)
*输入: uchar len -- 取反数据的长度
* uchar *databuf -- 传入数据指针
*
*输出: void
*功能: 反白显示数据时将 len 长度的 字模数据 按位取反
***********************************************************/
void con_data(uchar len,uchar *databuf)
{
uchar i;
// uchar *p,i;
// p=databuf;
for(i=0;i<len;i++)
{
*databuf=~*databuf;
databuf++;
}
}
static int is_gb13000(unsigned char *str)
{
return (((*(uchar*)(str) > 0x80) && (*(uchar*)(str) < 0xff)) &&
(((*(uchar*)(str+1) > 0x3f) && (*(uchar*)(str+1) < 0x7f)) ||
((*(uchar*)(str+1) > 0x7f) && (*(uchar*)(str+1) < 0xff))));
}
int is_chinese(unsigned char *str)
{
return is_gb13000(str);
}
unsigned int _gb13000_index(unsigned char const *s)
{
unsigned char s0, s1;
unsigned int result;
s0 = *s;
s1 = *(s+1);
if(s0>=0xa1&&s0<=0xa9&&s1>=0xa1&&s1<=0xfe)
{
return (s0 - 0xa1)*94 + (s1 - 0xa1);
}
else if(s0>=0xb0&&s0<=0xf7&&s1>=0xa1&&s1<=0xfe)
{
return (s0 - 0xb0)*94 + (s1 - 0xa1) +1038;
}
else if(s0>=0x81&&s0<=0xa0&&s1>=0x40&&s1<=0xfe)
{
result = (s0 - 0x81)*190 + (s1 - 0x40) + (0xf8 - 0xb0)*94 +1038;
if(s1>=0x80)
result--;
return result;
}
else if(s0>=0xaa&&s0<=0xfe&&s1>=0x40&&s1<=0xa0)
{
result = (s0 - 0xaa)*96 + (s1 - 0x40) + (0xf8 - 0xb0)*94 + (0xa0 -0x80)*190 +1038;
if(s1>=0x80)
result--;
return result;
}
}
//=================================================================
//把一行(inbuf)字符串内码转化为显示点阵值存到outbuf中
//字模首地址=((机内码高字节-1)×94+(机内码低字节-1))×N (2)
void convert(uchar xdata *inbuf,uchar *outbuf)
{
ulong addr;
uchar tempbuf[32];
// uchar tempbuf1[32];
while(1)
{
if(is_chinese(inbuf)) /*转换汉字内码*/
{
addr = 32*(ulong)_gb13000_index(inbuf);
// addr = get_hz_ptaddr(inbuf);
inbuf+=2;
read_flash(addr,32,tempbuf);
memcpy(outbuf,tempbuf,16);
memcpy(outbuf+192,tempbuf+16,16);
outbuf+=16;
}
else if((*inbuf>0x1f)&&(*inbuf<0x80)) /*转换ASCII内码*/
{
addr=0xdf400 + (ulong)*inbuf*16;
// addr = get_ascii_ptaddr(inbuf);
inbuf++;
read_flash(addr,16,tempbuf);
memcpy(outbuf,tempbuf,8);
memcpy(outbuf+192,tempbuf+8,8);
outbuf+=8;
}
else if(*inbuf==0) break;
else inbuf++;
}
}
//=================================================================
//把一行(inbuf)字符串内码转化为显示点阵值存到outbuf中反显
//字模首地址=((机内码高字节-1)×94+(机内码低字节-1))×N (2)
void convert1(uchar xdata *inbuf,uchar xdata *outbuf,uchar len)
{
ulong addr;
uchar xdata tempbuf[32];
uchar lentemp;
lentemp=len;
while(1)
{
if(is_chinese(inbuf)) /*转换汉字内码*/
{
addr = 32*(ulong)_gb13000_index(inbuf);
inbuf+=2;
read_flash(addr,32,tempbuf);
//for debug
//delayms(2);
//EA = 0;
if(lentemp>1){con_data(32,tempbuf);lentemp-=2;}
memcpy(outbuf,tempbuf,16);
memcpy(outbuf+192,tempbuf+16,16);
outbuf+=16;
}
else if((*inbuf>0x1f)&&(*inbuf<0x80)) /*转换ASCII内码*/
{
addr=0xdf400 + (ulong)*inbuf*16;
inbuf++;
read_flash(addr,16,tempbuf); //read_eepromZIKU(addr,16,tempbuf);
if(lentemp>0){con_data(16,tempbuf);lentemp--;}
memcpy(outbuf,tempbuf,8);
memcpy(outbuf+192,tempbuf+8,8);
outbuf+=8;
}
else if(*inbuf==0) break;
else inbuf++;
}
}
//=========================================================================================
//把影射到外部SRAM中的 1536(c_buf) 个字节显示点阵数据写入LCD模块寄存区
void write_lcd_mem(uchar xaddr,uchar xdata *disbuf)
{
uchar i;//,xtemp;
uchar j;
uchar k;
uchar xdata *p;
p=&disbuf[(xaddr*192)];
xaddr=xaddr+0xb8; //设置DDRAM中的页地址(X地址)
k=2;
do //输入全屏
{
if(xaddr>0xbf)
break;
for(i=0;i<3;i++)//do //输入一逻辑行
{
select_p(i); //选第几部分共3部分每部分64列
wrt_lcd_cmd(0xc0); //第0行显示
wrt_lcd_cmd(xaddr); //设置DDRAM中的页地址(X地址)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -