📄 lcd.c
字号:
//============================
//绕线机程序
//240*64LCD子程序
//============================
#ifndef __LCD_c__
#define __LCD_c__
#include "included.h"
/*==========================
LY-62256SRAM===32K*8
字符区:DISPLAY RAM 0000H-07FFH(2K)
图形区:DISPLAY RAM 0800H-7FFFH(30K)
===========================*/
void int_lcd(void)
{
pr_1(0x00,0x00,0x40);//设置文本显示区域首地址
pr_1(0x1e,0x00,0x41);//;一行所占字节数30个字符
pr_1(0x00,0x08,0x42);//设置设置图形显示区域首地址
pr_1(0x1e,0x00,0x43);//设置图形显示区域宽度一行所占字节数30个字符
pr_12(0xa7); //光标形状设置
pr_12(0x80); //启动内部字符发生器
//;文本与图形以逻辑或的关系合成显示
pr_12(0x9c); //启动文本显示,启动图形显示
}
//===================
//对LCD显示SRAM全部清零
//==================
void clr_dis_sram(void)
{
uint i;
pr_1(0x00,0x00,0x24);//地址指针设置
pr_12(0xb0); //数据自动读写设置,进入自动写模式 //
for(i=0;i<0x8000;i++) //32k的字节空间
{
st_3();
d_add = 0x00; //设置数据通道地址/数据写入入口
}
pr_12(0xb3); //退出自动写模式
}
//===============
//读状态字子程序
//================
uchar r_st(void)
{
return (c_add);
}
//==============
//判断S1,S0子程序
//==============
void st_01(void)
{
uchar date_0;
do
{
date_0 = r_st();
date_0 &=0x03;
}while(date_0 != 0x03);
}
//==============
//判断S2子程序
//==============
void st_2(void)
{
uchar date_0;
do
{
date_0 = r_st();
date_0 &=0x04;
}while(date_0 != 0x04);
}
//==============
//判断S3子程序
//==============
void st_3(void)
{
uchar date_0;
do
{
date_0 = r_st();
date_0 &=0x08;
}while(date_0 != 0x08);
}
/*==========================
;写指令和数据子程序
;-----2个参数------------
===========================*/
void pr_1(uchar date_1,uchar date_2,uchar com_0)
{
st_01();
d_add = date_1; //第一参数单元
st_01();
d_add = date_2; //取第二参数单元数据
st_01();
c_add = com_0; //写入指令代码
}
/*==========================
;写指令和数据子程序
;-----1个参数------------
===========================*/
void pr_11(uchar date_1,uchar com_0)
{
st_01();
d_add = date_1; //一参数单元
st_01();
c_add = com_0; //写入指令代码
}
/*==========================
;写指令
;-----0个参数------------
===========================*/
void pr_12(uchar com_0)
{
st_01();
c_add = com_0; //写入指令代码
}
//=========================
//读数据子程序
//==========================
uchar pr_2(void)
{
st_01();
return ( d_add); //设置数据通道地址/数据写入入口
}
/*=========在LCD上显示图形===============
图形写入子程序(图形方式)
参数说明:
X:在屏幕上水平方向的位置(字节为单位0--30)
Y:在屏幕上垂直方向的位置(像数点为单位0--63)
tim0:表示该图形在屏幕上一行上要显示多小个字节
tim1:表示该图形在屏幕上要显示多小行
tab_add:表的地址位置
=================================*/
void wri_pic(uchar x,uchar y,uchar tim0,uchar tim1,uchar *tab_add)
{
uint dis_add;
uint cod;
uchar *pt;
uint temp_pos;
pt = tab_add; //表的地址位置
dis_add = x+y*0x1e+0x0800;//计算显示RAM的地址
for(cod =0;cod<tim1;cod++ ) //tim1=图形的行数
{
pr_1(dis_add,dis_add>>8,0x24);//写指令和数据子程序2个参数
for(temp_pos=0;temp_pos<tim0;temp_pos++ )//tim0 =图形的列数
{
pr_11(*pt,0xc0);//写指令和数据子程序1个参数
++pt;
}
dis_add +=30; //修正显示RAM的地址
}
}
///*;********在LCD上显示西文字符*********************
//西文字符写入子程序(文本显示)
//参数说明:
//X:水平方向的坐标单位(字节)范围(0-30)240/8
//Y:垂直方向的坐标单位(字节)范围(0-7)64/8
//COD:ASCII码位置在00H-7FH之间,字符代码
// ============================================= */
void wri_c(uchar x,uchar y,uchar cod)
{
uint dis_add;
dis_add = y*0x1e+x;
pr_1(dis_add,dis_add>>8,0x24);//写指令和数据子程序2个参数
pr_11(cod,0xc0);
}
/*===========在LCD上显示一个西文字符===========
图形方式下显示一个西文字符子程序
X:显示屏行线上的第几个字节(0----240/8=30)字节为单位
Y:显示屏上的第几行(0--63)像数点为单位
cod:该字符在数组中的位置
字体下对应的点阵为:宽x高=8x16
西文字符写入子程序(图形方式)
=============================*/
void wri_s(uchar x,uchar y,uchar cod,uchar *tab_add)
{
uint dis_add;
uchar count;
uchar *true_add;
dis_add = y*0x1e+x+0x0800; //0800H OF 30K
true_add= tab_add+cod*0x10; //西文字符
for(count=0;count<16;count++)
{
pr_1(dis_add,dis_add>>8,0x24);
pr_11(*true_add,0xc0);
++true_add;
dis_add +=30;
}
}
/*==========在LCD上显示一个汉字======================
在图形方式下显示一个汉字的子程序
参数说明:
X:显示屏行线上的第几个字节(0----240/8=30)字节为单位
Y:显示屏上的第几行(0--63)像数点为单位
COD:在字模表中定义的要显示的字是哪个(32个字节为单位)
;汉字写入子程序(图形方式)
;y*30+x+0800 = 要显示的RAM地址d2,d1==>y,x
;====================================*/
void wri_cc(uchar x,uchar y,uchar cod,uchar *tab_add)
{
uint dis_add;
uchar count;
uchar *true_add;
dis_add = y*0x1e+x+0x0800; //显示地址的偏移设置
true_add = tab_add+cod *32;//数据在表中的地址
for(count=0;count<16;count++)
{
pr_1(dis_add,dis_add>>8,0x24);
pr_11(*true_add,0xc0);
++true_add;
pr_11(*true_add,0xc0);
++true_add;
dis_add +=30;
}
}
//;*********在LCD上显示一个点********************
//;绘点子程序(240X64)
/*==========================================
参数说明:
X:显示屏上的水平方向(0--234)像数点为单位
Y:显示屏上的垂直方向(0--63)像数点为单位
============================================*/
void wri_d(void)
{
uint dis_add;
uchar temp_0;
dis_add = 5*0x1e+7/8+0x0800;
pr_1(dis_add,dis_add>>8,0x24);
temp_0 =7%8;
temp_0 = 0x07-temp_0;
temp_0 |=0xf8; //确定位,相应位为1
pr_12(temp_0);
}
//==============文本显示==ASCII码==========================
/*=======显示外部RAM一个地址单元里的值==============
参数说明:8*8
X:水平方向的坐标单位(字节)范围(0-30)240/8
Y:垂直方向的坐标单位(字节)范围(0-7)64/8
tim0:数字位数的1/2数,N为数据的位数
==============================*/
void dis_dat(uchar x,uchar y,uchar xdata_sram)
{
uint dis_add;
uchar temp;
dis_add = y*0x1e+x;
pr_1(dis_add,dis_add>>8,0x24);
temp =xdata_sram;
temp =temp>>4;
temp &=0x0f;
temp |=0x10; //显示BCD码,如0X79,则屏幕上就显示79
pr_11(temp,0xc0);
temp =xdata_sram;
temp &=0x0f;
temp |=0x10;
pr_11(temp,0xc0);
}
/*======================================
读出2汉字并取反后再写入子程序(图形方式)
取反显示,是选中的那2个字,变成空心字,
以表示选中了当前要设置的子项目
=======================================*/
void wri_rd(uchar x,uchar y)
{
uchar count=0,col=0;
uint dis_add;
uchar temp;
dis_add=y*30+x+0x0800;//显示地址
for(count=0;count<16;count++)
{
pr_1(dis_add,dis_add>>8,0x24);
for(col=0;col<4;col++)
{
pr_12(0xc5);//执行一次读操作
temp=pr_2(); //读数据子程序
pr_11(~temp,0xc0);//一次写操作
}
dis_add +=30;
}
}
//==============================
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -