📄 ra8835.#2
字号:
#include <ra8835.h>
#include <wordlib.h>
//#include "variable.h"
//LCD初始化时 命令SystemSet 后的8个参数
Uchar code ParaSysTable8[]= {
0x30,0x87,0x07,0x27,0x42,0xf0,0x28,0x00
};
//LCD初始化时 命令Scroll 后的10个参数
Uchar code ParaScrTableA[]= {
0x00,BasePart1,0xF0,0x00,BasePart2,0xF0,0x00,BasePart3,0x00,BasePart4
};
Uchar test_read;
extern void Delay( Uint tt );
extern xdata unsigned char byte_sel,position_sel,yuyan_sel;
/*=====================================
** 函数名称: WriteCommand
** 功能描述: 写指令到LCD模块MISSING DEVICE
** 输入参数: 待写入的数据值 类型 Uchar
**
** 输出参数: 无
**
** 全局变量: 无
** 调用模块:
**---------------------------------------
** 作 者: wjf
** 日 期: 2008/07/30
** 注:具体操作时序图参考液晶显示模块使用手册第9页
======================================*/
void WriteCommand( Uchar CommandByte ) {
lcd_CS = 0;
lcd_A0 = 1;
lcd_WR = 0;
lcd_RD = 1;
lcd_CMD = CommandByte;
Delay(2);
lcd_WR = 1;
lcd_CS = 1;
}
/*=====================================
** 函数名称: WriteData
** 功能描述: 写数据到LCD模块显示内存
** 输入参数: 待写入的数据值 类型 Uchar
**
** 输出参数: 无
**
** 全局变量: 无
** 调用模块:
**---------------------------------------
** 作 者: wjf
** 日 期: 2008/07/30
** 注:具体操作时序图参考液晶显示模块使用手册第9页
======================================*/
void WriteData( Uchar dataW ) {
lcd_CS = 0;
lcd_A0 = 0;
lcd_WR = 0;
lcd_RD = 1;
lcd_DATA = dataW;
Delay(2);
lcd_WR = 1;
lcd_CS = 1;
lcd_A0 = 1;
}
/*=====================================
** 函数名称: ReadData
** 功能描述: 读数据从LCD模块显示内存
** 输入参数: 无
**
** 输出参数: 无
**
** 全局变量: 无
** 调用模块: 测试函数 LcmTest
**---------------------------------------
** 作 者: wjf
** 日 期: 2008/08/04
** 注:具体操作时序图参考液晶显示模块使用手册第9页
======================================*/
unsigned char ReadData(void)
{
char address_data;
lcd_CS = 0;
lcd_A0 = 1;
Delay(1);
lcd_WR = 1;
lcd_RD = 0;
Delay(5);
address_data = lcd_DATA;
lcd_RD = 1;
lcd_CS = 1;
lcd_A0 = 1;
return(address_data);
}
/*======================================================
** 函数名称: LcmInition
** 功能描述: 初始化RA8835 具体初始化内容参看程序行注释
** 输入参数: 无
**
** 输出参数: 无
**
** 全局变量: ParaSysTable8[] ParaScrTableA[]
** 调用模块: main.c中main()
**------------------------------------------------------
** 作 者: wjf
** 日 期: 2008/07/31
=======================================================*/
void LcmInition( void ) {
Uchar i;
WriteCommand( SystemSet ); // 系统参数设置
for (i=0;i<8;i++) {
WriteData( ParaSysTable8[i] );
}
WriteCommand( Scroll ); //设定显示区域起始地址
for (i=0;i<10;i++) {
WriteData( ParaScrTableA[i] );
}
WriteCommand( HdotScr ); // 写入点位移指令代码
WriteData( 0x00 ); // 写入P1参数
WriteCommand( Ovlay ); // 显示合成方式设置
WriteData( 0x04 ); // 0000 0100 显示一区图形,三区文本属性,二重"或"合成
WriteCommand( 0x4c ); //设置光标移动的方向为 光标向右移动 地址:CSR+1→CSR
WriteCommand( DispOn ); // 显示状态设置
WriteData( 0x54 ); // 显示 1~4 区开显示,光标关显示
}
/*============================================================================
** 函数名称: LcmRest
** 功能描述: 复位LCD——RA8835
** 输入参数: 无
**
** 输出参数: 无
**
** 全局变量: 无
** 调用模块:
**---------------------------------------------------------------------------
** 作 者: wjf
** 日 期: 2008/08/06
============================================================================*/
void LcmRest( void ) {
lcd_RES=0;
Delay(1000);
lcd_RES=1;
}
/*============================================================================
** 函数名称: LcmClear
** 功能描述: LCD清屏函数 清除32K的显示内存
** 输入参数: 无
**
** 输出参数: 无
**
** 全局变量: 无
** 调用模块:
**---------------------------------------------------------------------------
** 作 者: wjf
** 日 期: 2008/08/01
============================================================================*/
void LcmClear( void ) {
Uint i1=32768;
WriteCommand( CsrDirR ); // 光标移动方向定义:自动右移
WriteCommand( CsrW ); // 光标Locate,定位
WriteData( 0 ); // 写入参数CSRL设置参数光标指针低8位
WriteData( 0 ); // 写入参数CSRH设置参数光标指针高8位
WriteCommand( mWrite ); // 数据写入指令,代码0x42
while(i1--) {
WriteData( 0x00 ); // 写入数据0
}
}
/*======================================================
** 函数名称: LcmTest
** 功能描述: 测试LCD Display Memory 的写读
** 输入参数: 无
**
** 输出参数: 无
**
** 全局变量:
** 调用模块:
**------------------------------------------------------
** 作 者: wjf
** 日 期: 2008/08/04
=======================================================*/
void LcmTest( void ) {
WriteCommand( 0x46 ); //设置光标地址
WriteData( 0 );
WriteData( 0 );
WriteCommand( mWrite ); // 显示数据写入指令,代码0x42
WriteData( 0x55 );
WriteCommand( 0x46 ); //设置光标地址
WriteData( 0 );
WriteData( 0 );
WriteCommand( mRead ); //显示数据读出指令,代码0x43
test_read=ReadData();
}
/*============================================================================
** 函数名称: Locatexy
** 功能描述: LCD的光标定位
** 输入参数: Uchar x 水平方向字节单位坐标,即可以以半个汉字宽度设定水平坐标
Uchar y 垂直方向以行线定位的坐标,可以定位到点单位
注:屏左上角为(0,0)
**
** 输出参数: 无
**
** 全局变量: 无
** 调用模块:
**---------------------------------------------------------------------------
** 作 者: wjf
** 日 期: 2008/08/01
============================================================================*/
void Locatexy(Uchar x,Uchar y, Uchar attribs) {
Uint temp;
temp = (Uint)y*paraP9+x;
if(attribs) temp += BasePart2*256; // 如果需要就指向第二区,加上第二区首地址
WriteCommand( CsrW ); // 光标Locate,定位
WriteData( (Uchar)(temp &0xff) ); // 写入参数CSRL设置参数光标指针低8位
WriteData( (Uchar)(temp /256 ) ); // 写入参数CSRH设置参数光标指针高8位
}
/*============================================================================
** 函数名称: dprintf
** 功能描述: ASCII(8*16) 及 汉字(16*16) 混合字符串显示
** 输入参数: Uchar x 显示字符串的横坐标 8点一字节位置
Uchar y 显示字符串的纵坐标 一条扫描线定位
**
** 输出参数: Uchar 字符串的长度(汉字为两个字节)
**
** 全局变量: 无
** 调用模块:
说明:调用时汉字必须在字库数组中已经存在,否则将输出不正确的结果
**---------------------------------------------------------------------------
** 作 者: wjf
** 日 期: 2008/08/01
============================================================================*/
Uchar dprintf(Uchar x,Uchar y, char code *ptr, Uchar att)
{
Uchar c1,c2;
Uchar i,j,uLen,uRow,uCol,temp;
Uint k;
uRow = x;
uCol = y;
uLen=0;
WriteCommand( CsrDirD ); // 光标移动方向定义:自动下移
Locatexy(uRow,uCol,att); //起点定位
while ( (Uchar)ptr[uLen] >= 0x10 ){uLen++;}; //探测字串长度
i=0;
while(i<uLen)
{
c1 = ptr[i];
c2 = ptr[i+1];
//ascii字符与汉字内码的区别在于128做分界,大于界线的为汉字码
if(c1 <=128) // ASCII
{
if (c1 >= 0x10) {
WriteCommand( mWrite ); // 写数据(命令)
for(j=0;j<16;j++) WriteData( ASC_MSK[(c1-0x20)*16 +j ]);
}
uRow++; // 列数加1
}
else // 中文
{
for(j=0;j<sizeof(Cdotlib)/sizeof(Cdotlib[0]);j++) // 查找定位
{
if((c1 == Cdotlib[j].Index[0]) && (c2 == Cdotlib[j].Index[1]))
break;
}
for(k=0;k<2;k++) // 分16行输出
{
Locatexy(uRow+k,uCol,att);
WriteCommand( mWrite ); // 写数据(命令)
for(temp=0;temp<16;temp++) WriteData( Cdotlib[j].Msk[temp*2 + k]);
}
uRow +=2; // 光标右移一大格
i++;
}
if(uRow >= 40) // 光标后移
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -