⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 driver.lst

📁 用keil开发的.单片机税控器程序.单片机用的是AT公司的.upsd3245
💻 LST
📖 第 1 页 / 共 5 页
字号:
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 + -