📄 t6963.c
字号:
#include <REG52.h>
#include "T6963.h"
#include "ZK.h"
#include <stdarg.h>
#include <stdio.h>
#include <absacc.h>
#define D12_DATA 0xf002
#define D12_COMMAND 0xf003
#define inportb(X) *((unsigned char xdata *) X)
#define outportb(X,Y) *((unsigned char xdata *) X) = Y
/**************************************
T6963驱动程序
*************************************/
#define LCMDW XBYTE[0x9000] /*定义数据口*/
#define LCMCW XBYTE[0x9001] /*定义指令口*/
// 状态位STA1,STA0判断(读写指令和读写数据)
#define RWCheck(){ uchar i; for(i=10;i>0;i--) { if((LCMCW & 0x03) == 0x03) break;}}
// 状态位ST2判断(数据自动读状态)
#define AutoRCheck(){ uchar i; for(i=10;i>0;i--) { if((LCMCW & 0x04) == 0x04) break;}}
// 状态位ST3判断(数据自动写状态)
#define AutoWCheck(){ uchar i; for(i=10;i>0;i--) { if((LCMCW & 0x08) == 0x08) break;}}
/* 控制指令 */
#define ctrl(command) { RWCheck(); LCMCW= command; }
/* 写数据 */
#define write(dat ) { RWCheck(); LCMDW=dat; }
/* 自动写 */
#define autowrite(dat) { AutoWCheck();LCMDW=dat;}
/* 显示图形和文本 */
void disp(unsigned char d) { /*显示*/
write(d);ctrl(0xc0);
}
/* 设定图形x,y值*/
void ag(unsigned char x,unsigned char y) { /*地址*/
unsigned int xy;
//xy=y;
//xy=xy*16+x+256;
xy=y*30+x;
write(xy);
write((unsigned char)(xy>>8));
ctrl(0x24);
//write(xy&0xff);write(xy/256);ctrl(0x24);
}
/* 点亮一点 */
void setb(unsigned char d) {
ctrl(0xf8|d);
}
/* x,y处显示光标 */
void ab(unsigned char x,unsigned char y) { /*光标*/
ctrl(0x9f); /*光标开*/
write(x);write(y);ctrl(0x21);
}
/* 取消光标 */
void noab(void) {
ctrl(0x9c);
}
/* lcd初始化 */
void T6963_init(void) {
unsigned int i;
write(0x0);write(0x08);ctrl(0x40); /*文本首址,与图形区域分开*/
write(16);write(0x0);ctrl(0x41); /*文本区域*/
write(0x0);write(0x0);ctrl(0x42); /*图形首址*/
write(30);write(0x0);ctrl(0x43); /*图形区域*/
ctrl(0x81); /*显示方式*/
ctrl(0x9f); /*显示开关*/
ctrl(0xa1); /*光标形状*/
write(0);write(0);ctrl(0x24);
ctrl(0xb0); /*自动写方式*/
//for (i=0;i<((240*64/8)*2);i++)
for (i=0;i<(0x1000);i++)//清除图形和文本区
autowrite(0x0);
ctrl(0xb2);/*结束自动写方式 */
}
/* 显示8*12点阵英文字母,反白 */
void da(uchar x,uchar y,uchar n,bit un) {
unsigned char i;
unsigned char k;
if(n < 0x20)
n = 0x1f;// 未找到该字
k=n-0x1f;
for (i=0;i<16;i++)
{ ag(x,y*8+i);
if((i<2)||(i>13))
{ if (un==0) disp(0x00);
else disp(255-0x00);
}
else
{ if (un==0)
disp(ASC_MSK[k*12+i-2]);
else
disp(255-ASC_MSK[k*12+i-2]);
}
}
}
/* 显示8*16点阵数字,反白 */
/*void dn(uchar x,uchar y,uchar n,bit un) {
unsigned char i;
unsigned char k=n;
for (i=0;i<16;i++) {
ag(x,y*8+i);
if (un==0) disp(Num0_9[k*16+i]); else disp(255-Num0_9[k*16+i]);
}
if ((++x)>=30) {
x=0;
y+=2;
if (y>=8) y=0;
}
}
*/
/* 显示8*12点阵数字,反白 */
void dn(uchar x,uchar y,uchar n,bit un) {
unsigned char i;
unsigned char k=n;
for (i=0;i<16;i++)
{ ag(x,y*8+i);
if((i<2)||(i>13))
{ if (un==0) disp(0x00);
else disp(255-0x00);
}
else
{ if (un==0)
disp(Num0_9[k*12+i-2]);
else
disp(255-Num0_9[k*12+i-2]);
}
}
}
//16*16
/*void hzx(uchar x,uchar y,uchar n,bit un) {
unsigned char i,j;
unsigned int k=n;
for (i=0;i<16;i++) {
for (j=0;j<2;j++) {
ag(j+x,y*8+i);
if (un==1) disp(hz[k*32+i*2+j]);
else disp(255-hz[k*32+i*2+j]);
}
}
}*/
//16*12 汉字显示
void hzx(uchar x,uchar y,uchar n,bit un) {
unsigned char i,j;
unsigned char k=n;
for (i=0;i<16;i++) {
for (j=0;j<2;j++) {
ag(j+x,y*8+i);
if((i<2)||(i>13))
{ if (un==0) disp(0x00);
else disp(255-0x00);
}
else
{ if (un==0) disp(hz[k*24+i*2+j-4]);
else disp(255-hz[k*24+i*2+j-4]);
}
}
}
}
//16*14 //显示特殊符号
void hzx1(uchar x,uchar y,uchar n,bit un) {
unsigned char i,j;
unsigned char k=n;
for (i=0;i<16;i++) {
for (j=0;j<2;j++) {
ag(j+x,y*8+i);
if(i<2)
{ if (un==0) disp(0x00);
else disp(255-0x00);
}
else
{
if (un==0) disp(fot2[k*28+i*2+j-4]);
else disp(255-fot2[k*28+i*2+j-4]);
}
}
}
}
void xsch(uchar x,uchar y,uchar n,bit un)
{ if(n>=1)
hzx1(x,y,7,un);
else
hzx1(x,y,6,un);
}
void xsok(uchar x,uchar y,uchar n,bit un)
{ if(n>=1)
hzx1(x,y,4,un);
else
hzx1(x,y,5,un);
}
void xsdir(uchar x,uchar y,uchar n,bit un)
{ if(n==0)
hzx1(x,y,0,un);
else if(n==1)
hzx1(x,y,1,un);
else if(n==2)
hzx1(x,y,2,un);
else if(n>=3)
hzx1(x,y,3,un);
}
/* 显示32*32点阵汉字,反白 */
void tx(uchar x,uchar y,uchar n,bit un) {
unsigned char i,j;
unsigned char k=n;
for (i=0;i<32;i++)
{ for (j=0;j<4;j++)
{ ag(j+x,y*8+i);
if (un==0)
disp(fot1[k*128+i*4+j]);
else
disp(255-fot1[k*128+i*4+j]);
}
}
x+=2;
if (x>=30) {
x=0;
y+=2;
if (y>=8) y=0;
}
}
/*清屏*/
void ClearScreen(void)
{
unsigned int i;
write(0);write(0);ctrl(0x24);
ctrl(0xb0); /*自动写方式*/
for (i=0;i<19200;i++) {
autowrite(0x0);
}
ctrl(0xb2);/*结束自动写方式 */
}
/* 划点*/
/*
void Pixel(unsigned char PointX,unsigned char PointY, bit Mode)
{
uint StartAddr=0;
uchar dat;
StartAddr=PointY*30 + PointX/8;
dat=0xf0+7-PointX%8;
write((unsigned char)(StartAddr));
write((unsigned char)(StartAddr>>8));
ctrl(0x24);
if(Mode) dat=dat|0x08;
ctrl(dat);
}
*/
/* 划线 */
/* x1应大于x0,y1应大于y0.同时仅仅是0度或90度 */
/*void line(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1)
{ unsigned char x=x1-x0,y=y1-y0,xx,yy;//temp;
if (y==0)
{ yy=y0;
for (xx=x0;xx<x1;xx++)
Pixel(xx,yy,1);
}
else if(x==0)
{ xx=x0;
for (yy=y0;yy<y1;yy++) {
Pixel(xx,yy,1);
}
}
}
*/
// ASCII(8*16) 及 汉字(16*16) 显示函数
// x不能大于30(行宽),y不能大于6,字符数不能多于30
// 例子: dprintf(3,1,"当前试验:KPa");
void Lcd_printf(uchar x,uchar y,char *fmt,bit zt,bit un)
{
char c1,c2;
char idata tmpBuf[40]; // LCD显示数据缓冲区
uchar i=0,j,uLen;
uchar Temp;
uLen=0;
while(*fmt!=0x00)
{tmpBuf[uLen++]=*fmt++;
}
while(i<uLen)
{
c1 = tmpBuf[i];
c2 = tmpBuf[i+1];
if(c1 >= 0)
{ // ASCII
da(x,y,(c1),un);
i++;
x++;
}
else
{ // 中文
if(zt==0)
{ Temp=((sizeof(hzmb)-1)/2);
for(j=0;j<Temp;j++)
{
if(c1 == hzmb[j*2] && c2 == hzmb[j*2+1])
break;
}
if(j>=Temp)
j=0;// 未找到该字
hzx(x,y,j,un);
}
i+=2;
x+=2;
if (x>=30)
{
x=0;
y+=2;
if (y>=6) y=0;
}
}
}
}
void Lcd_Num_Uint(char x,uchar y,uint ad,uchar n)
{ uchar a1,a2,a3,a4,a5;
a5=ad/10000;
ad=ad-a5*10000;
a4=ad/1000;
ad=ad-a4*1000;
a3=ad/100;
ad=ad-a3*100;
a2=ad/10;
a1=ad%10;
if(n>=5) dn(x++,y,a5,0);
if(n>=4) dn(x++,y,a4,0);
if(n>=3) dn(x++,y,a3,0);
if(n>=2) dn(x++,y,a2,0);
dn(x++,y,a1,0);
}
void Lcd_Num_int(char x,uchar y,int ad,uchar n)//特殊显示形式,加负号,增加小数点,4位
{ uchar a1,a2,a3,a4;
if(ad<0)
{ if(n==1)
da(x++,y,'-',0);
ad=0-ad;
}
else
{ if(n==1)
da(x++,y,' ',0);
}
a4=ad/1000;
ad=ad-a4*1000;
a3=ad/100;
ad=ad-a3*100;
a2=ad/10;
a1=ad%10;
if(a4>0)
dn(x++,y,a4,0);
else
da(x++,y,' ',0);
if(a3>0)
dn(x++,y,a3,0);
else
{ if(a4>0) dn(x++,y,a3,0);
else da(x++,y,' ',0);
}
if(a2>0)
dn(x++,y,a2,0);
else
dn(x++,y,0,0);
da(x++,y,'.',0);
dn(x++,y,a1,0);
}
void Lcd_Num_Uchar(char x,uchar y,uchar ad,uchar n)//n显示的位数
{ uchar a1,a2,a3;
a3=ad/100;
ad=(ad-a3*100);
a2=ad/10;
a1=ad%10;
if(n>=3) dn(x++,y,a3,0);
if(n>=2) dn(x++,y,a2,0);
dn(x++,y,a1,0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -