📄 display.c
字号:
//##############################################################################
// 液晶控制操作单元
//##############################################################################
#include <msp430x16x.h>
#include "math.h"
#include "asc_cosd.h"
#include "display.h"
#define Uchar unsigned char //变量类型标识的宏定义
#define Uint unsigned int
unsigned int lcmcp,lcmdp;
//==============================================================================
//显示缓存分配
#define BasePart1 0x00 //第一屏地址 0X0000 占用8K空间
#define BasePart2 0x40 //第二屏地址 0X4000 占用8K空间
#define BasePart3 0x80 //第三屏地址 0X8000 占用2K空间
#define BasePart4 0x00 //第四屏地址 0X0000 占用2K空间
//==============================================================================
//初始化参数配置数组
Uchar const ParaSysTable8[]= { 0x30,0x87,0x07,0x27,0x42,0xf0,0x28,0x00};
Uchar const ParaScrTableA[]= //{0x00,BasePart1,0xF0,0x00,BasePart2,0xF0,0x00,BasePart3,0x00,BasePart4};
{0x0000,0x0000,0x00F0,0x00b0,0x0004,0x00F0,0x0000,0x0000,0x0000,0x0000};
//{0x00,0x00,0xef,0xb0,0x04,0xef,0x00,0x00,0x00,0x00};
#define SystemSet 0x40 //1335控制器定义
#define Scroll 0x44
#define SleepIn 0x53
#define DispOn 0x59
#define DispOff 0x58
#define Ovlay 0x5b
#define HdotScr 0x5a
#define CsrForm 0x5d
#define CgramAdr 0x5c
#define CsrDirR 0x4c
#define CsrDirL 0x4d
#define CsrDirU 0x4e
#define CsrDirD 0x4f
#define CsrW 0x46
#define CsrR 0x47
#define mWrite 0x42
#define mRead 0x43
#define Busy 0x40 // 忙状态标志位0b0100 0000
#define paraP9 0x28 // 相对于320 X 240
//##############################################################################
//**********************************************/
// 接口设置
// 8位数据 :(DB0--DB7)
// 输出口 :
// 控制信号:(/RES,/A0,/CS,/WR,/RD)
// 输出口:
//**********************************************/
void lcd_init_io(void)
{
// WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗
KONGZHI_DIR = 0xff; //控制信号 /RES,C/D,CE,/WR,/RD
KONGZHI_OUT = 0xff;
SHUJU_DIR = 0xff; //数据端口 P6.0~P6.7 DB0~DB7
SHUJU_OUT = 0xff;
}
//***************************************************************************/
void Reset_lcd(void)
{
unsigned int i;
//------------------------------
//8080方式
RES_L; //reset=0
//------------------------------
for(i=100;i>0;i--)
{
_NOP();
}
RES_H; //reset=1
}
//***************************************************************************/
// clear textram
// 清除文本区
//***************************************************************************/
void clr_textram(void)
{
unsigned int i;
WriteCommand(0x4c); // Set direction of cursor movement
WriteCommand(0x46); // Set cursor address
WriteData(0);
WriteData(0);
WriteCommand(0x42); // Write to display memory
for(i=0;i<1200;i++)
{
WriteData(0x00); // 文本区写数据 空格符
}
}
//***************************************************************************/
// clear graphics ram
// 清除图形区
//***************************************************************************/
void clr_grphram(void)
{
unsigned int i;
WriteCommand(0x4c); // Set direction of cursor movement
WriteCommand(0x46); // Set cursor address
WriteData(0xb0);
WriteData(0x04);
WriteCommand(0x42); //Write to display memory
for(i=0;i<9600;i++)
{
WriteData(0x00); // 文本区写数据 空格符
}
}
//***************************************************************************/
// LcmInition
// 液晶初始化
//***************************************************************************/
void LcmInition(void)
{
unsigned int i;
Reset_lcd();
//---------------------------------
WriteCommand(0x40); // Initialize device and display
for(i=0;i<8;i++)
{
WriteData(ParaSysTable8[i]); // 写系统设置数据
}
WriteCommand(0x44); // Set display start address and display regions
for(i=0;i<10;i++)
{
WriteData(ParaScrTableA[i]); // 写显示控制数据
}
WriteCommand(0x5a); // Set horizontal scroll position
WriteData(0x00);
WriteCommand(0x5b); // Set display overlay format
WriteData(0x00);
clr_textram();
clr_grphram();
WriteCommand(0x59); //???? 58 Enable display flashing; 59 Disable display flashing
WriteData(0x14); // text graph on 04
//-----------------------------------
}
//################函数2.写参数及显示数据子程序#############################
//
// 写参数及显示数据子程序
//入口参数:dataW 将数据dataW 写入SED1335
//*******************************************************
void WriteData( Uchar dataW ) {
CS1335_0; /*CS_0for430*/
A01335_0; /*A0_0for430*/
RD1335_1; /*RD_1for430*/
WR1335_0; /*WR_0for430*/
SHUJU_OUT=dataW;
WR1335_1;
A01335_1;
CS1335_1;
}
//################函数3.读参数及显示数据子程序#############################
//
// 读参数及显示数据子程序
// 读出的参数 LcmRdataPort
//******************************************************
Uchar ReadDataLcm( void )
{
Uchar readdata1335;
P4DIR=0x00;
CS1335_0;
A01335_1;
WR1335_1;
RD1335_0;
readdata1335=SHUJU_IN;
RD1335_1;
A01335_1;
CS1335_1;
P4DIR=0xff;
return readdata1335;
}
//################函数4. 写指令代码子程序##################################
//
// 写指令代码子程序
//入口参数:CommandByte 将指令CommandByte写入SED1335
//******************************************************
void WriteCommand( Uchar CommandByte ) {
CS1335_0; /*CS_0for430*/
A01335_1; /*A0_1for430*/
RD1335_1; /*RD_1for430*/
WR1335_0; /*WR_0for430*/
SHUJU_OUT=CommandByte;
WR1335_1;
CS1335_1;
}
//################函数5.延时子程序#########################################
//延时子程序1
//短暂延时参数tt
void Delay( Uint tt ) {
while( tt-- );
}
//################函数6.长延时程序#########################################
// 延时程序2
// 参数:count
// 延时: 1MS *COUNT
void DelayMs(Uint count)
{
Uint i,j;
for(i=0;i<count;i++)
for(j=0;j<120;j++)
;
}
//################函数8. 清显示 32K RAM区(清屏)子程序######################
// 清显示 32K RAM区(清屏)子程序
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( 0x0 ); // 写入数据0
}
}
//#############################################################################################
// 滚动演示程序段 (包含向上,向下,向左,向右四个函数)
// 使用SED1335 等的屏幕滚动功能, 可以实现逐点滚动的显示效果. 这个效果的实现, 在
// 水平方向是依赖于指令HDOT SET的支持. 下面的演示程序中看到HDOT SET指令的使用方法.
// 参数说明:V控制移动的速度。 tt控制移动的幅度
// 横向移动的时候 tt控制移动的字节数目 纵向移动tt控制移动的点行数
//
//################函数15.滚动往左##########################
// 第一显示区向左滚动
//V控制移动的速度。 tt控制移动的幅度 横向移动的时候 tt控制移动的字节数目
void RollLaft( Uchar v,Uchar tt ) {
Uchar tempI,jj=tt;
Uint iTemp=0;
while(jj--) {
for(tempI=0;tempI<8;tempI++) {
WriteCommand( HdotScr ); // 写入HDOT SET 指令
WriteData( tempI ); // 写入参数
DelayMs(v); // 调延时子程序
}
iTemp ++;
}
// WriteCommand( Scroll ); // 设定显示区域起始地址
// WriteData( (Uchar)(iTemp &amt; 0xff) ); // 写入参数
// WriteData( (Uchar)(iTemp /256) ); // 写入参数
}
//#################函数16.滚动往右######################
// 第一显示区向右滚动
//V控制移动的速度。 tt控制移动的幅度 横向移动的时候 tt控制移动的字节数目
void Rollright( Uchar v,Uchar tt ) {
Uchar tempI,jj=tt;
Uint iTemp=24;
while(jj--) {
tempI = 8;
WriteCommand( Scroll ); // 显示区域(起点)设置
WriteData( (Uchar)(iTemp & 0xff) ); // 写入参数
WriteData( (Uchar)(iTemp /256) ); // 写入参数
while( tempI-- ) {
WriteCommand( HdotScr ); // 写入HDOT SET 指令
WriteData( tempI ); // 写入参数
DelayMs(v); // 调延时子程序
}
iTemp--;
}
}
//##################函数17.滚动往下##########################
// 第一显示区向下滚动
//V控制移动的速度。 tt控制移动的幅度 纵向移动tt控制移动的点行数
void RollDown( Uchar v,Uchar tt ) {
Uchar jj = tt; // 演示32次
Uint iTemp=paraP9*50;
while(jj--) {
iTemp -= paraP9;
WriteCommand( Scroll ); // 设定显示区域起始地址
WriteData( (Uchar)(iTemp & 0xff) ); // 写入参数
WriteData( (Uchar)(iTemp /256) ); // 写入参数
DelayMs(v); // 调延时子程序
}
WriteCommand( Scroll ); // 设定显示区域起始地址
WriteData( 0 ); // 写入参数
WriteData( 0 ); // 写入参数
DelayMs(30);
}
//#####################函数18.向上滚动#########################
// 第一显示区向上滚动
//V控制移动的速度。 tt控制移动的幅度 纵向移动tt控制移动的点行数
void RollUp( Uchar v,Uchar tt ) {
Uint iTemp=0;
Uchar jj = tt; // 演示30次
while(jj--) {
iTemp += paraP9;
WriteCommand( Scroll ); // 设定显示区域起始地址
WriteData( (Uchar)(iTemp&0xff) ); // 写入参数
WriteData( (Uchar)(iTemp /256) ); // 写入参数
DelayMs(v); // 调延时子程序
}
WriteCommand( Scroll ); // 设定显示区域起始地址
WriteData( 0 ); // 写入参数
WriteData( 0 ); // 写入参数
DelayMs(30);
}
//***************************************************************************/
void wr_cmd_2(unsigned int uCmd,unsigned int uPar) // 带两个参数的命令
{
lcmcp=uCmd;
WriteCommand(lcmcp);
lcmdp= uPar&0xff;
WriteData(lcmdp);
lcmdp=uPar>>8;
lcmdp&=0x00ff;
WriteData(lcmdp);
}
//***************************************************************************/
void wr_cmd_1(unsigned int uCmd,unsigned int uPar) // 带一个参数的命令
{
lcmcp=uCmd;
WriteCommand(lcmcp);
lcmdp= uPar;
WriteData(lcmdp);
}
//***************************************************************************/
void wr_cmd_0(unsigned int uCmd) // 不带带参数的命令
{
lcmcp=uCmd;
WriteCommand(lcmcp);
}
//***************************************************************************/
//***************************************************************************/
void char_addr_point_set( unsigned int urow,unsigned int ucol)
{
unsigned int ipos;
ipos=urow*40+ucol+1200;
wr_cmd_0(0x004c);
wr_cmd_2(0x0046,ipos);
}
//***************************************************************************/
void showchar8(unsigned int row,unsigned int col,unsigned int chp,unsigned int attribute)
{// row:显示行 col:显示列 chp:显示第几个字. attribute:反色。1:显示字黑,0显示字白
unsigned int j,char_data;
const unsigned int *p;
p=&HZ8_DOT_LIB[0];
chp=chp*16;
p=p+chp; //指针指向显示数字的地址
col/=8;
//----------------------------------------
// 显示中文
//----------------------------------------
if(attribute)
{
for(j=0;j<16;j++)
{
char_addr_point_set(row,col); //设置Vram地址
WriteCommand(0x0042);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -