📄 display.c
字号:
#ifndef OS_MASTER_FILE
#include "includes.h"
#endif
#include "charmode.c"
/*
*****************************************************************************************************************
* 功能描述: 该函数设置控制端口和数据端口为输出端口,并且控制端口相应的控制位
* 输出初态都为1;对液晶模块进行了软件复位;对文本区,图形区和CG—
* RAM区做了分配;设置显示模式为图形模式;清零液晶显示模块8k的RAM
* 空间。
* 具体的命令请参见TOSHIBA的T6963C芯片数据手册;
* 参数: 没有。
* 返回值: 没有。
*****************************************************************************************************************
*/
void initLCDResource(void)
{
INT16U loop;
*SIM_PEPAR = 0x00; // set multi function pins as I/O pins;
*SIM_DDRE = 0xFF; // normal state of those pins is output;
*TPU_PRAM11 = 0x0003;
*TPU_PRAM12 = 0x0003;
*TPU_PRAM13 = 0x0003;
*TPU_PRAM14 = 0x0003;
*TPU_PRAM15= 0x0003;
*TPU_CFSR0 = 0x8888;
*TPU_CFSR1 = ((*TPU_CFSR1)&0x0FFF)|0x8000;
*TPU_CPR0 = ((*TPU_CPR0)&0x003F)|0xFFC0;
*TPU_HSQR0 &= 0x003F;
*TPU_HSRR0 = ((*TPU_HSRR0)&0x003F)|0xFFC0;
*TPU_CIER &= 0x07FF;
*TPU_HSRR0 = (*TPU_HSRR0 & ~0xFFC0) | 0x5540; /* set tch11,12,13,14,15*/
LCD_RESET_ENABLE();
NOP();
NOP();
NOP();
LCD_RESET_DISABLE();
writeData(TBASE&0xFF); // set text home address;
writeData(TBASE>>8);
writeCommand(0x40);
writeData(TCOLUMNS&0xFF); // set text area(Bytes per display line);
writeData(TCOLUMNS>>8);
writeCommand(0x41);
writeData(GBASE&0xFF); // set graphic home address;
writeData(GBASE>>8);
writeCommand(0x42);
writeData(GCOLUMNS&0xFF); // set graphic area(Bytes per display line);
writeData(0x00);
writeCommand(0x43);
setOffsetRegister(0x03);
writeCommand(0x80); // set OR mode; CAUTION: when setting mode not setted , there
// is somthing wrong with display;
writeData(0x00); // clearing all RAM begins ;
writeData(0x00);
writeCommand(0x24);
writeCommand(0xB0);
for(loop = 0; loop < 0x2000; loop++)
{
writeData(0x00);//writeData为向液晶显示器写数据
} //writeCommand为向液晶显示器写命令
writeCommand(0xB2); // clearing all RAM ends;
writeCommand(0x98); // text off, graphic on;
return;
}
/*
*****************************************************************************************************************
* 功能描述: 该函数用来读状态寄存器的内容,用以决定下一步对液晶模块的读或写
* 操作是否可行;
* 参数: 没有;
* 返回值: 液晶显示模块的状态字(1个byte,8个bits);
* 状态字每位所代表的含义请参见TOSHIBA的T6963C芯片数据手册;
*****************************************************************************************************************
*/
INT8U readStatusRegister(void)
{
INT8U result = 0;
*SIM_DDRE = 0x00; // 使数据端口为输入端口;
LCD_CHIPSEL_ENABLE();
LCD_READ_ENABLE();
NOP();
result = *SIM_PORTE; // 将状态寄存器的内容读入到变量result中;
LCD_READ_DISABLE();
LCD_CHIPSEL_DISABLE();
*SIM_DDRE = 0xFF;
return result;
}
/*
*****************************************************************************************************************
* 功能描述: 该函数用来读取当前地址指针所指向单元的内容,当前地址可通过函数
* setAddressPointer函数来设置;
* 参数: 没有;
* 返回值: 当前地址指针所指向单元的内容;
*****************************************************************************************************************
*/
INT8U readData(void)
{
INT8U result = 0;
do{
result = readStatusRegister();
}while((result & (0x03)) != 0x03); // 等待液晶显示模块可进行读操作;
*SIM_DDRE = 0x00; // 使数据端口为输入端口;
LCD_DATA_ENABLE();
LCD_CHIPSEL_ENABLE();
LCD_READ_ENABLE();
NOP();
result = *SIM_PORTE;
LCD_READ_DISABLE();
LCD_CHIPSEL_DISABLE();
LCD_DATA_DISABLE();
return result;
}
/*
*****************************************************************************************************************
* 功能描述: 该函数用来向液晶显示模块写命令,告诉显示模块为下一步的操作做相关
* 的准备;
* 参数: cmd代表向液晶显示模块所写入的命令;
* 命令的具体内容请参见TOSHIBA的T6963C芯片数据手册;
* 返回值: 该函数假设命令能够成功地写入液晶显示模块,没有返回值;
*****************************************************************************************************************
*/
void writeCommand(INT8U cmd)
{
INT8U temp = 0xFF;
do{
temp = readStatusRegister();
}while((temp & (0x03)) != 0x03); // 等待液晶显示模块可进行写操作;
*SIM_PORTE = cmd; // put the command cmd to portA;
LCD_CHIPSEL_ENABLE();
LCD_WRITE_ENABLE();
NOP();
LCD_WRITE_DISABLE();
LCD_CHIPSEL_DISABLE();
return;
}
/*
*****************************************************************************************************************
* 功能描述: 该函数用来向液晶显示模块写数据;
* 参数: data代表向液晶显示模块写入的数据;
* 写该数据时,应先指定数据存放的地址,这个操作通过函数
* setAddressPointer函数来完成;
* 返回值: 假设该函数能够成功的被调用,没有返回值;
*****************************************************************************************************************
*/
void writeData(INT8U data)
{
INT8U temp = 0xFF;
do{
temp = readStatusRegister();
}while((temp & (0x03)) != 0x03); // 等待液晶显示模块可进行写操作;
*SIM_PORTE = data; // put the data to portA;
LCD_DATA_ENABLE();
LCD_CHIPSEL_ENABLE();
LCD_WRITE_ENABLE();
NOP();
LCD_WRITE_DISABLE();
LCD_CHIPSEL_DISABLE();
LCD_DATA_DISABLE();
return;
}
/*
*****************************************************************************************************************
* 功能描述: 该函数用来得到参数addr所指向单元的内容;
* 参数: addr代表液晶显示模块内部单元的地址;
* 返回值: addr所指向单元的内容;
*****************************************************************************************************************
*/
INT8U getData(INT16U addr)
{
INT8U result = 0xFF;
setAddressPointer(addr); // 将地址指针设置为addr;
writeCommand(0xB1);
result = readData(); // 读addr所指向单元的内容;
writeCommand(0xB2);
return result;
}
/*
*****************************************************************************************************************
* 功能描述: 该函数用来设置偏置寄存器的内容,只有参数addr的低5位有效;偏置
* 寄存器的内容和寻址空间见下表:
* offset register data CG RAM hex. address(start to end)
* 00000 0000 to 07FFH
* 00001 0800 to 0FFFH
*
* 11111 F800 to FFFFH
* 参数: addr用来设置偏置寄存器的内容,低5位有效;
* 返回值: 假设函数能够被成功的调用,没有返回值;
*****************************************************************************************************************
*/
void setOffsetRegister(INT8U addr)
{
writeData(addr); // 设置偏置寄存器的内容;
writeData(0x00);
writeCommand(0x22); // 告诉液晶显示模块addr用来写入偏置寄存器;
return;
}
/*
*****************************************************************************************************************
* 功能描述: 该函数用来设置地址寄存器里的内容;
* 参数: addr代表写入地址寄存器里的内容;
* 返回值: 假设函数能够被成功的调用,没有返回值;
*****************************************************************************************************************
*/
void setAddressPointer(INT16U addr)
{
writeData(addr&0xFF); // 写入addr的低字节;
writeData(addr>>8); // 写入addr的高字节;
writeCommand(0x24); // 将addr写入地址寄存器;
return;
}
/*
*****************************************************************************************************************
* 功能描述: 该函数用来将液晶显示关闭。
* 参数: 没有。
* 返回值: 没有。
*****************************************************************************************************************
*/
void displayOff(void)
{
writeCommand(0x90);
return;
}
/*
*****************************************************************************************************************
* 功能描述: 该函数用来开启液晶显示。
* 参数: 没有。
* 返回值: 没有。
*****************************************************************************************************************
*/
void displayOn(void)
{
writeCommand(0x98);
return;
}
/*
*****************************************************************************************************************
* 功能描述: 该函数用来得到指定字符(charcode)的字模在字模数组(CharMode[ ][ ])
* 中的索引值;
* 参数: charcode代表指定字符的内码;
* 返回值: 指定字符在字模数组中的索引;
* 如果指定字符的字模在字模数组中不存在,则返回0xFFFF;
*****************************************************************************************************************
*/
INT16U getCharIndex(INT16U charcode)
{
INT16U result;
INT16U index;
INT16U head,rear;
head = 0;
rear = CMSIZE - 1;
while(head <= rear)
{
index = (head + rear) / 2;
if((CharMode[index][0]&0x80) == 0x00) //CharMode为二维数组
{
result = CharMode[index][0];
}
else
{
result = CharMode[index][0];
result <<= 8;
result += CharMode[index][1];
}
if(charcode == result)
{
return index;
}
else
{
if(charcode > result)
head = index + 1;
else rear = index - 1;
}
}
return 0xFFFF;
}
/*
*******************************************************************************************************
* 功能描述: 该函数用来在指定点处(x bit, y bit)显示指定宽度(width)和
* 高度(height)的图形,图形数据由pdata(无符号字符型指针)
* 来指定;
* 参数: x 代表横坐标,取值范围为0 -> 127;
* y 代表纵坐标,取值范围为0 -> 159;
* width 代表图形的宽度,取值范围为 1 -> (128 - x);
* height代表图形的高度,取值范围为 1 -> (159 - y);
* pdata代表图形数据,是一个无符号字符型指针,数据按如下要求
* 组织:
* / pdata[0](8 bits) pdata[next colum...](8 bits) ----
* | pdata[1](8 bits) |
* height | |
* | | (8 bits) |(8 bits)
* \ | (8 bits) |(8 bits) ----
* \__________________width_________________/
* 返回值: 假设函数能够被成功的调用,没有返回值;
*******************************************************************************************************
*/
void drawGraph(INT8U x, INT8U y, INT8U width, INT8U height, INT8U *pdata)
{
INT8U loop, heightloop;
INT8U screenx;
INT16U index = 0;
for(loop = 0, screenx = x; loop < width; loop++, screenx++)
{
for(heightloop = 0; heightloop < (height / 8); heightloop++)
{
print(screenx, y + heightloop * 8, 8, pdata[index]);//数组进行传递参数时,
//使用指针
index++;
}
if((height % 8) != 0)
{
print(screenx, y + heightloop * 8, height % 8, pdata[index]);
index++;
}
}
return;
}
/*
**************************************************************************************************************
* 功能描述: 该函数用来在液晶上画水平线,线的起点由(x(bit), y(bit))来决定,
* 线的宽度由height来决定,线型由data来决定;
* 参数: x代表水平线起点的横坐标,取值范围为0 -> 127;
* y代表水平线起点的纵坐标,取值范围为0 -> 159;
* width代表水平线的宽度,取值范围为1 ->(128 - x);
* data代表显示线的类型;
* 返回值: 假设函数能够被成功的调用,没有返回值;
**************************************************************************************************************
*/
void drawHorizLine(INT8U x, INT8U y, INT8U width, INT8U data)
{
INT8U Lrotate,Rrotate;
INT8U maskcode;
INT8U bit;
INT8U loop;
INT8U result;
switch((INT8U)(y%8)) //强制类型转换
{
case 0x00: maskcode = 0x80;Lrotate = 7; break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -