📄 t6963_driver.c
字号:
#include <string.h>
#include <hzk16.h>
#include <hzk24.h>
#include "common.h"
#define ColumnChar 30 //总共30列
//状态检查函数
//指令,数据读写状态检查
void RWCheck()
{
unsigned char dat;
do
{
dataport=0xff;
LCD_cd=1;
LCD_rd=0;
dat=dataport;
LCD_rd=1;
dat=0x03&dat;//STA0,STA1是否准备好
} while(dat!=0x03);
}
/*
//数据自动读状态检查
void AutoRCheck()
{
unsigned char dat;
do
{
dataport=0xff;
LCD_cd=1;
LCD_rd=0;
dat=dataport;
LCD_rd=1;
dat=0x04&dat;//STA2是否准备好
} while(dat==0x00);
}
*/
//数据自动写状态检查
void AutoWCheck(void)
{
unsigned char dat;
do
{
dataport=0xff;
LCD_cd=1;
LCD_rd=0;
dat=dataport;
LCD_rd=1;
dat=0x08&dat;//STA3是否准备好
} while(dat==0x00);
}
//读数据
unsigned char InPortData()
{
unsigned char dat;
RWCheck();
LCD_cd=0;
dataport=0xff;
LCD_rd=0;
dat=dataport;
LCD_rd=1;
return(dat);
}
//向数据口发Data
void OutPortData(dat)
{
RWCheck();
LCD_cd=0;
dataport=dat;
LCD_wr=0;
LCD_wr=1;
}
//写有1个参数命令
void OutPortCom1(command)
{
RWCheck();
LCD_cd=1;
dataport=command;
LCD_wr=0;
LCD_wr=1;
}
//写有2个参数命令
void OutPortCom2(dat, command)
{
OutPortData(dat);
OutPortCom1(command);
}
//写有3个参数命令
void OutPortCom3(data1, data2, command)
{
OutPortData(data1);
OutPortData(data2);
OutPortCom1(command);
}
//显示8*16字符(8列16行)(图形显示方式)
//ch:字符代码(标准ASCII码)
void ShowChar(unsigned char lin,unsigned char column,unsigned char ch)
{
unsigned char i,j;
unsigned int StartAddr;
LCM_CE=0;///
StartAddr=(lin*480)+column; //定位起始行
for(j=0;j<ASC_MAX;j++)
{
if(ASCII_index[j]==ch)
{
break;
}
}
for(i=0;i<16;i++)
{
OutPortCom3((unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24); //set address
OutPortCom2(ASCII816[j][i], 0xc4);
StartAddr=StartAddr + ColumnChar;
}
LCM_CE=1;///
}
//显示12*24点阵电流值
//type为1显示当前值,为0显示给定值
//n为电流,0-99999,n为65535则不显示void ShowCurrent(unsigned char type,unsigned int n,bit Down_Line)
{
unsigned char i,j,k;
unsigned int StartAddr;
unsigned char xdata font_temp[216];
LCM_CE=0;///
k=0;
for(j=0;j<216;j++) font_temp[j]=0;
if(n/10000)
{
for(j=0;j<24;j++) font_temp[k++]=ASCII1224[n/10000][j*2];
for(j=0;j<24;j++) font_temp[k++]=ASCII1224[n/10000][j*2+1];
k-=24;
}
else k=24;
if(n/1000)
{
for(j=0;j<24;j++) font_temp[k++]+=ASCII1224[n%10000/1000][j*2]/16;
for(j=0;j<24;j++) font_temp[k++]=ASCII1224[n%10000/1000][j*2]%16*16;
k-=24;
for(j=0;j<24;j++) font_temp[k++]+=ASCII1224[n%10000/1000][j*2+1]/16;
}
else k+=48;
if(n/100)
{
for(j=0;j<24;j++) font_temp[k++]=ASCII1224[n%1000/100][j*2];
for(j=0;j<24;j++) font_temp[k++]=ASCII1224[n%1000/100][j*2+1];
k-=24;
}
else k+=24;
if(n/10)
{
for(j=0;j<24;j++) font_temp[k++]+=ASCII1224[n%100/10][j*2]/16;
for(j=0;j<24;j++) font_temp[k++]=ASCII1224[n%100/10][j*2]%16*16;
k-=24;
for(j=0;j<24;j++) font_temp[k++]+=ASCII1224[n%100/10][j*2+1]/16;
}
else k+=48;
for(j=0;j<24;j++) font_temp[k++]=ASCII1224[n%10][j*2];
for(j=0;j<24;j++) font_temp[k++]=ASCII1224[n%10][j*2+1];
k-=24;
for(j=0;j<24;j++) font_temp[k++]+=ASCII1224[10][j*2]/16;
for(j=0;j<24;j++) font_temp[k++]=ASCII1224[10][j*2]%16*16;
k-=24;
for(j=0;j<24;j++) font_temp[k++]+=ASCII1224[10][j*2+1]/16;
if(n==65535) for(i=0;i<216;i++) font_temp[i]=0; //不显示
if (type==1) StartAddr=486;
else StartAddr=1206;
if(type==0 && Down_Line)
{
for(i=22;i<216;i+=24) font_temp[i]=0xff;
for(i=23;i<216;i+=24) font_temp[i]=0xff;
}
for(i=0;i<24;i++)
{
OutPortCom3((unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24);
for(j=0;j<9;j++) OutPortCom2(font_temp[i+24*j], 0xc0);
StartAddr=StartAddr + ColumnChar;
}
LCM_CE=1;///
}
//显示12*24点阵电压值
//type为1显示当前值,为0显示给定值
//n为电压,0-999,n为65535则不显示
//Down_Line为1,显示下划线,为0不显示
void ShowVoltage(unsigned char type,unsigned int n,bit Down_Line)
{
unsigned char i,j,k;
unsigned int StartAddr;
unsigned char xdata font_temp[144];
LCM_CE=0;///
for(i=0;i<144;i++) font_temp[i]=0;
k=0;
// if(type==0 && Modi_Preset_value_via_Key && n<100) n*=10;
if(n/100)
{
for(j=0;j<24;j++) font_temp[k++]=ASCII1224[n%1000/100][j*2];
for(j=0;j<24;j++) font_temp[k++]=ASCII1224[n%1000/100][j*2+1];
k-=24;
}
else k=24;
if(n/10)
{
for(j=0;j<24;j++) font_temp[k++]+=ASCII1224[n%100/10][j*2]/16;
for(j=0;j<24;j++) font_temp[k++]=ASCII1224[n%100/10][j*2]%16*16;
k-=24;
for(j=0;j<24;j++) font_temp[k++]+=ASCII1224[n%100/10][j*2+1]/16;
}
else k+=48;
for(j=0;j<24;j++) font_temp[k++]=ASCII1224[n%10][j*2];
for(j=0;j<24;j++) font_temp[k++]=ASCII1224[n%10][j*2+1];
k-=24;
for(j=0;j<24;j++) font_temp[k++]+=ASCII1224[11][j*2]/16;
for(j=0;j<24;j++) font_temp[k++]=ASCII1224[11][j*2]%16*16;
k-=24;
for(j=0;j<24;j++) font_temp[k++]+=ASCII1224[11][j*2+1]/16;
if(n==65535) for(i=0;i<144;i++) font_temp[i]=0; //不显示
if (type==1) StartAddr=504;
else StartAddr=1224;
if(type==0 && Down_Line)
{
for(i=22;i<144;i+=24) font_temp[i]=0xff;
for(i=23;i<144;i+=24) font_temp[i]=0xff;
}
for(i=0;i<24;i++)
{
OutPortCom3((unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24);
for(j=0;j<6;j++) OutPortCom2(font_temp[i+24*j], 0xc0);
StartAddr=StartAddr + ColumnChar;
}
LCM_CE=1;///
}
//显示一个汉字(16*16点阵) (图形方式显示)
//lin:行(0-7), column: 列(0-15)
//hzcode: 汉字代码(自定义的)
void ShowHZ(unsigned char lin,unsigned char column,unsigned char hzcode_msb,unsigned char hzcode_lsb)
{
unsigned char i,j;
unsigned int StartAddr;
LCM_CE=0;///
StartAddr=(lin*480)+column; //定位起始行(括号中相当于lin*ColumnChar*16)
for(j=0;j<HZ_MAX;j++)
{
if(HZ_index[j*2]==hzcode_msb && HZ_index[j*2+1]==hzcode_lsb)
{
break;
}
}
for(i=0;i<16;i++)
{
OutPortCom3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24);
OutPortCom2( HZ_Tab[j][i*2], 0xc0); //左半部 地址加一
OutPortCom2( HZ_Tab[j][i*2+1], 0xc4); //右半部 字模地址不变
StartAddr=StartAddr + ColumnChar;
}
LCM_CE=1;///
}
//显示一行字符串(汉字,字母混排)
void ShowLine(unsigned char lin,unsigned char column,unsigned char *puts)
{
unsigned char j,byte,k,len;
len=strlen(puts);
for (k=column,j=0;j<len;j++)
{
byte = puts[j];
if (byte&0x80) //汉字
{
ShowHZ(lin,k,byte,puts[j+1]);
j++;
k=k+2;
}
else //字母
{
//if(byte!=' ')
ShowChar(lin,k,byte);
k=k+1;
}
}
}
/*
//反显一个字符
void ReverseShowChar(unsigned char lin,unsigned char column)
{
unsigned char i;
unsigned char dat;
unsigned int StartAddr;
StartAddr=(lin*480) +column; //定位起始行
for(i=0;i<16;i++)
{
OutPortCom3((unsigned char)(StartAddr),(unsigned char)(StartAddr>>8),0x24); //set address
OutPortCom1(0xc5 ); //数据一次读,地址不变
dat=InPortData(); //读入数据
dat=~dat; //取反
OutPortCom2(dat,0xc4); //送回
StartAddr=StartAddr+ ColumnChar;
}
}
void ReverseShowLine(unsigned char x0,unsigned char x1,unsigned char lin)
{
unsigned char column;
for(column=x0; column<x1; column++) ReverseShowChar(lin,column);
}
*/
//反显一行
//lin:反白行(0-7)
//x0:反白起始列,x1:反白终止列
void ReverseShowLine(unsigned char x0,unsigned char x1,unsigned char line)
{
unsigned char i,j;
unsigned char dat;
unsigned int StartAddr;
StartAddr=(line*480)+x0; //定位起始行
LCM_CE=0;///
for(j=0;j<16;j++)
{
OutPortCom3((unsigned char)(StartAddr),(unsigned char)(StartAddr>>8),0x24); //set address
for(i=0;i<10;i++);
for(i=0;i<x1-x0;i++)
{
OutPortCom1(0xc5 ); //数据一次读,地址不变
dat=InPortData(); //读入数据
dat=~dat; //取反
OutPortCom2(dat,0xc0); //数据写,地址加一
}
StartAddr=StartAddr+ColumnChar ;
}
LCM_CE=1;///
}
//显示汉字(24*24点阵)
void ShowHZ24(unsigned char x,unsigned char y,unsigned char n)
{
unsigned char i;
unsigned int StartAddr;
StartAddr=(y*30)+x/8;
LCM_CE=0;///
for(i=0;i<24;i++)
{
OutPortCom3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24);
OutPortCom2( HZ24_Tab[n][i*3], 0xc0);
OutPortCom2( HZ24_Tab[n][i*3+1], 0xc0);
OutPortCom2( HZ24_Tab[n][i*3+2], 0xc4);
StartAddr=StartAddr + ColumnChar;
}
LCM_CE=1;///
}
//清屏
void ClearScreen()
{
unsigned int i;
LCM_CE=0;///
//清显示 RAM 区 0000h--2000h (8k)
OutPortCom3(0x00,0x00,0x24); //设置指针地址0000H
OutPortCom1(0xb0); //设置自动写状态
for(i=0;i<8200;i++)
{
AutoWCheck();
OutPortData(0x00);
}
AutoWCheck();
OutPortCom1(0xb2); // 自动写结束
LCM_CE=1;///
}
//初始化LCD
void InitLCD()
{
LCM_CE=0;
LCD_cd=1;
LCD_wr=1;
LCD_rd=1;
OutPortCom3(0x00,0x00,0x42);
OutPortCom3(0x1e,0x00,0x43);
// OutPortCom1(0xa7); //设置光标形状 cursor size 8x8(好像无用)
OutPortCom1(0x80); //设置显示方式: CGROM方式 文本\图形 "或"
OutPortCom1(0x98); //设置显示开关: 1001 1000 只开图形显示
ClearScreen();
LCM_CE=1;///
}
/*
//画线
//x:0-239
//y:0-127
void Draw_Line(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1)
{
unsigned int Add;
unsigned char i,j;
unsigned char dat;
if(y0==y1) //横线
{
x1+=1;
Add=y0*30+x0/8;
OutPortCom3((unsigned char)(Add), (unsigned char)(Add>>8), 0x24); //set address
for(i=0;i<10;i++); //delay
OutPortCom1(0xc5 ); //数据一次读,地址不变
dat=InPortData(); //读入数据
switch(x0%8)
{
case 1: OutPortCom2(dat|0x7f, 0xc0); break;
case 2: OutPortCom2(dat|0x3f, 0xc0); break;
case 3: OutPortCom2(dat|0x1f, 0xc0); break;
case 4: OutPortCom2(dat|0x0f, 0xc0); break;
case 5: OutPortCom2(dat|0x07, 0xc0); break;
case 6: OutPortCom2(dat|0x03, 0xc0); break;
case 7: OutPortCom2(dat|0x01, 0xc0); break;
}
for(i=(x0+7)/8*8;i<x1/8*8;i+=8) OutPortCom2(0xff, 0xc0);
OutPortCom1(0xc5 ); //数据一次读,地址不变
dat=InPortData(); //读入数据
switch(x1%8)
{
case 1: OutPortCom2(dat|0x80, 0xc0); break;
case 2: OutPortCom2(dat|0xc0, 0xc0); break;
case 3: OutPortCom2(dat|0xe0, 0xc0); break;
case 4: OutPortCom2(dat|0xf0, 0xc0); break;
case 5: OutPortCom2(dat|0xf8, 0xc0); break;
case 6: OutPortCom2(dat|0xfc, 0xc0); break;
case 7: OutPortCom2(dat|0xfe, 0xc0); break;
}
}
if(x0==x1)
{
for(j=y0;j<=y1;j++)
{
Add=j*30+x0/8;
OutPortCom3((unsigned char)(Add), (unsigned char)(Add>>8), 0x24); //set address
for(i=0;i<10;i++); //delay
OutPortCom1(0xc5 ); //数据一次读,地址不变
dat=InPortData(); //读入数据
switch(x0%8)
{
case 0: OutPortCom2(dat|0x80, 0xc0); break;
case 1: OutPortCom2(dat|0x40, 0xc0); break;
case 2: OutPortCom2(dat|0x20, 0xc0); break;
case 3: OutPortCom2(dat|0x10, 0xc0); break;
case 4: OutPortCom2(dat|0x08, 0xc0); break;
case 5: OutPortCom2(dat|0x04, 0xc0); break;
case 6: OutPortCom2(dat|0x02, 0xc0); break;
case 7: OutPortCom2(dat|0x01, 0xc0); break;
}
}
}
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -