www.pudn.com > t6963_nios.rar > t6963.h
#include "excalibur.h"
#include "zimo.h"
np_pio* lcddata=na_lcddata;
np_pio* lcdcd=na_lcdcd;
np_pio* lcdce=na_lcdce;
np_pio* lcdwr=na_lcdwr;
np_pio* lcdrd=na_lcdrd;
typedef unsigned char uchar;
#define uint unsigned int
// 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
// 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_MOD_XOR 0x81 // 显示方式:逻辑“异或”
#define LC_MOD_AND 0x82 // 显示方式:逻辑“与”
#define LC_MOD_TCH 0x83 // 显示方式:文本特征
#define LC_DIS_SW 0x9c // 显示开关: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;
uchar turnf[8] = {7,6,5,4,3,2,1,0};
void setcd(unsigned char a){
if(a) lcdcd->np_piodata=1;
else lcdcd->np_piodata=0;}
void setwr(unsigned char a){
if(a){lcdwr->np_piodata=1;
}
else {lcdwr->np_piodata=0;}
}
void setrd(unsigned char a){if(a) lcdrd->np_piodata=1;else lcdrd->np_piodata=0;}
void setce(unsigned char a){if(a) lcdce->np_piodata=1;else lcdce->np_piodata=0;}
void delay6963(unsigned char a)
{
uchar i;
for(i=0;inp_piodirection=0;
setcd(1);
setwr(1);
setrd(0);
delay6963(1);
a=lcddata->np_piodata;
setrd(1);
lcddata->np_piodirection=0xff;
return a; }
void st01(){while(!(readstatus()&0x01)) delay6963(1);
while(!(readstatus()&0x02)) delay6963(1);}
void st02(){while(!(readstatus()&0x04)) delay6963(1);}
void st03(){while(!(readstatus()&0x08)) delay6963(1);}
void st06(){while(!(readstatus()&0x40)) delay6963(1);}
/********************************************************/
/* 写双参数的指令 */
/********************************************************/
void fnPR1(uchar uCmd,uchar uPart1,uchar uPart2)
{
st01();
setcd(0);
lcddata->np_piodata=uPart1;
setwr(0);
delay6963(1);
setwr(1);
st01();
setcd(0);
lcddata->np_piodata=uPart2;
setwr(0);
delay6963(1);
setwr(1);
st01();
lcddata->np_piodata=uCmd;
setwr(0);
delay6963(1);
setwr(1);
}
/********************************************************/
/* 写单参数的指令 */
/********************************************************/
void fnPR11(uchar uCmd,uchar uPart1)
{
st01();
setcd(0);
lcddata->np_piodata=uPart1;
setwr(0);
delay6963(1);
setwr(1);
st01();
lcddata->np_piodata=uCmd;
setwr(0);
delay6963(1);
setwr(1);
}
/********************************************************/
/* 写无参数的指令 */
/********************************************************/
void fnPR12(uchar uCmd)
{
st01();
lcddata->np_piodata=uCmd;
setwr(0);
delay6963(1);
setwr(1);
}
/********************************************************/
/* 写数据 */
/********************************************************/
void fnPR13(uchar uData)
{
st03();
setcd(0);
lcddata->np_piodata=uData;
setwr(0);
delay6963(1);
setwr(1);
}
/********************************************************/
/* 读数据 */
/********************************************************/
uchar fnPR2(void)
{ uchar a;
st01();
lcddata->np_piodirection=0;
setcd(0);
setwr(1);
setrd(0);
delay6963(1);
a=lcddata->np_piodata;
setrd(1);
lcddata->np_piodirection=0xff;
return a;
}
/********************************************************/
/* 设置当前地址 */
/********************************************************/
void fnSetPos(uchar urow, uchar ucol) //urow是列值,ucol是行值
{
uint iPos;
iPos = urow * 16+ ucol;
fnPR1(LC_ADD_POS,iPos & 0xFF,iPos / 256);
gCurRow = urow;
gCurCol = ucol;
}
void initial6963()
{ lcddata->np_piodirection=0xff;
lcddata->np_piodata=0;
lcdwr->np_piodata=0;
lcdrd->np_piodata=0;
lcdcd->np_piodata=0;
lcdce->np_piodata=0;
fnPR1(LC_TXT_STP,0,0); // 文本显示区首地址
fnPR1(LC_TXT_WID,16,0x00); // 文本显示区宽度
fnPR1(LC_GRH_STP,0x00,0x00); // 图形显示区首地址
fnPR1(LC_GRH_WID,16,0x00); // 图形显示区宽度
fnPR12(LC_CUR_SHP | 0x01); // 光标形状
fnPR12(LC_MOD_OR); // 显示方式设置
fnPR12(LC_DIS_SW|0x0c); // 显示开关设置
}
/********************************************************/
/* 设置当前显示行、列 */
/********************************************************/
void cursor(uchar uRow, uchar uCol)
{
fnSetPos(uCol* 16, uRow); //ucol是列值0 1 2 3
//uRow 是行值
}
void cls2(void ) /* 依次写CGROM字符库 */
{
uint i;
fnPR1(LC_CGR_POS,0x00,0x00);//CGRAM偏移地址设置
fnPR1(LC_ADD_POS,0x00,0x00); // 置地址指针为从零开始
fnPR12(LC_AUT_WR); // 自动写
for(i=0;i<128;i++) // 清一屏
{
st03();
fnPR13(i); // 写数据,实际使用时请将0x55改成0x0
}
fnPR12(LC_AUT_OVR); // 自动写结束
fnPR1(LC_ADD_POS,0x00,0x00); // 重置地址指针
gCurRow = 0; // 置地址指针存储变量
gCurCol = 0;
}
/********************************************************/
/********************************************************/
void cls(void) //清屏
{
uint i;
fnPR12(LC_DIS_SW & 0xf7); // 显示开关设置
fnPR1(LC_ADD_POS,0x00,0x00); // 置地址指针为从零开始
fnPR12(LC_AUT_WR); // 自动写
for(i=0;i<128*64/8;i++) // 清一屏 // 总的字节数是240*128/8
{
st03();
fnPR13(0x00); // 写数据,实际使用时请将0x55改成0x0
}
fnPR12(LC_AUT_OVR); // 自动写结束
fnPR1(LC_ADD_POS,0x00,0x00); // 重置地址指针
fnPR12(LC_DIS_SW & 0xfb); // 显示开关设置
gCurRow = 0; // 置地址指针存储变量
gCurCol = 0;
}
/*******************************************************/
/* 设置文本 */
/*******************************************************/
void CGRAM()
{
fnPR1(LC_CGR_POS,0x00,0x00);//CGRAM偏移地址设置
}
//一行有16个地址单元,一个地址8个点,画点时先要确定地址单元地址,
//row确定地址单元所在行,为0-63,column确定地址单元所在列,为0-15
//bit为0-7的数,控制画地址单元中的哪个点,为7画最左边的点,为0画最右边的点
//s为8时画点,为0时擦除点
void point(uchar row,uchar column,uchar s)
{
uchar x1=0xf0;
uchar column1=column/8;
uchar bit=7-column%8;
int a=row*16+column1;
fnPR1(LC_ADD_POS,a&0xff,a/256);
x1|=bit;
x1|=s;
fnPR12(x1);
}
//y0,yt为横坐标0-127,x0,xt为纵坐标0-63,s为8时画线,为0时擦除,不能画斜线
void line(uchar row0,uchar column0,uchar rowt,uchar columnt,uchar s)
{
uchar i;
if(row0==rowt)
for(i=column0;i<=columnt;i++)
point(row0,i,s);
if(column0==columnt)
for(i=row0;i<=rowt;i++)
point(i,column0,s);
}
//x0、xt为0-127,y0、yt为0-63,s为8画矩形,为0镲除
void rectangle(uchar x0,uchar y0,uchar xt,uchar yt,uchar s)
{
line(x0,y0,xt,y0,s);
line(xt,y0,xt,yt,s);
line(x0,y0,x0,yt,s);
line(x0,yt,xt,yt,s);
}
//显示字符串
void dprintf(uchar row,uchar column,uchar black,char *fmt,... ) //row为0-63,columm为0-15
{
char c1,c2,cData=0;
uchar i=0,j,uRow,uCol;
uint k;
uchar ulen;
ulen=strlen(fmt);
fnSetPos(row,column);
while(i 0 )
{ // ASCII
if(c1 < 0x20)
{
switch(c1)
{
case CR:
case LF: // 回车或换行
i++;
if(uRow < 144)
fnSetPos(uRow+16,0);
else
fnSetPos(0,0);
continue;
case BS: // 退格
if(uCol > 0)
uCol--;
fnSetPos(uRow,uCol);
cData = 0x00;
break;
default: // 其他
c1 = 0x1f;
}
}
for(j=0;j<16;j++)
{
fnPR12(LC_AUT_WR); // 写数据
if(c1 >= 0x20)
fnPR13((0xff*black)^ASC_MSK[(c1-0x20)*ASC_CHR_HEIGHT+j-(16-ASC_CHR_HEIGHT)]);
else
fnPR13(cData);
fnPR12(LC_AUT_OVR);
fnSetPos(uRow+j+1,uCol);
}
if(c1 != BS) // 非退格
uCol++;
}
else
{ // 中文
for(j=0;j=30) // 光标后移
{
uRow +=16;
if(uRow < 0x80)
uCol -= 30;
else
{
uRow = 0;
uCol = 0;
}
}
fnSetPos(uRow,uCol);
i++;
}
}
//显示数字
printfig(uchar row,uchar column,uchar black,int fig)
{
char a[10],i=0,k;
if(!fig)
dprintf(row,column,black,"0");
while(fig)
{
a[i]=fig%10;
fig=fig/10;
i++;
}
for(k=i-1;k>=0;k--)
{
switch(a[k])
{
case 0:
dprintf(row,column,black,"0");
break;
case 1:
dprintf(row,column,black,"1");
break;
case 2:
dprintf(row,column,black,"2");
break;
case 3:
dprintf(row,column,black,"3");
break;
case 4:
dprintf(row,column,black,"4");
break;
case 5:
dprintf(row,column,black,"5");
break;
case 6:
dprintf(row,column,black,"6");
break;
case 7:
dprintf(row,column,black,"7");
break;
case 8:
dprintf(row,column,black,"8");
break;
case 9:
dprintf(row,column,black,"9");
break;
default : break;
}
column++;
}
}