⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd_api.h

📁 采用T6963显示的12864液晶C语言程序
💻 H
📖 第 1 页 / 共 2 页
字号:
#include <absacc.h>
#include <stdarg.h>
#include <stdio.h>
#include <intrins.h>
#include <string.h>
#include"picture.h"
#include"character.h"
#include"lcd.h"
// ASCII字符控制代码解释定义
#define ulong	unsigned long
#define uint	unsigned int
#define uchar	unsigned char

// ASCII字符控制代码解释定义
#define STX	0x02
#define ETX	0x03
#define EOT	0x04
#define ENQ	0x05
#define BS	0x08
#define CR	0x0D
#define LF	0x0A
#define DLE	0x10
#define ETB	0x17
#define SPACE	0x20
#define COMMA	0x2C
#define TEXT_ADDR	0x0400

#define TRUE	1
#define FALSE	0
#define HIGH	1
#define LOW	0

// T6963C 端口定义由汇编语言程序定义外部端口
#define  LCMDW   XBYTE[0xc000]     //0xf000 数据口
#define  LCMCW   XBYTE[0xc001]     //0xf001 命令口

// T6963C 命令定义
#define LC_CUR_POS	0x21	   // 光标位置设置
#define LC_CGR_POS	0x22	   // CGRAM偏置地址设置
#define LC_ADD_POS	0x24	   // 地址指针位置
#define LC_TXT_STP	0x40	   // 文本区首址
#define LC_TXT_WID	0x41	   // 文本区宽度
#define LC_GRH_STP	0x42	   // 图形区首址
#define LC_GRH_WID	0x43	   // 图形区宽度
#define LC_MOD_OR	0x80	   // 显示方式:逻辑“或”
#define LC_DIS_SW	0x90	   // 显示开关:D0=1/0:光标闪烁启用/禁用;(低位)
				   // D1=1/0:光标显示启用/禁用;
				   // D2=1/0:文本显示启用/禁用;
				   // D3=1/0:图形显示启用/禁用;(高位)
#define LC_CUR_SHP	0xA0	   // 光标形状选择:0xA0-0xA7表示光标占的行数
#define LC_AUT_WR	0xB0	   // 自动写设置
#define LC_AUT_RD	0xB1	   // 自动读设置
#define LC_AUT_OVR	0xB2	   // 自动读/写结束
#define LC_INC_WR	0xC0	   // 数据一次写,地址加1
#define LC_INC_RD	0xC1	   // 数据一次读,地址加1
#define LC_DEC_WR	0xC2	   // 数据一次写,地址减1
#define LC_DEC_RD	0xC3	   // 数据一次读,地址减1
#define LC_NOC_WR	0xC4	   // 数据一次写,地址不变
#define LC_NOC_RD	0xC5	   // 数据一次读,地址不变
#define LC_SCN_RD	0xE0	   // 屏读
#define LC_SCN_CP	0xE8	   // 屏拷贝
#define LC_BIT_OP	0xF0	   // 位操作:
				   // D0-D2:定义D0-D7位;D3:1置位;0:清除



uchar gCurRow,gCurCol;   // 当前行、列存储,行高16点,列宽8点

/*  取当前行数据  */
uchar fnGetRow(void)
{
         return gCurRow;
}
/*  取当前列数据  */
uchar fnGetCol(void)
{
         return gCurCol;
}
/***********************************************/
/* 状态位判断STA1,STA0(读写指令和读写数据)   */
/*在读写数据或者写入命令之前必须保证为1        */
/***********************************************/
uchar fnSTA01(void)
{
        uchar i;
        for(i=10;i>0;i--)
        {
              if((LCMCW & 0x03)==0x03)             //读取状态
                    break;
        }
        return i;
        //若返回0,说明错误
}
/**********************************************/
/* 检查STA2,如果STA2=1,为自动读状态        */
/**********************************************/
uchar fnSTA2(void)
{
        uchar i;
        for(i=10;i>0;i--)
        {
             if((LCMCW & 0x04)==0x04)
                  break;
        }
        return i;
        //若返回0,说明错误
}
/**********************************************/
/* 检查STA3,如果STA3=1,为自动写状态          */
/**********************************************/
uchar fnSTA3(void)
{
        uchar i;
        for(i=10;i>0;i--)
        {
             if((LCMCW & 0x08)==0x08)
                  break;
        }
        return i;
        //若返回0,说明错误
}
/**********************************************/
/* 检查STA6,如果STA6=1,为屏读/屏写状态      */
/**********************************************/
uchar fnSTA6(void)
{
        uchar i;
        for(i=10;i>0;i--)
        {
             if((LCMCW & 0x40)==0x40)
                  break;
        }
        return i;
        //若返回不为0,说明错误
}
/***********************************************/
/* 写双参数指令                                */
/***********************************************/
uchar fnPR1(uchar uCmd,uchar uPar1,uchar uPar2)
{
       if(fnSTA01()==0)
             return 1;
       LCMDW = uPar1;
       if(fnSTA01()==0)
             return 2;
       LCMDW = uPar2;
       if(fnSTA01()==0)
             return 3;
       LCMCW = uCmd;
       return 0;         //若返回0,说明成功
}
/***********************************************/
/* 写单参数指令                                */
/***********************************************/
uchar fnPR11(uchar uCmd,uchar uPar1)
{
       if(fnSTA01()==0)
             return 1;
       LCMDW = uPar1;
       if(fnSTA01()==0)
             return 2;
       LCMCW = uCmd;
       return 0;         //若返回0,说明成功
}
/***********************************************/
/* 写无参数指令                                */
/***********************************************/
uchar fnPR12(uchar uCmd)
{
       if(fnSTA01()==0)
             return 1;
       LCMCW = uCmd;
       return 0;         //若返回0,说明成功
}
/***********************************************/
/* 写数据                                      */
/***********************************************/
uchar fnPR13(uchar uData)
{
       if(fnSTA3()==0)
             return 1;
       LCMDW = uData;
       return 0;         //若返回0,说明成功
}
/***********************************************/
/* 读数据                                      */
/***********************************************/
uchar fnPR2(void)
{
       if(fnSTA01()==0)
             return 1;
       return LCMDW;         //返回数据
}
/***********************************************/
/* 设置当前地址                                */
/***********************************************/
void fnSetPos(uchar urow,uchar ucol)
{
       uint iPos;
       iPos=urow*16+ucol;
       fnPR1(LC_ADD_POS,iPos&0xff,iPos/256);
       gCurRow=urow;
       gCurCol=ucol;
}
/***********************************************/
/* 设置当前显示行,列                          */
/***********************************************/
void cursor(uchar uRow,uchar uCol)
{
       fnSetPos(uRow*16,uCol);
}
/***********************************************/
/* 清屏                                        */
/***********************************************/
void cls(void)
{
       uint i;
       fnPR1(LC_ADD_POS,0x00,0x00);     //置地址指针为从0开始
       fnPR12(LC_AUT_WR);               //自动写
       for(i=0;i<128*64/8+128;i++)      //清一屏
       {
              fnSTA3();
              fnPR13(0x00);             //写数据
       }
       fnPR12(LC_AUT_OVR);              //自动写结束
       fnPR1(LC_ADD_POS,0x00,0x00);     //重置地址指针
       gCurRow=0;                       //置地址指针存储变量
       gCurCol=0;
}
/***********************************************/
/* 初始化                                      */
/***********************************************/
char  fnLCMInit(void)
{
       fnPR1(LC_TXT_STP,TEXT_ADDR&0xff,TEXT_ADDR/256);  //文本显示区首地址
       fnPR1(LC_TXT_WID,0x10,0x00);         //文本显示区宽度
       fnPR1(LC_GRH_STP,0x00,0x00);         //图形显示区首地址
       fnPR1(LC_GRH_WID,0x10,0x00);         //图形显示区宽度
       fnPR12(LC_CUR_SHP|0x00);				//光标形状
	//   fnPR1(LC_CUR_POS,0x00,0x00);         //光标位置    
       fnPR12(LC_DIS_SW|0x0c);              //显示开关设置
       fnPR12(LC_MOD_OR);
	   cls();                   //显示方式设置
       return 0;
}
/***********************************************/
/* 延时                                        */
/***********************************************/
void shortdelay(uint tt)
{
      uchar i;
      while(tt)
      {
           i=100;
           while(i) i--;
           tt--;
      };

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -