📄 driver.lst
字号:
1131 //}
1132
1133 uchar LcdReadData(uint CS)
1134 {
1135 1 uchar ReadData;
1136 1 uchar State = 0x80;
1137 1 uint ChipAdr;
1138 1
1139 1 // LcdBusyCheck(CS);
1140 1 ChipAdr = StatusReadAdr|CS;
1141 1 while(State & 0x80)
1142 1 {
1143 2 State = XBYTE[ChipAdr];
1144 2 }
1145 1 ChipAdr = ReadDataAdr|CS;
1146 1 ReadData = XBYTE[ChipAdr];
1147 1 return ReadData;
1148 1 }
1149
1150 void LcdWriteData(uchar WriteData,uint CS)
1151 {
1152 1 uint ChipAdr;
1153 1 uchar State = 0x80;
1154 1
1155 1 // LcdBusyCheck(CS);
1156 1 ChipAdr = StatusReadAdr|CS;
1157 1 while(State & 0x80)
1158 1 {
1159 2 State = XBYTE[ChipAdr];
1160 2 }
1161 1 ChipAdr = WriteDataAdr|CS;
1162 1 XBYTE[ChipAdr] = WriteData;
1163 1 }
1164
1165 void LcdWriteCommand(uchar Command,uint CS)
1166 {
1167 1 uint ChipAdr;
1168 1 uchar State = 0x80;
1169 1
1170 1 // LcdBusyCheck(CS);
C51 COMPILER V8.01 DRIVER 03/28/2006 09:48:45 PAGE 20
1171 1 ChipAdr = StatusReadAdr|CS;
1172 1 while(State & 0x80)
1173 1 {
1174 2 State = XBYTE[ChipAdr];
1175 2 }
1176 1 ChipAdr = InstructionSetAdr|CS;
1177 1 XBYTE[ChipAdr] = Command;
1178 1 }
1179
1180 //**************************************************************/
1181
1182 //画点函数
1183 //DisON=1为画点 DisON=0为消点
1184 void LcdDisplayDot(uchar Dot_X,uchar Dot_Y,uchar DisON)
1185 {
1186 1 uchar x,y,y1,dat;
1187 1 uint cs;
1188 1
1189 1 if(Dot_X<64)
1190 1 {
1191 2 cs=LcdChip1;
1192 2 x=Dot_X;
1193 2 }
1194 1 else
1195 1 {
1196 2 if(Dot_X<128)
1197 2 {
1198 3 cs=LcdChip2;
1199 3 x=Dot_X-64;
1200 3 }
1201 2 else
1202 2 {
1203 3 cs=LcdChip3;
1204 3 x=Dot_X-128;
1205 3 }
1206 2 }
1207 1 x |= 0x40;
1208 1 y=Dot_Y / 8;
1209 1 y|=0xb8;
1210 1 y1=Dot_Y % 8;
1211 1 y1=1<<y1;
1212 1 LcdWriteCommand(x,cs); //X 座标
1213 1 LcdWriteCommand(y,cs); //Y 座标
1214 1 dat=LcdReadData(cs); //必须先虚读一次
1215 1 dat=LcdReadData(cs);
1216 1 if(DisON)
1217 1 dat|= y1; //画点
1218 1 else
1219 1 dat=dat & (!(1<<y1)); //消点
1220 1 LcdWriteCommand(x,cs); //X 座标
1221 1 LcdWriteCommand(y,cs); //Y 座标
1222 1 LcdWriteData(dat,cs);
1223 1 }
1224
1225 void LcdTurnOn()
1226 {
1227 1 // LcdWriteCommand(0x3E,1); //关闭LCD
1228 1 // LcdWriteCommand(0x3E,2);
1229 1 // LcdWriteCommand(0x3E,3);
1230 1
1231 1 LcdWriteCommand(0x3f,LcdChip1); //开LCD显示
1232 1 LcdWriteCommand(0x3f,LcdChip2);
C51 COMPILER V8.01 DRIVER 03/28/2006 09:48:45 PAGE 21
1233 1 LcdWriteCommand(0x3f,LcdChip3);
1234 1
1235 1 LcdWriteCommand(0xc0,LcdChip1); //起始行设置指令 左半屏
1236 1 LcdWriteCommand(0xc0,LcdChip2); //起始行设置指令 中半屏
1237 1 LcdWriteCommand(0xc0,LcdChip3); //起始行设置指令 右半屏
1238 1 }
1239
1240 //清屏
1241 void LcdClear(uchar LastCol)
1242 {
1243 1 unsigned char i,j,k;
1244 1 LastCol -= 128;
1245 1 for(i=0;i<8;i++)
1246 1 {
1247 2 k=i|0xb8;
1248 2 LcdWriteCommand(k,LcdChip1);
1249 2 LcdWriteCommand(k,LcdChip2);
1250 2 LcdWriteCommand(k,LcdChip3);
1251 2 LcdWriteCommand(0x40,LcdChip1); //列地址设置指令 左半屏
1252 2 LcdWriteCommand(0x40,LcdChip2); //列地址设置指令 右半屏
1253 2 LcdWriteCommand(0x40,LcdChip3); //列地址设置指令 右半屏
1254 2 for(j=0;j<64;j++)
1255 2 {
1256 3 LcdWriteData(0x0,LcdChip1);
1257 3 LcdWriteData(0x0,LcdChip2);
1258 3 if(j<LastCol)LcdWriteData(0x0,LcdChip3);
1259 3 }
1260 2 }
1261 1 }
1262
1263 //清屏
1264 void LcdClearLine(uchar Line,uchar LastCol)
1265 {
1266 1 unsigned char i,var;
1267 1
1268 1 LastCol -= 128;
1269 1 var = Line|0xb8;
1270 1 LcdWriteCommand(var,LcdChip1);
1271 1 LcdWriteCommand(var,LcdChip2);
1272 1 LcdWriteCommand(var,LcdChip3);
1273 1 LcdWriteCommand(0x40,LcdChip1); //列地址设置指令 左半屏
1274 1 LcdWriteCommand(0x40,LcdChip2); //列地址设置指令 右半屏
1275 1 LcdWriteCommand(0x40,LcdChip3); //列地址设置指令 右半屏
1276 1 for(i=0;i<64;i++)
1277 1 {
1278 2 LcdWriteData(0x0,LcdChip1);
1279 2 LcdWriteData(0x0,LcdChip2);
1280 2 if(i<LastCol)LcdWriteData(0x0,LcdChip3);
1281 2 }
1282 1 }
1283
1284 /////////////////////////////////////////////////////////////////////////////
1285 //函数:long g20(uchar c1, uchar c2, uchar c3, uchar c4)
1286 //功能:计算汉字点阵在芯片中的地址
1287 //参数:c1,c2,c3,c4:4字节汉字内码通过参数c1,c2,c3,c4传入,双字节内码通过参数c1,c2传入,c3=0,c4=0
1288 //返回:汉字点阵的字节地址(byte address)。如果用户是按 word mode 读取点阵数据,则其地址(word
1289 //address)为字节地址除以2,即:word address = byte address / 2 .
1290 //例如:“啊”字的内码为0xb0a1,则byte address = g(0xb0,0xa1,0x00,0x00) *32+0xa7700
1291 //word address = byte address / 2
1292 //“ ”字的内码为0x8139ee39,则byte address = g(0x81,0x39,0xee,0x39) *32+0xa7700
1293 //word address = byte address / 2
1294 //说明:在以上计算字节地址中byte address = g(0xb0,0xa1,0x00,0x00) *32+0xa7700的0xa7700是15X16
C51 COMPILER V8.01 DRIVER 03/28/2006 09:48:45 PAGE 22
1295 //点阵字库相对整个字库芯片0000 0000的偏移地址
1296 /////////////////////////////////////////////////////////////////////////////
1297
1298 ulong CountZkAdr(uchar c1, uchar c2, uchar c3, uchar c4)
1299 {
1300 1 ulong h;
1301 1
1302 1 if(c1 >= 0xb0 && c2 >= 0xA1 && c3 == 0 && c4 == 0)//汉字2区 B0A1 --- F7FE 0xAF8C0
1303 1 {
1304 2 return (ulong)((c1-0xB0)*94+(c2-0xA1))*32+0xAF8C0;
1305 2 }
1306 1 else if(c1 >= 0xAA && c2 >= 0x40 && c3 == 0 && c4 == 0)//16点阵4区汉字 AA40 --- FEAE 0x113EC0
1307 1 {
1308 2 if(c2>0x7f)c2--;
1309 2 if(c2 > 0xA0) c2 = 0x40;
1310 2 return (ulong)((c1-0xAA)*96+(c2-0x40))*32+0x113EC0;
1311 2 }
1312 1 else if(c1 >= 0xA8 && c3 == 0 && c4 == 0)//字符5区 A840 --- A996 0xAE0C0
1313 1 {
1314 2 if(c1>=0xA8 && c2>=0xA1);
1315 2 else if(c2>0x7f)c2--;
1316 2 if(c2>=0xA1)
1317 2 return (ulong)((c1-0xA1)*94+(c2-0xA1))*32+0xA7700;
1318 2 else
1319 2 return (ulong)((c1-0xA8)*96+(c2-0x40))*32+0xAE0C0;
1320 2 }
1321 1
1322 1 else if(c1 >= 0xA1 && c3 == 0 && c4 == 0)//字符1区 A1A1 --- A9FE 0xA7700
1323 1 {
1324 2 return (ulong)((c1-0xA1)*94+(c2-0xA1))*32+0xA7700;
1325 2 }
1326 1 else if(c1 >= 0x81 && c3 == 0 && c4 == 0)//汉字3区 8140 --- A0FE 0xE46C0
1327 1 {
1328 2 if(c2>0x7f)c2--;
1329 2 return (ulong)((c1-0x81)*190+(c2-0x40))*32+0xE46C0;
1330 2 }
1331 1 else if(c2>=0x30)//汉字4区
1332 1 {
1333 2 // four bytes HZ
1334 2 h=(((ulong)(c1-0x81)*10+(c2-0x30))*126+(ulong)(c3-0x81))*10+(c4-0x30);
1335 2 h-=12439;
1336 2 if(h<0 || h>=6530) return(0);
1337 2 h += 22046;
1338 2 return h*32+0xA7700;
1339 2 }
1340 1 }
1341
1342
1343 //功能:在LCD指定位置显示一行汉字或字符(16*16或8*16)
1344 //参数说明:
1345 //x 显示起行(0~63只能是8的倍数) y显示起始列(0~191)
1346 //str需要显示的字符指针
1347 //mode低4位=0:只显示不清除其它内容;
1348 //mode低4位=1:清除本行原有内容并显示;
1349 //mode低4位=2:清除整屏内容并显示;
1350 //mode低4位=10D只显示不清除其它内容并在字符最上面补画一横线,用于画表用
1351 //mode低4位=11D只显示不清除其它内容并在字符最下面补画一横线,用于画表用
1352 //mode低4位=12D只显示不清除其它内容并在字符最上面和下面补画一横线,用于画表用
1353 //mode高4位!=0:反白显示,
1354 //mode高4位==0:正常显示。
1355 //NotLen需要取反显示的字符长度
1356 void LcdDisplay(uchar x,uchar y,uchar *str,uchar mode)
C51 COMPILER V8.01 DRIVER 03/28/2006 09:48:45 PAGE 23
1357 {
1358 1 uchar Buff[2][192]; //显示缓冲区 上半行和下半行
1359 1 uint i,j,poz,DisStart, DisEnd;
1360 1 uchar len,val,k,bm1,bm2,bm3,bm4,hzi;
1361 1 ulong addr;
1362 1 uchar SendPos;
1363 1
1364 1 if(str[0]==0 || str[0]=='\0')return;
1365 1 len = strlen(str); //字符长度
1366 1 x/=8;
1367 1 poz = y;
1368 1 memset(Buff,0,sizeof(Buff)); //清显示缓冲区
1369 1 for(i=0;i<len;i++) //读出点阵数据放入缓显示冲区
1370 1 {
1371 2 if(str[i]>0x80)
1372 2 {
1373 3 k=16;
1374 3 hzi = i;
1375 3 bm1=str[hzi++];
1376 3 bm2=str[hzi++];
1377 3 bm3=str[hzi++];
1378 3 bm4=str[hzi];
1379 3 if(bm1 >= 0x82 && bm2 > 0x35)
1380 3 {
1381 4 bm3 = bm4 = 0;
1382 4 i += 1;
1383 4 }
1384 3 else i += 3;
1385 3 addr = CountZkAdr(bm1,bm2,bm3,bm4);
1386 3 }
1387 2 else
1388 2 {
1389 3 k=8;
1390 3 addr = 0x18A010+(str[i]-0x20)*16;
1391 3 }
1392 2 SerialFlashRead(Flashziku,addr,k,Buff[0]+poz);
1393 2 SerialFlashRead(Flashziku,addr+k,k,Buff[1]+poz);
1394 2 poz+=k;
1395 2 if(poz>192)
1396 2 {
1397 3 poz=192;
1398 3 break;
1399 3 }
1400 2 }
1401 1 if(mode & 0xf0) //高4位为1反白显示,为0正常显示
1402 1 {
1403 2 for(j=y;j<poz;j++)
1404 2 {
1405 3 Buff[0][j] = ~Buff[0][j];
1406 3 Buff[1][j] = ~Buff[1][j];
1407 3 }
1408 2 }
1409 1 j=0;
1410 1 switch(mode & 0x0f)
1411 1 {
1412 2 case 2: j=184; //清除其余三行(不包括滚动条)并显示
1413 2
1414 2 case 3: if(j==0)j=192;
1415 2 for(i=0;i<8;i++) //清除其余三行(包括滚动条)并显示
1416 2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -