📄 t6963.c
字号:
#include <stdarg.h>
#include <stdio.h>
#include "..\uCOS270\ucos_ii.h"
#include "..\CPU\config.h"
#include "..\Main\ebi.h"
#include "..\Main\T6963.h"
#include "..\Main\font.h"
#include "..\Main\pic.h"
unsigned char gCurRow,gCurCol; // 当前行、列存储,行高16点,列宽8点
const unsigned char uPowArr[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
unsigned char gCurRow,gCurCol; // 当前行、列存储,行高16点,列宽8点
unsigned char fnGetRow(void)
{
return gCurRow;
}
unsigned char fnGetCol(void)
{
return gCurCol;
}
unsigned char test_state1(void) // 状态位STA1,STA0判断(读写指令和读写数据)
{
unsigned char i;
for(i=10;i>0;i--)
{
if((LCMCW & 0x03) == 0x03)
break;
}
return i; // 若返回零,说明错误
}
unsigned char test_state2(void) // 状态位ST2判断(数据自动读状态)
{
unsigned char i;
for(i=10;i>0;i--)
{
if((LCMCW & 0x04) == 0x04)
break;
}
return i; // 若返回零,说明错误
}
unsigned char test_state3(void) // 状态位ST3判断(数据自动写状态)
{
unsigned char i;
for(i=10;i>0;i--)
{
if((LCMCW & 0x08) == 0x08)
break;
}
return i; // 若返回零,说明错误
}
unsigned char test_state6(void) // 状态位ST6判断(屏读/屏拷贝状态)
{
unsigned char i;
for(i=10;i>0;i--)
{
if((LCMCW & 0x40) == 0x40)
break;
}
return i; // 若返回零,说明错误
}
unsigned char lcd_comm_w_2(unsigned char uCmd,unsigned char uPar1,unsigned char uPar2) // 写双参数的指令
{
if(test_state1() == 0)
return 1;
LCMDW = uPar1;
if(test_state1() == 0)
return 2;
LCMDW = uPar2;
if(test_state1() == 0)
return 3;
LCMCW = uCmd;
return 0; // 返回0成功
}
unsigned char lcd_comm_w_1(unsigned char uCmd,unsigned char uPar1) // 写单参数的指令
{
if(test_state1() == 0)
return 1;
LCMDW = uPar1;
if(test_state1() == 0)
return 2;
LCMCW = uCmd;
return 0; // 返回0成功
}
unsigned char lcd_comm_w(unsigned char uCmd) // 写无参数的指令
{
if(test_state1() == 0)
return 1;
LCMCW = uCmd;
return 0; // 返回0成功
}
unsigned char lcd_data_w(unsigned char uData) // 写数据
{
if(test_state3() == 0)
return 1;
LCMDW = uData;
return 0; // 返回0成功
}
unsigned char lcd_data_r(void) // 读数据
{
if(test_state1() == 0)
return 1;
return LCMDW;
}
// 设置当前地址
void fnSetPos(unsigned char urow, unsigned char ucol)
{
unsigned int iPos;
iPos = urow *32 + ucol;
lcd_comm_w_2(LC_ADD_POS,iPos & 0xFF,iPos / 256);
gCurRow = urow;
gCurCol = ucol;
}
// 设置当前显示行、列
void cursor(unsigned char uCol,unsigned char uRow)
{
fnSetPos(uRow, uCol);
}
// 清屏
void cls(void)
{
unsigned int i;
lcd_comm_w_2(LC_ADD_POS,0x00,0x00); // 置地址指针
lcd_comm_w(LC_AUT_WR); // 自动写
for(i=0;i<128*16;i++)
{
test_state3();
lcd_data_w(0x00); // 写数据
}
lcd_comm_w(LC_AUT_OVR); // 自动写结束
lcd_comm_w_2(LC_ADD_POS,0x00,0x00); // 重置地址指针
gCurRow = 0; // 置地址指针存储变量
gCurCol = 0;
}
// LCM 初始化
char fnLCMInit(void)
{
__EBI_CSR2 = 0x20000000
| EBI_DBW_8
| EBI_NWS_8
| EBI_WSE
| EBI_PAGES_16M
| EBI_TDF_7
| EBI_BAT_BYTE_WRITE
| EBI_CSEN ;
if(lcd_comm_w_2(LC_TXT_STP,0x00,0x00) != 0) // 文本显示区首地址
return (char)-1;
lcd_comm_w_2(LC_TXT_WID,32,0x00); // 文本显示区宽度
lcd_comm_w_2(LC_GRH_STP,0x00,0x00); // 图形显示区首地址
lcd_comm_w_2(LC_GRH_WID,32,0x00); // 图形显示区宽度
lcd_comm_w(LC_CUR_SHP | 0x01); // 光标形状
lcd_comm_w(LC_MOD_OR); // 显示方式设置
lcd_comm_w(LC_DIS_SW | 0x08); // 显示开关设置
return 0;
}
// ASCII(8*16) 及 汉字(16*16) 显示函数
void display_string(unsigned char uLen,char *tmpBuf)
{
unsigned char i=0,uRow,uCol;
signed char j,c1,c2,cData;
unsigned int k;
while(i<uLen)
{
c1 = tmpBuf[i];
c2 = tmpBuf[i+1];
uRow = fnGetRow();
uCol = fnGetCol();
if(c1 >= 0)
{ // ASCII
if(c1 < 0x20)
{
switch(c1)
{
case CR:
case LF: // 回车或换行
i++;
if(uRow < 112)
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++)
{
lcd_comm_w(LC_AUT_WR); // 写数据
if(c1 >= 0x1f)
{
if(j < (16-ASC_CHR_HEIGHT))
lcd_data_w(0x00);
else
lcd_data_w(ASC_MSK[(c1-0x1f)*ASC_CHR_HEIGHT+j-(16-ASC_CHR_HEIGHT)]);
}
else
lcd_data_w(cData);
lcd_comm_w(LC_AUT_OVR);
fnSetPos(uRow+j+1,uCol);
}
if(c1 != BS) // 非退格
uCol++;
}
else
{ // 中文
for(j=0;j<sizeof(GB_16)/sizeof(GB_16[0]);j++)
{
if(c1 == GB_16[j].Index[0] && c2 == GB_16[j].Index[1])
break;
}
for(k=0;k<sizeof(GB_16[0].Msk)/2;k++)
{
fnSetPos(uRow+k,uCol);
lcd_comm_w(LC_AUT_WR); // 写数据
if(j < sizeof(GB_16)/sizeof(GB_16[0]))
{
lcd_data_w(GB_16[j].Msk[k*2]);
lcd_data_w(GB_16[j].Msk[k*2+1]);
}
else // 未找到该字
{
if(k < sizeof(GB_16[0].Msk)/4)
{
lcd_data_w(0x00);
lcd_data_w(0x00);
}
else
{
lcd_data_w(0xff);
lcd_data_w(0xff);
}
}
lcd_comm_w(LC_AUT_OVR);
}
uCol += 2;
i++;
}
if(uCol >= 32) // 光标后移
{
uRow += 16;
if(uRow < 256)
uCol -= 32;
else
{
uRow = 0;
uCol = 0;
}
}
fnSetPos(uRow,uCol);
i++;
}
}
void display_string_2(unsigned char uLen,char *tmpBuf,unsigned char black_white)
{
unsigned char i=0,uRow,uCol;
signed char j,c1,c2,cData;
unsigned int k;
while(i<uLen)
{
c1 = tmpBuf[i]; //第一个
c2 = tmpBuf[i+1]; //第二个
uRow = fnGetRow();
uCol = fnGetCol();
if(c1 >= 0)
{ // ASCII
if(c1 < 0x20)
{
switch(c1)
{
case CR:
case LF: // 回车或换行
i++;
if(uRow < 112)
fnSetPos(uRow+16,0);//,LAYER_1);
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++)
{
lcd_comm_w(LC_AUT_WR); // 写数据
//lcd_auto_wdata();
if(c1 >= 0x1f)
{
if(j < (16-ASC_CHR_HEIGHT))
if(black_white){
lcd_data_w(0xff);
}
else{
lcd_data_w(0x00);
}
else
if(black_white){
lcd_data_w(~(ASC_MSK[(c1-0x1f)*ASC_CHR_HEIGHT+j-(16-ASC_CHR_HEIGHT)]));
}
else{
lcd_data_w(ASC_MSK[(c1-0x1f)*ASC_CHR_HEIGHT+j-(16-ASC_CHR_HEIGHT)]);//fnPR13(ASC_MSK[(c1-0x1f)*ASC_CHR_HEIGHT+j-(16-ASC_CHR_HEIGHT)]);
}
}
else
if(black_white){
lcd_data_w(~cData);
}
else{
lcd_data_w(cData);//fnPR13(cData);
}
lcd_comm_w(LC_AUT_OVR);
fnSetPos(uRow+j+1,uCol);
}
if(c1 != BS) // 非退格
uCol++;
}
else
{ // 中文
for(j=0;j<sizeof(GB_16)/sizeof(GB_16[0]);j++)
{
if(c1 == GB_16[j].Index[0] && c2 == GB_16[j].Index[1])
break;
}
for(k=0;k<sizeof(GB_16[0].Msk)/2;k++)
{
fnSetPos(uRow+k,uCol);
//fnPR12(LC_AUT_WR); // 写数据
lcd_comm_w(LC_AUT_WR);
//lcd_auto_wdata();
if(j < sizeof(GB_16)/sizeof(GB_16[0]))
{
if(black_white){
lcd_data_w(~(GB_16[j].Msk[k*2]));
lcd_data_w(~(GB_16[j].Msk[k*2+1]));
}
else{
lcd_data_w(GB_16[j].Msk[k*2]);
lcd_data_w(GB_16[j].Msk[k*2+1]);
}
}
else // 未找到该字
{
if(k < sizeof(GB_16[0].Msk)/4)
{
if(black_white){
lcd_data_w(0xff);
lcd_data_w(0xff);
}
else{
lcd_data_w(0x00);
lcd_data_w(0x00);
}
}
else
{
if(black_white){
lcd_data_w(0x00);
lcd_data_w(0x00);
}
else{
lcd_data_w(0xff);
lcd_data_w(0xff);
}
}
}
lcd_comm_w(LC_AUT_OVR);
}
uCol += 2;
i++;
}
if(uCol >= 32) // 光标后移
{
uRow += 16;
if(uRow < 128)
uCol -= 32;
else
{
uRow = 0;
uCol = 0;
}
}
fnSetPos(uRow,uCol);
i++;
}
}
unsigned char dprintf(char *fmt, ...)
{
va_list arg_ptr;
//char c1,c2,cData;
char tmpBuf[64]; // LCD显示数据缓冲区
//unsigned char i=0,j,uLen,uRow,uCol;
unsigned char uLen;
//unsigned int k;
//函数应用套用
va_start(arg_ptr, fmt);
uLen = (unsigned char)vsprintf(tmpBuf, fmt, arg_ptr);
va_end(arg_ptr);
display_string(uLen,tmpBuf);
return uLen;
}
void draw_pic(unsigned char x0,unsigned int y0,
unsigned char x1,unsigned int y1,
unsigned char *picture)
{
unsigned char add_h=0;
unsigned char add_l=0;
unsigned int add=0;
unsigned char x=0;
unsigned char y=0;
unsigned char i=0;
for(y=y0;y<y1;y++){
add=x0+y*32;
add_l=0;
add_l=add;
add_h=0;
add_h=add>>8;
lcd_comm_w_2(LC_ADD_POS,add_l,add_h);
lcd_comm_w(LC_AUT_WR);
for(x=x0;x<x1;x++){
lcd_data_w(picture[i]);
i++;
}
lcd_comm_w(LC_AUT_OVR);
}
}
void draw_dot(unsigned int x0,unsigned int y0)
{
unsigned int x;
unsigned char draw_data=0x80;
unsigned char add_h=0;
unsigned char add_l=0;
unsigned int add=0;
//int xdata temp;
x=x0/8;
draw_data=draw_data>>x0%8;
add=x+y0*32;
add_l=0;
add_l=add;
add_h=0;
add_h=add>>8;
lcd_comm_w_2(LC_ADD_POS,add_l,add_h);
lcd_comm_w(LC_NOC_RD);
draw_data=draw_data|lcd_data_r();
lcd_comm_w(LC_AUT_WR);
lcd_data_w(draw_data);
lcd_comm_w(LC_AUT_OVR);
}
void draw_hor_line(unsigned int x0,
unsigned int y0,
unsigned int x1)
{
unsigned int x_0;
unsigned int x_1;
unsigned char draw_data_first=0xff;
unsigned char draw_data_last=0xff;
unsigned char add_h=0;
unsigned char add_l=0;
unsigned int add=0;
//int xdata temp;
//x1-x0 <8
unsigned int i;
x_0=x0/8;
x_1=x1/8;
if(x_0!=x_1){
draw_data_first=draw_data_first>>x0%8;
draw_data_last=draw_data_last<<(8-x1%8);
if((x1%8)==0){
draw_data_last=0xff;
}
}
else{
draw_data_first=draw_data_first>>x0%8;
if((x1%8)!=0){
draw_data_first=draw_data_first<<(8-x1%8);
draw_data_first=draw_data_first>>(8-x1%8);
}
}
if(x_0!=x_1){
//draw_firt;
add=x_0+y0*32;
add_l=0;
add_l=add;
add_h=0;
add_h=add>>8;
lcd_comm_w_2(LC_ADD_POS,add_l,add_h);
//command_null(LC_NOC_RD);
//draw_data=draw_data|lcd_data_r();
lcd_comm_w(LC_AUT_WR);
lcd_data_w(draw_data_first);
if((x1%8)==0)
x_1--;
for(i=x_0+1;i<x_1;i++){
lcd_data_w(0xff);
}
lcd_data_w(draw_data_last);
lcd_comm_w(LC_AUT_OVR);
}
else{
add=x_0+y0*32;
add_l=0;
add_l=add;
add_h=0;
add_h=add>>8;
lcd_comm_w_2(LC_ADD_POS,add_l,add_h);
//command_null(LC_NOC_RD);
//draw_data=draw_data|lcd_data_r();
lcd_comm_w(LC_AUT_WR);
lcd_data_w(draw_data_first);
lcd_comm_w(LC_AUT_OVR);
}
}
void draw_ver_line(unsigned int x0,
unsigned int y0,
unsigned int y1)
{
unsigned int x;
unsigned char draw_data=0x80;
unsigned char add_h=0;
unsigned char add_l=0;
unsigned int add=0;
unsigned int i;
unsigned char draw_data_temp;
//int temp;
x=x0/8;
draw_data=draw_data>>x0%8;
for(i=y0;i<y1;i++){
add=x+i*32;
add_l=0;
add_l=add;
add_h=0;
add_h=add>>8;
lcd_comm_w_2(LC_ADD_POS,add_l,add_h);
lcd_comm_w(LC_NOC_RD);
draw_data_temp=draw_data|lcd_data_r();
lcd_comm_w(LC_AUT_WR);
lcd_data_w(draw_data_temp);
lcd_comm_w(LC_AUT_OVR);
}
}
void creat_button(unsigned char x0,unsigned char y0,//
unsigned char x1,unsigned char y1,//
unsigned char black_white,
char *fmt, ...)
{
va_list arg_ptr;
char tmpBuf[64]; // LCD显示数据缓冲区
unsigned char uLen;
unsigned int x0_0=0;
unsigned int x1_1=0;
//函数应用套用
va_start(arg_ptr, fmt);
uLen = (unsigned char)vsprintf(tmpBuf, fmt, arg_ptr);
va_end(arg_ptr);
x0_0=x0*8;
x1_1=x1*8;
draw_hor_line(x0_0,y0-1,x1_1);
draw_hor_line(x0_0,y1,x1_1+1);
draw_hor_line(x0_0+1,y1+1,x1_1);
draw_ver_line(x0_0-1,y0,y1);
draw_ver_line(x1_1,y0,y1);
draw_ver_line(x1_1+1,y0+1,y1);
//设置光标位置
//显示字符串
cursor(x0,y0);
display_string_2(uLen,tmpBuf,black_white);
}
void creat_dialog(unsigned int x0,unsigned int y0,
unsigned int x1,unsigned int y1,
char *fmt, ...)
{
va_list arg_ptr;
char tmpBuf[64]; // LCD显示数据缓冲区
unsigned char uLen;
unsigned int x0_0=0;
unsigned int x1_1=0;
//函数应用套用
va_start(arg_ptr, fmt);
uLen = (unsigned char)vsprintf(tmpBuf, fmt, arg_ptr);
va_end(arg_ptr);
x0_0=x0*8;
x1_1=x1*8;
draw_hor_line(x0_0,y0-1,x1_1);
//draw_pic(x0,y0, x0+counter_temp, y0+16,picture);
cursor(x0,y0);
display_string(uLen,tmpBuf);
draw_hor_line(x0_0,y0+17,x1_1);
draw_hor_line(x0_0,y1,x1_1+1);
draw_hor_line(x0_0+1,y1+1,x1_1);
draw_ver_line(x0_0-1,y0,y1);
draw_ver_line(x1_1,y0,y1);
draw_ver_line(x1_1+1,y0+1,y1);
}
void diplay_top_state(void){
draw_hor_line(2 ,1 ,317-64);
draw_ver_line(1 ,2 ,21 );
draw_ver_line(317-64,2 ,22 );
draw_ver_line(318-64,3 ,21 );
draw_hor_line(2 ,21,318-64);
draw_hor_line(3 ,22,317-64);
}
void diplay_bottom_state(void){
draw_hor_line(2 ,1+216+16 ,317-64 );
draw_ver_line(1 ,2+216+16 ,21+216+16);
draw_ver_line(317-64,2+216+16 ,22+216+16);
draw_ver_line(318-64,3+216+16 ,21+216+16);
draw_hor_line(2 ,21+216+16,318-64 );
draw_hor_line(3 ,22+216+16,317-64 );
}
//leaf logo
void display_logo(void){
draw_pic(0,0,30,64,tr_elec);
OSTimeDly(256); /* Delay 256 clock tick */
// cls();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -