📄 ta6963.c
字号:
#define MASTER 0 //定义驱动程序
#include "ZHIMO.H" //加入控制头文件
#include "TA6963.H" //加入字模字义头文件
#if UCOSII
#include "include.h"
OS_EVENT *QLcd;
#endif
#define Lcd_command (*((INT8U *) LCD_COMMAND))
#define Lcd_data (*((INT8U *) LCD_DATA))
INT8U ReadSta() //读状态字子程序
{ INT8U sta=Lcd_command;
return sta;
}
void LcdSta1(void) //判状态位STA1,STA0子程序
{ while((ReadSta()&0x3)<3);
}
#if LCD_XOR16_EN|LCD_XOR88_EN|LCD_XOR86_EN
void LcdSta3(void) //判状态位STA3子程序
{ while((ReadSta()&0x8)==0);
}
#endif
void LcdWrd(INT8U da) //写数据子程序
{ LcdSta1();
Lcd_data=da;
}
//写命令子程序
void LcdWrc(INT8U com)
{ LcdSta1();
Lcd_command=com;
}
void LcdPr2( INT8U data1, //双字节参数指令写入子程序
INT8U data2,
INT8U com)
{ LcdWrd(data1);
LcdWrd(data2);
LcdWrc(com);
}
void LcdPr1( INT8U data1, //单字节参数指令写入子程序
INT8U com)
{ LcdWrd(data1);
LcdWrc(com);
}
#if LCD_XOR16_EN|LCD_XOR88_EN|LCD_XOR86_EN
INT8U LcdRd(void)
{ LcdSta1();
LcdWrc(0xc1);
LcdSta1();
return (Lcd_data);
}
#endif
#if LCD_DISP16_EN
OS_EXT void LcdDisp16( INT8U x, //16*16点阵显示
INT8U y,
INT16U zhi)
{ INT16U xy;
INT16U p;
INT8U i;
#if UCOSII
INT8U err;
#endif
p=zhi*32; //计算字模位置
xy=y*(LCD_X/8*16)+x; //计算显示地址
#if UCOSII
OSSemPend(QLcd,0,err);
#endif
for ( i=0;i<16;i++)
{ LcdPr2( (INT8U)(xy%256),
(INT8U)(xy/256),0x24); //设置显示地址;
LcdPr1(zhimo16[p++],0xc0); //写数据
LcdPr1(zhimo16[p++],0xc0); //写数据
xy+=LCD_X/8; //地址增加一行
}
#if UCOSII
err = OSSemPost(QLcd);
#endif
}
#endif
#if LCD_DISP86_EN
OS_EXT void LcdDisp86( INT8U x, //8*16点阵显示
INT8U y,
INT16U zhi)
{ INT8U i;
INT16U xy;
INT16U p;
#if UCOSII
INT8U err;
#endif
p=zhi*16; //计算字模位置
xy=y*(LCD_X/8*16)+x; //计算显示地址
#if UCOSII
OSSemPend(QLcd,0,err);
#endif
for ( i=0;i<16;i++)
{ LcdPr2( (INT8U)(xy%256),
(INT8U)(xy/256),0x24); //设置显示地址;
LcdPr1(zhimo86[p++],0xc4); //写数据
xy+=LCD_X/8; //地址增加一行
}
#if UCOSII
err = OSSemPost(QLcd);
#endif
}
#endif
#if LCD_DISP88_EN
OS_EXT void LcdDisp88( INT8U x, //8*8点阵显示
INT8U y,
INT16U zhi)
{ INT8U i;
INT16U xy;
INT16U p;
#if UCOSII
INT8U err;
#endif
p=zhi*16; //计算字模位置
xy=y*(LCD_X/8*16)+x; //计算显示地址
#if UCOSII
OSSemPend(QLcd,0,err);
#endif
for ( i=0;i<8;i++)
{ LcdPr2( (INT8U)(xy%256),
(INT8U)(xy/256),0x24); //设置显示地址;
LcdPr1(zhimo86[p++],0xc4); //写数据
xy=xy+(LCD_X/8); //地址增加一行
}
#if UCOSII
err = OSSemPost(QLcd);
#endif
}
#endif
#if LCD_CLS16_EN
OS_EXT void LcdCls6( INT8U x, //16*16点阵删除
INT8U y)
{ INT16U xy;
INT8U i;
#if UCOSII
INT8U err;
#endif
xy=y*(LCD_X/8*16)+x; //计算显示地址
#if UCOSII
OSSemPend(QLcd,0,err);
#endif
for ( i=0;i<16;i++)
{ LcdPr2( (INT8U)(xy%256),
(INT8U)(xy/256),0x24); //设置显示地址;
LcdPr1(0,0xc0); //写数据
LcdPr1(0,0xc0); //写数据
xy+=LCD_X/8; //地址增加一行
}
#if UCOSII
err = OSSemPost(QLcd);
#endif
}
#endif
#if LCD_CLS86_EN
OS_EXT void LcdCls86( INT8U x, //8*16点阵删除
INT8U y)
{ INT8U i;
INT16U xy;
#if UCOSII
INT8U err;
#endif
xy=y*(LCD_X/8*16)+x; //计算显示地址
#if UCOSII
OSSemPend(QLcd,0,err);
#endif
for ( i=0;i<16;i++)
{ LcdPr2( (INT8U)(xy%256),
(INT8U)(xy/256),0x24); //设置显示地址;
LcdPr1(0,0xc4); //写数据
xy+=LCD_X/8; //地址增加一行
}
#if UCOSII
err = OSSemPost(QLcd);
#endif
}
#endif
#if LCD_CLS88_EN
OS_EXT void LcdCls88( INT8U x, //8*8点阵删除
INT8U y)
{ INT8U i;
INT16U xy;
#if UCOSII
INT8U err;
#endif
xy=y*(LCD_X/8*16)+x; //计算显示地址
#if UCOSII
OSSemPend(QLcd,0,err);
#endif
for ( i=0;i<8;i++)
{ LcdPr2( (INT8U)(xy%256),
(INT8U)(xy/256),0x24); //设置显示地址;
LcdPr1(0,0xc4); //写数据
xy+=LCD_X/8; //地址增加一行
}
#if UCOSII
err = OSSemPost(QLcd);
#endif
}
#endif
#if LCD_CLS_LINE_EN
OS_EXT void LcdCls( INT8U y1, //行删除
INT8U y2)
{ INT16U xdata xy,xy1;
#if UCOSII
INT8U err;
#endif
xy=y1*LCD_X;
xy1=y2*LCD_X+LCD_X;
#if UCOSII
OSSemPend(QLcd,0,err);
#endif
LcdPr2( (INT8U)(xy%256),
(INT8U)(xy/256),0x24); //设置清空地址;
LcdWrc(0xb0);
for(xy;xy<xy1;xy++)
{ LcdSta3();
Lcd_data=0;
}
LcdWrc(0xb2);
#if UCOSII
err = OSSemPost(QLcd);
#endif
}
#endif
#if LCD_XOR16_EN
OS_EXT void LcdXor16( INT8U x, //16*16点阵反色
INT8U y)
{
#if UCOSII
INT8U err;
#endif
#if UCOSII
OSSemPend(QLcd,0,err);
#endif
//此处加入代码
x=y;
#if UCOSII
err = OSSemPost(QLcd);
#endif
}
#endif
#if LCD_XOR86_EN
OS_EXT void LcdXor86( INT8U x, //8*16点阵反色
INT8U y)
{
#if UCOSII
INT8U err;
#endif
#if UCOSII
OSSemPend(QLcd,0,err);
#endif
//此处加入代码
x=y;
#if UCOSII
err = OSSemPost(QLcd);
#endif
}
#endif
#if LCD_XOR88_EN
OS_EXT void LcdXor88( INT8U x, //8*8点阵反色
INT8U y)
{
#if UCOSII
INT8U err;
#endif
#if UCOSII
OSSemPend(QLcd,0,err);
#endif
//此处加入代码
x=y;
#if UCOSII
err = OSSemPost(QLcd);
#endif
}
#endif
#if LCD_POINT_EN
OS_EXT void LcdPoint( INT8U x, //画点
INT8U y,
bit color)
{ INT16U xy;
INT8U ch;
#if UCOSII
INT8U err;
#endif
ch=x%8; //取位数
xy = (y*(LCD_X/8))+x/8;
#if UCOSII
OSSemPend(QLcd,0,err);
#endif
LcdPr2( (INT8U)(xy%256), //设置地址
(INT8U)(xy/256),0x24);
if (color)
LcdWrc(0xf8+ch);
else
LcdWrc(0xf0+ch);
#if UCOSII
err = OSSemPost(QLcd);
#endif
}
#endif
#if LCD_LINE_EN
OS_EXT void LcdLine( INT8U x1, //画线
INT8U y1,
INT8U x2,
INT8U y2,
bit color)
{ //画线程序实际由一系列画点程序构成
x1=x2;
y1=y2;
color=color;
}
#endif
void LcdInit(void)
{ Lcd_command = LCD_COMMAND; //设置液晶屏操作端口
Lcd_data = LCD_DATA;
LcdWrc(0x98); //设置图形显示
LcdWrc(0x80); //设置与文本"逻辑或"显示
LcdWrc(0xb2); //禁用自动读写
LcdPr2(0,0,0x42); //设置首址
LcdPr2(LCD_X/8,0,0x43); //设置宽度
LcdPr2(0,0,0x24); //设置显示地址
#if LCD_CLS_LINE_EN
LcdCls(0,LCD_Y/8); //清屏
#endif
#if UCOSII
QLcd = OSSemCreate (1); //如用在操作系统下,则建立信号量
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -