安徽财经大学信息工程学院本科课程论文(设计)
for(i=5;i>0;i--) {
if((LCMCW & 0x03) == 0x03) break; }
return i; // 若返回零,说明错误 }
uchar Status_BIT_3(void) // 状态位ST3判断(数据自动写状态) {
uchar i;
for(i=5;i>0;i--) {
if((LCMCW & 0x08) == 0x08) break; }
return i; // 若返回零,说明错误 }
uchar LCD_Write_Command_P2(uchar cmd,uchar para1,uchar para2) // 写双参数的指令 {
if(Status_BIT_01() == 0) return 1; LCMDW = para1;
if(Status_BIT_01() == 0) return 2; LCMDW = para2;
if(Status_BIT_01() == 0) return 3; LCMCW = cmd;
return 0; // 返回0成功 }
uchar LCD_Write_Command_P1(uchar cmd,uchar para1) // 写单参数的指令 {
if(Status_BIT_01() == 0) return 1; LCMDW = para1;
if(Status_BIT_01() == 0) return 2; LCMCW = cmd;
return 0; // 返回0成功 }
uchar LCD_Write_Command(uchar cmd) // 写无参数的指令 {
if(Status_BIT_01() == 0)
17
安徽财经大学信息工程学院本科课程论文(设计)
return 1; LCMCW = cmd;
return 0; // 返回0成功 }
uchar LCD_Write_Data(uchar dat) // 写数据 {
if(Status_BIT_3() == 0) return 1; LCMDW = dat;
return 0; // 返回0成功 }
uchar LCD_Read_Data() // 读数据 {
if(Status_BIT_01() == 0) return 1;
return LCMDW; }
void Set_LCD_Pos(uchar row, uchar col)reentrant//设置当前地址 {
uint Pos;
Pos = row * LCD_WIDTH+ col;
LCD_Write_Command_P2(LC_ADD_POS,Pos % 256,Pos / 256); //修改 gCurRow = row; gCurCol = col; }
// 清屏
void cls(void) {
uint i;
LCD_Write_Command_P2(LC_ADD_POS,0x00,0x00); // 置地址指针 LCD_Write_Command(LC_AUT_WR); // 自动写 for(i=0;i<0x2000;i++) {
Status_BIT_3();
LCD_Write_Data(0x00); // 写数据 }
LCD_Write_Command(LC_AUT_OVR); // 自动写结束
LCD_Write_Command_P2(LC_ADD_POS,0x00,0x00); // 重置地址指针 gCurRow = 0; // 置地址指针存储变量 gCurCol = 0;
18
安徽财经大学信息工程学院本科课程论文(设计)
}
// LCM 初始化
uchar LCD_Initialise() {
RESET=0; RESET=1;
LCD_Write_Command_P2(LC_TXT_STP,0x00,0x00); // 文本显示区首地址 LCD_Write_Command_P2(LC_TXT_WID,LCD_WIDTH,0x00); // 文本显示区宽度 LCD_Write_Command_P2(LC_GRH_STP,0x00,0x00); // 图形显示区首地址 LCD_Write_Command_P2(LC_GRH_WID,LCD_WIDTH,0x00); // 图形显示区宽度 LCD_Write_Command_P1(LC_CGR_POS,CGRAMSTART >> 11); LCD_Write_Command(LC_CUR_SHP | 0x01); // 光标形状 LCD_Write_Command(LC_MOD_OR); // 显示方式设置 LCD_Write_Command(LC_DIS_SW |0x08); grhome = GRSTART;
txthome = TXTSTART;
return 0; }
// ASCII及汉字显示函数
uchar Display_Str_at_xy(uchar x,uchar y,char *fmt) reentrant {
char c1,c2,cData; uchar i=0,j,uLen; uchar k;
uLen=strlen(fmt);
while(i c1 = fmt[i]; c2 = fmt[i+1]; Set_LCD_Pos(y,x/8); if(c1 >= 0) { // ASCII if(c1 < 0x20) { switch(c1) { 19 安徽财经大学信息工程学院本科课程论文(设计) case CR: case LF: // 回车或换行 i++; x=0; if(y < 112)y+=HZ_CHR_HEIGHT; continue; case BS: // 退格 i++; if(y>ASC_CHR_WIDTH)y-=ASC_CHR_WIDTH; cData = 0x00; break; } } for(j=0;j if(c1 >= 0x1f) { cData= ASC_MSK[(c1-0x1f)*ASC_CHR_HEIGHT+j]; Set_LCD_Pos(y+j,x/8); if((x%8)==0) { LCD_Write_Command(LC_AUT_WR); // 写数据 LCD_Write_Data(cData); LCD_Write_Command(LC_AUT_OVR); } else OutToLCD(cData,x,y+j); } Set_LCD_Pos(y+j,x/8); } if(c1 != BS) // 非退格 x+=ASC_CHR_WIDTH; } else { // 中文 for(j=0;j if(c1 == GB_16[j].Index[0] && c2 == GB_16[j].Index[1]) break; } for(k=0;k 20 安徽财经大学信息工程学院本科课程论文(设计) Set_LCD_Pos(y+k,x/8); if(j < sizeof(GB_16)/sizeof(GB_16[0])) { c1=GB_16[j].Msk[k*2]; c2=GB_16[j].Msk[k*2+1]; } else c1=c2=0; if((x%8)==0) { LCD_Write_Command(LC_AUT_WR); LCD_Write_Data(c1); LCD_Write_Command(LC_AUT_OVR); } else OutToLCD(c1,x,y+k); if(((x+2+HZ_CHR_WIDTH/2)%8)==0) { LCD_Write_Command(LC_AUT_WR); LCD_Write_Data(c2); LCD_Write_Command(LC_AUT_OVR); } else OutToLCD(c2,x+2+HZ_CHR_WIDTH/2,y+k); } x+=HZ_CHR_WIDTH; i++; } i++; } return uLen; } void OutToLCD(uchar Dat,uchar x,uchar y) { uchar dat1,dat2,a,b; b=x%8;a=8-b; Set_LCD_Pos(y,x/8); LCD_Write_Command(LC_AUT_RD); // 读数据 dat1=LCD_Read_Data(); dat2=LCD_Read_Data(); dat1=(dat1&(0xFF<>b); 21