高分求教:内置t6963c图形液晶显示程序请教,在线等

tanhx 2005-12-25 05:16:05
LCDADDER:
MOV A,BUF12
MOV B,#1EH
MUL AB
ADD A,BUF13
MOV R2,A
MOV A,B
ADDC A,#00H
MOV R3,A
MOV R4,#24H
LCALL WER234
RET

WER234: LCALL BUSYA
MOV A,R2
MOV DPTR,#LCDCE
MOVX @DPTR,A
WER34: LCALL BUSYA
MOV A,R3
MOV DPTR,#LCDCE
MOVX @DPTR,A
WER4: LCALL BUSYA
MOV A,R4
MOV DPTR,#LCDCD
MOVX @DPTR,A
RET
BUSYA: SETB IO_M
MOV DPTR,#LCDCD
MOVX A,@DPTR
ANL A,#03H
CJNE A,#03H,BUSYA
RET
CELCD: PUSH 1CH
PUSH 1DH
SETB IO_M
MOV R2,#00H
MOV R3,#00H
MOV R4,#24H
LCALL WER234
MOV 1CH,#00H
MOV 1DH,#00H
SETB IO_M
MOV R6,#80H ;1EH
CELCD1: MOV R7,#1EH ;80H
CELCD2: LCALL BUSYA
CLR A
MOV DPTR,#LCDCE
MOVX @DPTR,A
MOV DPTR,#LCDCD
MOV A,#0C0H
MOVX @DPTR,A
DJNZ R7,CELCD2
DJNZ R6,CELCD1
POP 1DH
POP 1CH
;WRLCD:
MOV R4,#0B3H
LCALL WER4
MOV R4,#98H
LCALL WER4
MOV R4,#80H
LCALL WER4
WRLCD: RET
LCDSTAT:CLR RESET
NOP
NOP
SETB RESET
MOV R2,#00H
MOV R3,#00H
MOV R4,#40H
LCALL WER234
MOV R2,#01EH
MOV R3,#00H
MOV R4,#41H
LCALL WER234
MOV R2,#00H
MOV R3,#00H
MOV R4,#42H
LCALL WER234
MOV R2,#01EH
MOV R3,#00H
MOV R4,#43H
LCALL WER234
MOV R4,#98H
LCALL WER4
MOV R4,#80H
LCALL WER4
LCALL CELCD
RET
LDROM: MOV BUF15,DPH
MOV BUF16,DPL
MOV A,R7
ADD A,R7
MOV 05H,A
SETB IO_M
LDROM1: MOV DPH,BUF15
MOV DPL,BUF16
CLR A
MOVC A,@A+DPTR
CJNE A,#90H,LDROMO
LDROMO: JC ROM20
MOV R0,#1EH
MOV R7,#02H
LCALL LETRC
MOV BUF15,DPH
MOV BUF16,DPL
LCALL RDHZ
MOV BUF12,BUF10
MOV BUF13,BUF11
MOV R0,#40H
MOV R7,#10H
LDROM2: LCALL LCDADDER
MOV A,@R0
MOV DPTR,#LCDCE
MOVX @DPTR,A
MOV DPTR,#LCDCD
MOV A,#0C0H
MOVX @DPTR,A
INC R0
MOV A,@R0
MOV DPTR,#LCDCE
MOVX @DPTR,A
MOV DPTR,#LCDCD
MOV A,#0C0H
MOVX @DPTR,A
INC R0
INC BUF12
DJNZ R7,LDROM2
INC BUF11
INC BUF11
DEC R5
LDROM3: DJNZ R5,LDROM1
RET
以上为一段显示程序,显示几个汉字,由于没有注释,看不大懂,请高手帮助解释一下,非常感谢!!
...全文
184 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
delbrueck 2006-05-19
  • 打赏
  • 举报
回复
刚做了各键盘+6963
zhk1124 2006-05-18
  • 打赏
  • 举报
回复




uchar fnGetRow(void) //取得当前行
{
return gCurRow;

}

////////////////////////////////////////////////////////////////////////////////
uchar fnGetCol(void) //取得当前列
{
return gCurCol;
}

/////////////////////////////////////////////////////////////////////////////////
uchar fnST01(void) //状态位SA1,SA0判断(读写指令和读写数据)
{
uchar i;
for(i=10;i>0;i++)
{
if((Dat6963 & 0X03)==0X03)
break;
}
return i;
}


///////////////////////////////////////////////////////////////////////////////
uchar fnST02(void)
{
uchar i;
for(i=10;i>0;i++)
{
if((Dat6963 & 0X04)==0X04)
break;
}
return i;
}
//////////////////////////////////////////////////////////////////////////////
uchar fnST03(void)
{
uchar i;
for(i=10;i>0;i++)
{
if((Dat6963 & 0X08)==0X08)
break;
}
return i;
}
//////////////////////////////////////////////////////////////////////////
uchar fnST06(void)
{
uchar i;
for(i=10;i>0;i++)
{
if((Dat6963 & 0X40)==0X40)
break;
}
return i;
}
////////////////////////////////////////////////////////////////////////////////////////
uchar fnPR01(uchar uCmd,uchar uPar1,uchar uPar2) //写双参数指令
{
if(fnST01()==0)
return 1;
Com6963 = uPar1;
if(fnST01()==0)
return 2;
Com6963 = uPar2;
if(fnST01()==0)
return 3;
Com6963 = uCmd;;
return 0; //返回成功
}

/////////////////////////////////////////////////////////////////////////////////////////
uchar fnPR11(uchar uCmd,uchar uPar1) //写单参数指令
{
if(fnST01()==0)
return 1;
Com6963 = uPar1;
if(fnST01()==0)
return 2;
Com6963 = uCmd;;
return 0; //返回成功
}
////////////////////////////////////////////////////////////////////////////////////////////
uchar fnPR12(uchar uCmd) //写无参数指令
{
if(fnST01()==0)
return 1;
Com6963 = uCmd;;
return 0; //返回成功
}
///////////////////////////////////////////////////////////////////////////////////////////
uchar fnPR13(uchar uData) //写数据程序
{
if(fnST03()==0)
return 1;
Com6963 = uData;
return 0; //返回成功
}
///////////////////////////////////////////////////////////////////////////////////////////
uchar fnPR2(void) //读数据程序
{
if(fnST01()==0)
return 1;
return Com6963;
}
//////////////////////////////////////////////////////////////////////////////////////////
void fnSetPos(uchar urow,uchar ucol) //设置当前地址程序
{
uint iPos;
iPos = urow * 30 + ucol;
fnPR01(SET_ADD_POINTER,iPos&0xFF,iPos/256);
gCurRow = urow;
gCurCol = ucol;
}
////////////////////////////////////////////////////////////////////////////////////////////
void cCurSor(uchar uRow,uchar uCol) //设置当前显示行列
{
fnSetPos(uRow * 16,uCol);


}
///////////////////////////////////////////////////////////////////////////////////////////
void Cls(void) //清除屏幕
{
uint i;
fnPR01(SET_ADD_POINTER,0x00,0x00); //设置地址指针
fnPR12(SET_DATE_AUTO_WROTE);
for(i = 0;i<240 * 30;i++)
{
fnST03();
fnPR13(0x00);
}
fnPR12(SET_AUTO_RESET);
fnPR01(SET_ADD_POINTER,0x00,0x00);
gCurRow = 0;
gCurCol = 0;
}
zhk1124 2006-05-18
  • 打赏
  • 举报
回复
//zhk6963.h

////////////////////////////////////////////////////////////////////////////////////////
//端口地址的定义
#define Dat6963 XBYTE[0XF000] //6936数据口
#define Com6963 XBYTE[0XF001] //6963命令口
#define ROMEX XBYTE[0XE000] //内存扩展口地址

/////////////////////////////////////////////////////////////////////////////////////////
//6963设置寄存器命?
#define SET_CURS_POINTER 0X21 //设置光标指针
#define SET_OFFSET_REGISTER 0X22 //设置偏移寄存器
#define SET_ADD_POINTER 0X24 //设置地址指示器
/////////////////////////////////////////////////////////////////////////////////
//6963设置控制命令定义
#define SET_TEXT_HOME_ADD 0X40 //设置正文首地址
#define SET_TEXT_AREA 0X41 //设置正文区域(宽度)
#define SET_GRAPHIC_HOME_ADD 0X42 //设置图形首地址
#define SET_GRAPHIC_AREA 0X43 //设置图形区域(宽度)
/////////////////////////////////////////////////////////////////////////////////
//6963模式设置

#define SET_OR_MODE_INTEMAL 0X80 //设置片内CGROM,为或模式,
#define SET_EXOR_MODE_INTEMAL 0X81 //设置片内CGROM,为异或模式,
#define SET_AND_MODE_INTEMAL 0X83 //设置片内CGROM,为与模式
#define SET_TEXT_ATT_INTEMAL 0X84 //设置片内CGROM,为文本模式
#define SET_OR_MODE_EXTEMAL 0X88 //设置片外CGROM,为或模式,
#define SET_EXOR_MODE_EXTEMAL 0X89 //设置片外CGROM,为异或模式,
#define SET_AND_MODE_EXTEMAL 0X8B //设置片外CGROM,为与模式
#define SET_TEXT_ATT_EXTEMAL 0X8C //设置片外CGROM,为文本模式


#define SET_INTEMAL_CGROM 0X98 //
#define SET_EXTEMAL_CGROM 0X9C //
/////////////////////////////////////////////////////////////////////////////////
//6963设置显示模式命令定义
#define SET_DISP_OFF 0X90 //显示关

#define SET_CURSOR_ON_BLINK_OFF 0X92 //光标开,闪光关
#define SET_CURSOR_ON_BLINK_ON 0X93 //光标开,闪光开
// 光标闪光特性和下面特性应组合使用
#define SET_TEXT_ON_GRAPHIC_OFF 0X94 //文字开,图像关
#define SET_TEXT_OFF_GRAPHIC_ON 0X98 //文字关,图像开
#define SET_TEXT_ON_GRAPHIC_ON 0X9C //文字开,图像开
/////////////////////////////////////////////////////////////////////////////////
//6963设置光标式样命令定义
#define SET_CURS_LINE1 0XA0 //设置光标一行
#define SET_CURS_LINE2 0XA1 //设置光标二行
#define SET_CURS_LINE3 0XA2 //设置光标三行
#define SET_CURS_LINE4 0XA3 //设置光标四行
#define SET_CURS_LINE5 0XA4 //设置光标五行
#define SET_CURS_LINE6 0XA5 //设置光标六行
#define SET_CURS_LINE7 0XA6 //设置光标七行
#define SET_CURS_LINE8 0XA7 //设置光标八行



/////////////////////////////////////////////////////////////////////////////////
//6963数据自动读写命令定义
#define SET_DATE_AUTO_WROTE 0XB0 //设置数据自动写
#define SET_DATE_AUTO_READ 0XB1 //设置数据自动读
#define SET_AUTO_RESET 0XB2 //设置自动复位

/////////////////////////////////////////////////////////////////////////////////
//6963数据读写命令定义
#define SET_DATE_WRITE_INCADP 0XC0 //数据自动写,地址自动增加
#define SET_DATE_READ_INCADP 0XC1 //数据自动读,地址自动增加
#define SET_DATE_WRITE_DECADP 0XC2 //数据自动写,地址自动减少
#define SET_DATE_READ_DECADP 0XC3 //数据自动读,地址自动减少
#define SET_DATE_WRITE_NADP 0XC4 //数据自动写,地址不变
#define SET_DATE_READ_NADP 0XC5 //数据自动读,地址不变
/////////////////////////////////////////////////////////////////////////////////
//6963屏幕闪烁命令定义
#define SET_SCREEN_PEEK 0XE0 //屏幕闪烁
/////////////////////////////////////////////////////////////////////////////////
//6963屏幕复制命令定义
#define SET_SCREEN_COPY 0XE4 //屏幕复制

///////////////////////////////////////////////////////////////////////////////////
//6963测试命令定义
#define CMD_TEST6963_1 0X00 //6963测试命令1 测试ST0 ST1
#define CMD_TEST6963_2 0X01 //6963测试命令2 测试ST2
#define CMD_TEST6963_3 0X02 //6963测试命令3 测试ST3
#define CMD_TEST6963_4 0X03 //6963测试命令4 测试ST6
#define CMD_TEST6963_5 0X04 //6963测试命令5 测试ST0 ST7

icesnows 2006-05-18
  • 打赏
  • 举报
回复
这么长的程序,看起来都晕了。。还是自己琢磨琢磨,实在看不明白的再拿出来讨论吧,一上来贴这么大段代码,放倒一大片啊
zhk1124 2006-05-18
  • 打赏
  • 举报
回复
//LCM 初始化
uchar fnLCMInit(void)
{
if(fnPR01(SET_TEXT_HOME_ADD,0x00,0x00)!=0) //文本显示区首地址
return -1;
fnPR01(SET_TEXT_AREA,0x1E,0x00); //文本显示区宽度
fnPR01(SET_GRAPHIC_HOME_ADD,0x00,0x00); //图形显示区首地址
fnPR01(SET_GRAPHIC_AREA,0x1E,0x00); //图形显示区宽度
fnPR12(SET_CURS_LINE1|0X01); //光标形状
fnPR12(SET_OR_MODE_INTEMAL); //显示方式设置
fnPR12(SET_DISP_OFF|0X08); //显示开头设置
return 0;
}
wxf0204 2006-03-23
  • 打赏
  • 举报
回复
呵呵,还是先帮你顶一下吧!
色郎中 2006-03-23
  • 打赏
  • 举报
回复
呵呵,还是先帮你顶一下吧!
flowercity 2006-03-22
  • 打赏
  • 举报
回复
我写代码也不写注释
呵呵
自己猜吧

何况代码只要能用就可以

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧