📄 display.c
字号:
#include "resouce.h"
//#define ulong unsigned long
//#define uint unsigned int
//#define uchar unsigned char
extern struct stc_stru stc;
extern union variable var;
extern const unsigned char lcdxy[512];
extern void putchar(unsigned char abyte);
extern void Delay_us_8_4(unsigned char us4);
extern void DelayMs(unsigned char ms);
extern void DelayMsInt(unsigned int ms);
// 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 0x90 // 显示开关: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:清除
unsigned char fnST01bb(void) // 状态位STA1,STA0判断(读写指令和读写数据)
{
unsigned char i;
LCMDIR = 0;
LCMCD = 1;
LCMWR = 1;
LCMRD = 0;
i = 2;
while(i--){__wait_nop();}
//for(i = 4;i > 0;i--)
//{
//if((LCMDATA & 0x03) == 0x03){
// ;//break;
// }
//}
LCMRD = 1;
//var.u.testofs++;
//var.u.testofs %= 8;
//var.u.test[var.u.testofs] = i;
return 1; // 若返回零,说明错误
}
unsigned char fnST01(void) // 状态位STA1,STA0判断(读写指令和读写数据)
{
unsigned char i;
LCMDIR = 0;
LCMCD = 1;
LCMWR = 1;
LCMRD = 0;
for(i = 10;i > 0;i--)
{
if((LCMDATA & 0x03) == 0x03){
break;
}
}
LCMRD = 1;
//var.u.testofs++;
//var.u.testofs %= 8;
//var.u.test[var.u.testofs] = i;
return i; // 若返回零,说明错误
}
unsigned char fnST2(void) // 状态位ST2判断(数据自动读状态)
{
unsigned char i;
LCMDIR = 0;
LCMCD = 1;
LCMWR = 1;
LCMRD = 0;
for(i = 10;i > 0;i--)
{
if((LCMDATA & 0x04) == 0x04)
break;
}
LCMRD = 1;
return i; // 若返回零,说明错误
}
unsigned char fnST3(void) // 状态位ST3判断(数据自动写状态)
{
unsigned char i;
LCMDIR = 0;
LCMCD = 1;
LCMWR = 1;
LCMRD = 0;
for(i = 10;i > 0;i--)
{
if((LCMDATA & 0x08) == 0x08)
break;
}
LCMRD = 1;
return i; // 若返回零,说明错误
}
unsigned char fnST6(void) // 状态位ST6判断(屏读/屏拷贝状态)
{
unsigned char i;
LCMDIR = 0;
LCMCD = 1;
LCMWR = 1;
LCMRD = 0;
LCMCE = 0;
for(i = 10;i > 0;i--)
{
if((LCMDATA & 0x40) == 0)
break;
}
LCMCE = 1;
return i; // 若返回零,说明错误
}
unsigned char fnCmd2(unsigned char uCmd,unsigned char uPar1,unsigned char uPar2) // 写双参数的指令
{
if(fnST01() == 0){
//var.u.flag.lcderr = 1;
return 1;
}
LCMCD = 0;
LCMRD = 1;
LCMDIR = 0xff;
LCMDATA = uPar1;
LCMWR = 0;
LCMWR = 1;
if(fnST01() == 0){
//var.u.flag.lcderr = 1;
return 2;
}
LCMCD = 0;
LCMRD = 1;
LCMDIR = 0xff;
LCMDATA = uPar2;
LCMWR = 0;
LCMWR = 1;
if(fnST01() == 0){
//var.u.flag.lcderr = 1;
return 3;
}
LCMCD = 1;
LCMRD = 1;
LCMDIR = 0xff;
LCMDATA = uCmd;
LCMWR = 0;
LCMWR = 1;
return 0; // 返回0成功
}
unsigned char fnCmd2c(unsigned char uCmd,unsigned char uPar1,unsigned char uPar2) // 写双参数的指令
{
LCMCD = 0;
LCMRD = 1;
LCMDIR = 0xff;
LCMDATA = uPar1;
LCMWR = 0;
LCMWR = 1;
LCMDATA = uPar2;
LCMWR = 0;
LCMWR = 1;
LCMCD = 1;
LCMDATA = uCmd;
LCMWR = 0;
LCMWR = 1;
LCMCD = 0;
return 0; // 返回0成功
}
unsigned char fnCmd1(unsigned char uCmd,unsigned char uPar1) // 写单参数的指令
{
if(fnST01() == 0)
return 1;
LCMCD = 0;
LCMWR = 0;
LCMRD = 1;
LCMDATA = uPar1;
LCMDIR = 0xff;
LCMCE = 0;
LCMCE = 1;
if(fnST01() == 0)
return 3;
LCMCD = 1;
LCMWR = 0;
LCMRD = 1;
LCMDATA = uCmd;
LCMDIR = 0xff;
LCMCE = 0;
LCMCE = 1;
return 0; // 返回0成功
}
unsigned char fnCmd(unsigned char uCmd) // 写无参数的指令
{
if(fnST01() == 0)
return 3;
//LCMLED = 1;
LCMCD = 1;
LCMRD = 1;
LCMDIR = 0xff;
LCMDATA = uCmd;
LCMWR = 0;
LCMWR = 1;
return 0; // 返回0成功
}
unsigned char fnDataWB(unsigned char uData) // 写数据
{
if(fnST3() == 0){
return 1;
}else{
LCMCD = 0;
LCMDIR = 0xff;
LCMDATA = uData;
LCMWR = 0;
LCMWR = 1;
}
return 0; // 返回0成功
}
unsigned char fnDataW(unsigned char uData) // 写数据
{
LCMCD = 0;
LCMDIR = 0xff;
LCMDATA = uData;
LCMWR = 0;
LCMWR = 1;
return 0; // 返回0成功
}
unsigned char fnAutoW(unsigned char* src,unsigned int len) // 写数据
{
unsigned int i;
unsigned char abyte;
abyte = 0;
if(fnCmd(LC_AUT_WR)){ // 写数据
abyte = 1;
}
for(i = 0;i < len;i++){
if(fnST3() == 0){
abyte |= 2;
}else{
LCMCD = 0;
LCMRD = 1;
LCMDIR = 0xff;
LCMDATA = src[i];
LCMWR = 0;
LCMWR = 1;
}
}
if(fnCmd(LC_AUT_OVR)){ // 写数据
abyte |= 4;
}
return abyte; // 返回0成功
}
unsigned char fnDataR(void) // 读数据
{
if(fnST01() == 0)
return 1;
return LCMDATA;
}
// 设置当前地址
void fnSetPos(unsigned char urow, unsigned char ucol)
{
unsigned int iPos;
iPos = urow * 30 + ucol;
fnCmd2(LC_ADD_POS,iPos & 0xFF,iPos / 256);
//gCurRow = urow;
//gCurCol = ucol;
}
// 设置当前显示行、列
void cursor(unsigned char uRow, unsigned char uCol)
{
fnSetPos(uRow * 16, uCol);
}
/*
*/
void writeh2s(void)
{
unsigned char i;
if(var.u.movea.byte[0] & var.u.mask){var.u.moveb.bb[0].bit.b7 = 1;}else{var.u.moveb.bb[0].bit.b7 = 0;}
if(var.u.movea.byte[1] & var.u.mask){var.u.moveb.bb[0].bit.b6 = 1;}else{var.u.moveb.bb[0].bit.b6 = 0;}
if(var.u.movea.byte[2] & var.u.mask){var.u.moveb.bb[0].bit.b5 = 1;}else{var.u.moveb.bb[0].bit.b5 = 0;}
if(var.u.movea.byte[3] & var.u.mask){var.u.moveb.bb[0].bit.b4 = 1;}else{var.u.moveb.bb[0].bit.b4 = 0;}
if(var.u.movea.byte[4] & var.u.mask){var.u.moveb.bb[0].bit.b3 = 1;}else{var.u.moveb.bb[0].bit.b3 = 0;}
if(var.u.movea.byte[5] & var.u.mask){var.u.moveb.bb[0].bit.b2 = 1;}else{var.u.moveb.bb[0].bit.b2 = 0;}
if(var.u.movea.byte[6] & var.u.mask){var.u.moveb.bb[0].bit.b1 = 1;}else{var.u.moveb.bb[0].bit.b1 = 0;}
if(var.u.movea.byte[7] & var.u.mask){var.u.moveb.bb[0].bit.b0 = 1;}else{var.u.moveb.bb[0].bit.b0 = 0;}
if(var.u.movea.byte[8] & var.u.mask){var.u.moveb.bb[1].bit.b7 = 1;}else{var.u.moveb.bb[1].bit.b7 = 0;}
if(var.u.movea.byte[9] & var.u.mask){var.u.moveb.bb[1].bit.b6 = 1;}else{var.u.moveb.bb[1].bit.b6 = 0;}
if(var.u.movea.byte[10] & var.u.mask){var.u.moveb.bb[1].bit.b5 = 1;}else{var.u.moveb.bb[1].bit.b5 = 0;}
if(var.u.movea.byte[11] & var.u.mask){var.u.moveb.bb[1].bit.b4 = 1;}else{var.u.moveb.bb[1].bit.b4 = 0;}
if(var.u.movea.byte[12] & var.u.mask){var.u.moveb.bb[1].bit.b3 = 1;}else{var.u.moveb.bb[1].bit.b3 = 0;}
if(var.u.movea.byte[13] & var.u.mask){var.u.moveb.bb[1].bit.b2 = 1;}else{var.u.moveb.bb[1].bit.b2 = 0;}
if(var.u.movea.byte[14] & var.u.mask){var.u.moveb.bb[1].bit.b1 = 1;}else{var.u.moveb.bb[1].bit.b1 = 0;}
if(var.u.movea.byte[15] & var.u.mask){var.u.moveb.bb[1].bit.b0 = 1;}else{var.u.moveb.bb[1].bit.b0 = 0;}
LCMCD = 0;
LCMRD = 1;
LCMDIR = 0xff;
LCMDATA = var.u.locat.byte[0];
LCMWR = 0;
LCMWR = 1;
if(var.u.movea.byte[16] & var.u.mask){var.u.moveb.bb[2].bit.b7 = 1;}else{var.u.moveb.bb[2].bit.b7 = 0;}
if(var.u.movea.byte[17] & var.u.mask){var.u.moveb.bb[2].bit.b6 = 1;}else{var.u.moveb.bb[2].bit.b6 = 0;}
if(var.u.movea.byte[18] & var.u.mask){var.u.moveb.bb[2].bit.b5 = 1;}else{var.u.moveb.bb[2].bit.b5 = 0;}
if(var.u.movea.byte[19] & var.u.mask){var.u.moveb.bb[2].bit.b4 = 1;}else{var.u.moveb.bb[2].bit.b4 = 0;}
if(var.u.movea.byte[20] & var.u.mask){var.u.moveb.bb[2].bit.b3 = 1;}else{var.u.moveb.bb[2].bit.b3 = 0;}
if(var.u.movea.byte[21] & var.u.mask){var.u.moveb.bb[2].bit.b2 = 1;}else{var.u.moveb.bb[2].bit.b2 = 0;}
if(var.u.movea.byte[22] & var.u.mask){var.u.moveb.bb[2].bit.b1 = 1;}else{var.u.moveb.bb[2].bit.b1 = 0;}
if(var.u.movea.byte[23] & var.u.mask){var.u.moveb.bb[2].bit.b0 = 1;}else{var.u.moveb.bb[2].bit.b0 = 0;}
if(var.u.movea.byte[24] & var.u.mask){var.u.moveb.bb[3].bit.b7 = 1;}else{var.u.moveb.bb[3].bit.b7 = 0;}
if(var.u.movea.byte[25] & var.u.mask){var.u.moveb.bb[3].bit.b6 = 1;}else{var.u.moveb.bb[3].bit.b6 = 0;}
if(var.u.movea.byte[26] & var.u.mask){var.u.moveb.bb[3].bit.b5 = 1;}else{var.u.moveb.bb[3].bit.b5 = 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -