📄 lcd240x128.c
字号:
#include "reg52.h"
#include "string.h"
#include "stdio.h"
#include "absacc.h"
#include "intrins.h"
#include "lcd240x128.h"
#include "24lc256.h"
unsigned char idata d1,d2,com; //LCD操作时的三个公共寄存器
unsigned int idata sursor_place; //光标位置
const tab1=0x0000;// 开机画面 // 0---1f8
const tab2=0x0200;//hz_table1 // 200--540
const tab3=0x0600;//hz_table2 // 600--a00
const tab4=0x0a00;//inputpass // a00--b20
const tab5=0x0c00;//set_tab1 // c00--de0
const tab6=0x0e00;//set_tab2 // e00--f80
const tab7=0x1000;//set_tab3 // 1000- 1140
const tab8=0x1200;//set_tab4 // 1200--1300
const tab9=0x1300;//set_tab5 // 1300--14e0
const tab10=0x1500;//set_tab6 // 1500--1640
const tab11=0x1700;//ASCLL tab // 1700--1810
unsigned char xdata starttable[504];//系统启动时的画面字库
unsigned char xdata hz_table1[832]; //系统正常运行时的字库
unsigned char xdata hz_table2[1024];//系统参数设置的菜单用的字库
unsigned char xdata inputpass[288]; //输入权限密的提示信息字库
unsigned char xdata set_tab1[480];
unsigned char xdata set_tab2[384];
unsigned char xdata set_tab3[320];
unsigned char xdata set_tab4[256];
unsigned char xdata set_tab5[480];
unsigned char xdata set_tab6[320];
unsigned char xdata set_tab7[272];
void lcd_rst()
{
lcd_rest_en=0x80;//复位操作允许
lcd_rest=0x80;
_nop_();
lcd_rest=0x0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
lcd_rest=0x80;
lcd_rest_en=0; //禁止操作复位
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
/********************************************/
// STA7 闪烁状态检测
// STA6 屏读、拷贝出错
// STA5 控制器运行可能性检测
// STA4 未用
// STA3 数据自动写状态准备好
// STA2 数据自动读状态准备好
// STA1 数据读写状态准备好
// STA0 指令读写状态准备好
unsigned char read_sta() //读状态值
{
unsigned char data temp=0;
temp=comd_addr;
return temp;
}
//**********************************************************************************
// sta=0 write data sta=1 write commandthe will write's data
void write(unsigned char stai,unsigned char sta,unsigned char dat) //写一个数据
{ //stai=1,check STA.0 & STA.1=1
//stai=2,check STA.2 & STA.3=1
if(stai==1)
{
for(;;)
{
if(read_sta()&0x03==0x03)
break;
}
}
else if(stai==2)
{
for(;;)
{
if(read_sta()&0x08==0x08)
break;
}
}
else
{;}
//***************
if(sta==0)
{data_addr=dat;}
else
{comd_addr=dat;}
}
//***************************************************
void write_1( ) //写一个参数的命令
{ //0xcX 数据一次读、写方式控制
//命令由com 数据由D2
write(1,0,d2);
write(1,1,com);
}
void write_2() //写两个参数的命令
{
write(1,0,d1);
write(1,0,d2);
write(1,1,com);
}
//**************************************************************************
//240X128 对字符:32个x16行 对汉字:15个x8行
//该X、Y是针对字符的位置来标注,左上角为(0,0)
//如:第5行,第10列的位置 X=5,Y=10
void write_char(unsigned char character,unsigned char X,unsigned char Y) //在指定行、列位置上显示一个字符
{
unsigned int data addr;
//unsigned char data d1,d2;
addr=32*X+Y;
d1=addr;
d2=addr>>8;
com=0x24;
write_2();//设置显示位置
d2=character;
com=0xc4;
write_1();//按写一个数据,地址再+1的方式写
}
//**************************************************************************
void write_Lchar(unsigned char character,unsigned char X,unsigned char Y)
{
//0xb8
write_char(0xb8+character*2,X,Y);
write_char(0xb8+character*2+1,X+1,Y);
}
//*************************************************************************
// 一个要显示的8位数的数据 从低位开始显示几个数
void disply_keydata(unsigned long keydata,unsigned char np)//显示键盘输入的数字,在光标处,8位,一个专用程序
{//不设置指示位置,利用原来的位置
unsigned int i;
i=sursor_place-np;
d1=i;
d2=i>>8;
com=0x24;
write_2();//设置显示位置
switch(np)
{
case 8:
{
break;
}
case 7:
{
goto a7;
break;
}
case 6:
{
goto a6;
break;
}
case 5:
{
goto a5;
break;
}
case 4:
{
goto a4;
break;
}
case 3:
{
goto a3;
break;
}
case 2:
{
goto a2;
break;
}
case 1:
{
goto a1;
break;
}
}
//MSB
d2=hex_dsc((keydata>>28)&0x0000000f);
com=0xc0;
write_1();
a7:
d2=hex_dsc((keydata>>24)&0x0000000f);
com=0xc0;
write_1();
a6:
d2=hex_dsc((keydata>>20)&0x0000000f);
com=0xc0;
write_1();
a5:
d2=hex_dsc((keydata>>16)&0x0000000f);
com=0xc0;
write_1();
a4:
d2=hex_dsc((keydata>>12)&0x0000000f);
com=0xc0;
write_1();
a3:
d2=hex_dsc((keydata>>8)&0x0000000f);
com=0xc0;
write_1();
a2:
d2=hex_dsc((keydata>>4)&0x0000000f);
com=0xc0;
write_1();
a1:
d2=hex_dsc(keydata&0x0000000f);
com=0xc0;
write_1();
//LSB
}
//*************************************************************************
// 字符串指针 行位置(0-15) 列位置(0-32)
/*void write_string(unsigned char *str,unsigned char X,unsigned char Y) //从指定位置开始输出一串字符
{ //送进来的数据是一个char型,一个char两个字符,要程序自已分解成自已能显示的数据
unsigned int data addr;
addr=32*X+Y;
d1=addr;
d2=addr>>8;
com=0x24;
write_2();//设置显示位置
d2=0xb0;
write(1,1,d2); //设置自动写方式
while(*str!='\0')
{
d2=hex_dsc(*str>>4)
write(2,0,d2);
d2=hex_dsc(*str&0x0f);
write(2,0,d2);
str++;
}
d2=0xb2;
write(1,1,d2); //结束自动写方式
} */
extern void write_long(unsigned long codedata,unsigned char X,unsigned char Y)
{
unsigned int data addr;
addr=32*X+Y;
d1=addr;
d2=addr>>8;
com=0x24;
write_2();//设置显示位置
d2=0xb0;
write(1,1,d2); //设置自动写方式
d2=hex_dsc((codedata>>28)&0x0000000f);
write(2,0,d2);
d2=hex_dsc((codedata>>24)&0x0000000f);
write(2,0,d2);
d2=hex_dsc((codedata>>20)&0x0000000f);
write(2,0,d2);
d2=hex_dsc((codedata>>16)&0x0000000f);
write(2,0,d2);
d2=hex_dsc((codedata>>12)&0x0000000f);
write(2,0,d2);
d2=hex_dsc((codedata>>8)&0x0000000f);
write(2,0,d2);
d2=hex_dsc((codedata>>4)&0x0000000f);
write(2,0,d2);
d2=hex_dsc(codedata&0x0000000f);
write(2,0,d2);
d2=0xb2;
write(1,1,d2); //结束自动写方式
}
//************************************************************************************
extern void write_int(unsigned int codedata,unsigned char X,unsigned char Y)//在指定行列位置显示一个int数据
{
unsigned int data addr;
addr=32*X+Y;
d1=addr;
d2=addr>>8;
com=0x24;
write_2();//设置显示位置
d2=0xb0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -