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

📄 t6963lib.c

📁 这个是我写的以t6963为主控芯片的显示屏的程序
💻 C
📖 第 1 页 / 共 2 页
字号:

/************************************************************

                  t6963lib.c
			     t6963子程序库

done by:ldqmoon
2004.12.23

*************************************************************/

/************************************************************

                  头文件包含

************************************************************/
#include "reg31.h"
#include "string.h"
#include "math.h"
#include "hzk16x16.h"
#include "t6963libcon.h"
#include "ctype.h" 
#include "stdio.h"
#include "stdlib.h"


/************************************************************ 

                     数据类型定义 

************************************************************/ 

#define  uchar  unsigned char 
#define  uint   unsigned int 


/************************************************************

                    引线定义

*************************************************************/
#define ReadLine    P12
#define WriteLine   P13
#define CDLine      P10
#define DataPort    P3





/************************************************************ 

                     预编译定义 

************************************************************/ 
/*#define   #ENDIf   
#define   #ENDFor   
#define   #ENDWhile   
#define   #ReturnBack   

/************************************************************ 

                     函数定义 

************************************************************/ 
void InitLCD();                                                        // 初始化显示屏
void ClearScreen(uint ram);                                            // 清屏
void CursorPosSet(unsigned char x,unsigned char y);                    // 设置光标位置
void CursorUp();                                                       // 光标向上移动一格
void CursorDown();                                                     // 光标向下移动一格
void CursorRight();                                                    // 光标向右移动一格
void CursorLeft();                                                     // 光标向左移动一格
void CursorEnter();                                                    // 光标换行
void WriteCmd1(uchar cmd);                                             // 写指令不带参数
void WriteCmd2(uchar dat1,uchar cmd);                                  // 写指令带一个参数
void WriteCmd3(uchar dat1,uchar dat2,uchar cmd);                       // 写指令带两个参数
void WriteData(uchar dat);                                             // 写一个数据
uchar ReadCmd();                                                       // 读数据
uchar ReadState();                                                     // 读当前状态
void RWcheck();                                                        // 读写忙检查
void AutoRcheck();                                                     // 自动读检查
void AutoWcheck();                                                     // 自动写检查
void AutoWchar(char *StringP);                                         // 自动写字符串

void PutPixel(uchar PointX,uchar PointY, bit Mode);                    // 画点
void DrawLine( uchar x1, uchar y1, uchar x2, uchar y2, bit Mode);      // 画线,采用数学计算方式
void DrawBox(uchar X1, uchar Y1, uchar X2, uchar Y2, bit SetReset);    // 画矩形
void ShowPicture(uchar Startline,uchar Startcolumn,uchar LineWidth,uchar ColumnWidth,uchar *PicturePoint);// 画图
void ShowHZ16x16(uchar column,uchar lin,uint hzcode);                  // 显示16x16的汉字
void Show16x16Chars(uchar column,uchar lin,uint hzcode,uint num);      // 显示一行汉字
void ReverseShowChar(uchar column,uchar lin);                          // 反显一个字符
void ReverseShowHZ(uchar column,uchar lin);                            // 反显一个汉字
void ReverseShowChars(uchar column,uchar lin,uchar num);               // 反显一串字符

void Lines(uchar Xa,uchar Ya,uchar Xb,uchar Yb);                       // 第二中画线方式,采用增量方式代码较短
void delay(int d_time);
unsigned char GetKey();
#define WriteSingle() WriteLine=0;WriteLine=1;                  // 读信号



unsigned char MainMenu();
void LoadScreen(uchar i);


/*********************************************************** 
        以8*8字符计算,显示屏横向、纵向可以显示的字符个数 
                       以128*64为例: 
************************************************************/ 
#define LineChar 16                     //一行16个字符(8*8) 
#define ColumnChar 8                   //总共8列 
unsigned char Cursor_X,Cursor_Y;       //光标的坐标 
uchar CtrlData=0; 







/******************************************************************************** 

                    设置液晶显示器数据地址和指令地址 

********************************************************************************/ 
#define GraphAddrL         0x00           // 图形首地址低8位 
#define GraphAddrH         0x02           // 图形首地址高8位 
#define GraphicStartAddr   0x0200         // 图形首地址 
#define TextAddrL          0x00           // 文本首地址低8位 
#define TextAddrH          0x00           // 文本首地址高8位 
#define TextStartAddr      0x00           // 文本首地址 
 

/************************************************************ 

                      指令代码定义 

************************************************************/ 
#define  CursorPointer   0x21         // 光标地址设置 
#define  OffsetReg       0x22         // CGRAM偏移地址设置 
#define  AddrSet         0x24         // 显示地址设置 
#define  TextHomeAddr    0x40         // 文本首地址 
#define  TextArea        0x41         // 文本宽度设置 
#define  GraHomeAddr     0x42         // 图形首地址设置 
#define  GraArea         0x43         // 图形宽度设置 
#define  OrMode          0x80         // 或模式显示 
#define  ExorMode        0x81         // 异或模式显示 
#define  AndMode         0x83         // 与模式显示 
#define  TextAttMode     0x84         // 文本属性模式 
#define  InterCGROM      0            // 内部CGROM 
#define  ExCGRAM         0x08         // 外部CGRAM 
#define  DisplayOff      0x90         // 显示关闭 
#define  CursorOn        0x92         // 光标显示,但不闪烁 
#define  CursorBlink     0x93         // 光标闪烁 
#define  TextOn          0x94         // 文本模式打开 
#define  GraOn           0x98         // 图形模式打开 
#define  TGAllOn         0x9c         // 文本图形模式都打开 
#define  Cursor1         0xa0         // 光标形状一行显示 
#define  Cursor2         0xa1         // 光标形状二行显示 
#define  Cursor3         0xa2         // 光标形状三行显示 
#define  Cursor4         0xa3         // 光标形状四行显示 
#define  Cursor5         0xa4         // 光标形状五行显示 
#define  Cursor6         0xa5         // 光标形状六行显示 
#define  Cursor7         0xa6         // 光标形状七行显示 
#define  Cursor8         0xa7         // 光标形状八行显示 
#define  DataAutoWrite   0xb0         // 数据自动写 
#define  DataAutoRead    0xb1         // 数据自动读 
#define  ExitAutoRW      0xb2         // 退出数据自动读写模式 
#define  DataWAddrI      0xc0         // 数据写,地址加1 
#define  DataWAddrD      0xc2         // 数据写,地址减1 
#define  DataWAddrNV     0xc4         // 数据写,地址不变 
#define  DataRAddrI      0xc1         // 数据读,地址加1 
#define  DataRAddrD      0xc3         // 数据读,地址减1 
#define  DataRAddrNV     0xc5         // 数据读,地址不变 
#define  ScreenPeek      0xe0         // 屏读 
#define  ScreenCopy      0xe1         // 屏拷贝 


#if AutoWcharEnable          // 是否允许自动写
/******************************************************************************** 
函数名: Void AutoWchar(char *StringP)
函数功能: 自动写一组字符,要写入的字符串的指针在StringP中,使用内部CGROM
********************************************************************************/ 
void AutoWchar(char *StringP)
{
    int StringLen;
	int i;
	StringLen=strlen(StringP);
	AutoWcheck();
	WriteCmd1(DataAutoWrite);              //自动写设置
	for(i=0;i<StringLen;i++)
	    WriteData(*(StringP+i));
	WriteCmd1(ExitAutoRW);
}
#endif                     // 是否允许自动写结束


void LoadScreen(unsigned char i)
{
    switch(i){
		case 0:
		case 1:
		case 2:
		case 3:
			ShowHZ16x16(1,0,0x23);           // 1.发新卡
			ShowHZ16x16(3,0,0x2d);
			ShowHZ16x16(5,0,0x05);
			ShowHZ16x16(7,0,0x06);
			ShowHZ16x16(9,0,0x07);

			ShowHZ16x16(1,16,0x24);          // 2.售电
			ShowHZ16x16(3,16,0x2d);
			ShowHZ16x16(5,16,0x08);
			ShowHZ16x16(9,16,0x09);

			ShowHZ16x16(1,32,0x25);         // 3.补发卡
			ShowHZ16x16(3,32,0x2d);
			ShowHZ16x16(5,32,0x0a);
			ShowHZ16x16(7,32,0x05);
			ShowHZ16x16(9,32,0x07);

			ShowHZ16x16(1,48,0x26);        // 4.设定负荷
			ShowHZ16x16(3,48,0x2d);
			Show16x16Chars(5,48,0x0b,4);

			return;

		case 4:
		case 5:
		case 6:
		case 7:
			ShowHZ16x16(1,0,0x27);        // 5.设定分时
			ShowHZ16x16(3,0,0x2d);
			ShowHZ16x16(5,0,0x0b);
			ShowHZ16x16(7,0,0x0c);
			ShowHZ16x16(9,0,0x0f);
			ShowHZ16x16(11,0,0x10);

			ShowHZ16x16(1,16,0x28);        // 6.表箱记录
			ShowHZ16x16(3,16,0x2d);
			Show16x16Chars(5,16,0x11,4);

			ShowHZ16x16(1,32,0x29);        // 7.购电记录
			ShowHZ16x16(3,32,0x2d);
			ShowHZ16x16(5,32,0x15);
			ShowHZ16x16(7,32,0x09);
			ShowHZ16x16(9,32,0x13);
			ShowHZ16x16(11,32,0x14);


			ShowHZ16x16(1,48,0x2a);      // 8.时间校准
    	    ShowHZ16x16(3,48,0x2d);
			ShowHZ16x16(5,48,0x10);
			ShowHZ16x16(7,48,0x16);
			ShowHZ16x16(9,48,0x17);
			ShowHZ16x16(11,48,0x18);
			return;

		case 8:
		case 9:
		case 10:
			ShowHZ16x16(1,0,0x2b);     // 9.数据备份
			ShowHZ16x16(3,0,0x2d);
			Show16x16Chars(5,0,0x19,4);

			ShowHZ16x16(1,16,0x23);    // 10.通讯
			ShowHZ16x16(3,16,0x2c);
			ShowHZ16x16(5,16,0x2d);
			ShowHZ16x16(7,16,0x1d);
		    ShowHZ16x16(9,16,0x1e);

			ShowHZ16x16(1,32,0x23);    // 11.修改密码
			ShowHZ16x16(3,32,0x23);
			ShowHZ16x16(5,32,0x2d);
			ShowHZ16x16(7,32,0x1f);
		    ShowHZ16x16(9,32,0x20);
 		    ShowHZ16x16(11,32,0x03);
			ShowHZ16x16(13,32,0x04);

			ShowHZ16x16(0,48,0x32);   // 空格
			ShowHZ16x16(2,48,0x32);
			ShowHZ16x16(4,48,0x32);
			ShowHZ16x16(6,48,0x32);
			ShowHZ16x16(8,48,0x32);
			ShowHZ16x16(10,48,0x32);
			ShowHZ16x16(12,48,0x32);
			ShowHZ16x16(14,48,0x32);


			return;
	}

}

/******************************************************************************** 
函数名: InitLCD()
函数功能: 初始化显示模块
********************************************************************************/ 
void InitLCD()
{
    
    
    WriteCmd3(0x00,0x00,TextHomeAddr);                //设置文本显示区域首地址GraphAddr 
    WriteCmd3( LineChar,0x00,TextArea );              //设置文本显示区域宽度 : LineChar 
	WriteCmd3( GraphAddrL,GraphAddrH,0x42 );          //设置图形显示区域首地址 
    WriteCmd3( LineChar,0x00,GraArea );               //设置图形显示区域宽度 : LineChar 
    WriteCmd1(OrMode|InterCGROM);                     //设置显示方式: 内部部CGROM方式 文本\图形 或 
    WriteCmd1(Cursor8);                               //设置光标形状 cursor size 8x8 
    WriteCmd3(0x03,0x00,OffsetReg);                   //偏址地址设在0x02 
    WriteCmd1(TGAllOn|CursorBlink);                   //设置显示开关: 1001 1111 图形 
    Cursor_X=Cursor_Y=0x00; 
    CursorPosSet(Cursor_X,Cursor_Y); 
    ClearScreen(0x2000); 

}



/******************************************************************************** 
函数名: Void ClearScreen(unsigned int ram) 
函数功能: 清除整个屏幕 
          ram : 要清零的单元数
********************************************************************************/ 
void ClearScreen(uint ram) 
{ 
    unsigned int i; 
                                                           // 清显示 RAM 区 0000h--2000h (8k) 
    WriteCmd3(0x00,0x00,AddrSet);                          // 设置指针地址0000H 
    WriteCmd1(0xb0);                                       // 设置自动写状态 
    for(i=0x00;i<ram;i++) WriteData(0x00);                 // data=0; 
    WriteCmd1(0xb2);                                       // 自动写结束 

} 


#if PutPixelEnable
/******************************************************************************** 
函数名: Pixel(unsigned char PointX,unsigned char PointY, bit Mode) 
函数功能:图形函数,用于描点画图,在指定位置显示一个点; 
如果显示屏超过了256*256,请修改这个函数 PointX,PointY的类型; 
Mode 1:显示 0:清除该点 
********************************************************************************/ 
void PutPixel(unsigned char PointX,unsigned char PointY, bit Mode) 
{ 
   unsigned int StartAddr=GraphicStartAddr; 
   unsigned char dat; 
   StartAddr+=PointY*LineChar + PointX/8;       // StartAddr=PointY*128 + PointX; 
   dat=0xf0+7-PointX%8;                         // dat=0xf0; 
   if(Mode) dat=dat|0x08;                       // 决定是否显示该点
   WriteCmd3( (unsigned char)(StartAddr),(unsigned char)(StartAddr>>8),AddrSet );    //设置该点所在单元地址 
   WriteCmd1(dat); 
} 
#endif



#if DrawLineEnable      // 是否允许画线
/******************************************************************************** 
函数名:DrawLine( unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, bit Mode) 
函数功能: 画两点的直线 
********************************************************************************/ 
void DrawLine( unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, bit Mode) 
{ 
    unsigned char x,y; 
    float k,b; 
    //y1=128-y1;                                // 坐标变换,可不用
    //y2=128-y2; 
    if( abs(y1-y2) <= abs(x1-x2) ){            // |k|<=1 
        k=(y2*1.0-y1*1.0) / (x2*1.0-x1*1.0) ; 
        b=y1-k*x1; 
        if( x1 <= x2 ) { 
            for(x=x1;x<=x2;x++) { 
                y=k*x+b; 
                PutPixel(x, y, Mode); 
	 	   }
        } f
       else { 
           for(x=x2;x<=x1;x++) { 
               y=k*x+b; 
               PutPixel(x, y, Mode); 
           } 
       } 
    } #ENDIf
    else{                                // abs(y1-y2) > abs(x1-x2) |K|>1 
        k=(float)(x2-x1) / (float)(y2-y1) ; 
        b=x1-k*y1; 
       if( y1 <= y2 ){ 
           for(y=y1;y<=y2;y++) { 
	           x=k*y+b; 
               PutPixel( x , y,Mode); 
           } 
       }#ENDIf 
       else{ 
           for(y=y2;y<=y1;y++) { 
		       x=k*y+b; 
               PutPixel( x , y,Mode); 
           } #ENDFor
       } 
     }   
}#ReturnBack
 
#endif                    // 是否允许画线结束


#if DrawBoxEnable         // 控制是否允许画矩形框
/******************************************************************************** 
函数名:DrawBox(unsigned char X1, unsigned char Y1, unsigned char X2, unsigned char Y2, bit SetReset) 
函数功能:画矩形外框 
********************************************************************************/ 
void DrawBox(unsigned char X1, unsigned char Y1, unsigned char X2, unsigned char Y2, bit SetReset) 
{ 
#if DrawLineEnable                        // 采用第一种画线方式来画矩形
   DrawLine(X1,Y1,X1,Y2, SetReset); 

⌨️ 快捷键说明

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