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

📄 lcd.lst

📁 基于c8051f020的应用
💻 LST
📖 第 1 页 / 共 2 页
字号:
 175   4                                      line = y1 & 7; page = y1 >> 3;
 176   4                                      disp_ram[page][x1] |= (0x01 << line);
 177   4                                  temp_step += add_step;
 178   4                                      if(i) y1--;  else y1++;
 179   4      
 180   4                              }while(y1 != y2);
 181   3                              line = y2 & 0x07;  page = y2 >> 3;
 182   3                              disp_ram[page][x2] |= (0x01 << line);
 183   3                      }
 184   2             else     
 185   2                  { 
 186   3                              temp_step = y1;
 187   3                      add_step = ((float)y2-(float)y1)/abs((float)x2-(float)x1);
 188   3      
 189   3                      if(x1 > x2) i = 1; else i = 0;
 190   3                      do              
 191   3                      {
 192   4                                 y1 = temp_step;      
 193   4                                 line = y1 & 0x07;
 194   4                                 page = y1  >> 3;
 195   4      
 196   4                                 disp_ram[page][x1] |= (0x01 << line);
 197   4                                temp_step += add_step;
 198   4                            if(i) x1 -- ;  else x1 ++;
 199   4      
 200   4                          }while(x1 != x2);
 201   3                          line = y2 & 0x07;  page = y2 >> 3;
 202   3                          disp_ram[page][x2] |= (0x01 << line);
 203   3                  }
 204   2              }
 205   1      }
 206          //********************************************************************************************************
             -******************
 207          //入口为井名字符代码串指针,显示行值,列值,间隔
 208          void LCD_DispStr(unsigned char *addr_da, char disp_x, char disp_y)
 209          {
 210   1              xdata unsigned char ia;
 211   1              xdata unsigned char StrLong;
 212   1      
 213   1          ia = *addr_da++;
 214   1              //StrLong=lenth; 
 215   1              StrLong=strlen(addr_da)+1; 
 216   1      
 217   1              while((ia)&&(StrLong))
 218   1              {
 219   2                      if(ia >= 97 && ia <= 122)//"a-z"
 220   2                      {
 221   3                              display_asc8x8((ia - 0x2A - 32), disp_x , disp_y, 1,1);//换成大写的字母
 222   3                      }
 223   2                      else if(ia == 0x20)
 224   2                      {
 225   3                              display_asc8x8(49, disp_x , disp_y, 1,1);//空格
 226   3                      }
 227   2                      else if (ia > 125 || ia < 27)
 228   2                      {
 229   3                              display_asc8x8(0 , disp_x , disp_y, 1,1);
 230   3                      }//如果不是asc2码,用*表示
 231   2                      else 
C51 COMPILER V7.06   LCD                                                                   06/25/2008 15:44:08 PAGE 5   

 232   2                      {
 233   3                              display_asc8x8((ia - 0x2A), disp_x, disp_y, 1,1);
 234   3                      }
 235   2                      disp_y += 6;
 236   2                  ia = *addr_da++;
 237   2                      StrLong --;
 238   2              }
 239   1      }
 240          //********************************************************************************************************
             -******************
 241          //显示一个字符程序,asc_position为在ASC8X8的一维次序,
 242          void display_asc8x8(char asc_position,unsigned char page, unsigned char column, char val,unsigned char fx)
 243          {
 244   1              xdata unsigned char *ptr;
 245   1      
 246   1              ptr = ASC8X8[asc_position];
 247   1              display_asc8x6(ptr, page, column, val,fx);
 248   1      
 249   1      }
 250          //********************************************************************************************************
             -******************
 251          //显示8*6asc字符,将要显示的字符放在显示缓冲区中。asc字符可以选择是否覆盖原有显示,当val = 1时清除原有内容,
 252          void display_asc8x6(unsigned char *data_ptr,unsigned char page, unsigned char column, char val,unsigned ch
             -ar fx)
 253          {
 254   1         xdata unsigned  char i,j,k,st_data,page1,column1;
 255   1         xdata unsigned  char ii,ij;
 256   1         xdata unsigned  char hzdata[8];
 257   1         xdata unsigned  char hz_temp[8];
 258   1         
 259   1         unsigned char code *ptr;
 260   1      
 261   1         ptr = data_ptr;
 262   1         page1 = page;
 263   1         column1 = column;
 264   1         if(column1 > 122) column1 = 0;//列数到尾
 265   1         for (i=0;i<8;i++)
 266   1          {
 267   2                if(fx == 0)           
 268   2                {hz_temp[i] =~(*(ptr + i));}
 269   2            if(fx == 1) 
 270   2                {hz_temp[i] =*(ptr + i);} 
 271   2                k = hz_temp[i];
 272   2              }
 273   1      
 274   1         for (i = 0; i < 8;i++)
 275   1          {
 276   2                hzdata[i] = 0;        
 277   2                j = i;
 278   2            hzdata[i] = (((hz_temp[0] << j) & 0x80) >>7) | (((hz_temp[1] << j) & 0x80) >> 6);
 279   2            hzdata[i] |= (((hz_temp[2] << j) & 0x80) >> 5)  | (((hz_temp[3] << j) & 0x80) >> 4);
 280   2            hzdata[i] |= (((hz_temp[4] << j) & 0x80) >> 3)  | (((hz_temp[5] << j) & 0x80) >> 2);
 281   2            hzdata[i] |= (((hz_temp[6] << j) & 0x80) >> 1)  | ((hz_temp[7] << j) & 0x80) ;
 282   2              }
 283   1              k = page1 >> 3;
 284   1      
 285   1          if(k > 7) k &= 0x07 ;
 286   1              j = page1 & 0x07;
 287   1              if(j == 0) {ii = 0; ij = 0xf0;}
 288   1              else if(j == 1) {ii = 1; ij = 0xe1;}
 289   1              else if(j == 2) {ii = 0x03; ij = 0xc3;}
 290   1              else if(j == 3) {ii = 0x07; ij = 0x87;}
C51 COMPILER V7.06   LCD                                                                   06/25/2008 15:44:08 PAGE 6   

 291   1              else if(j == 4) {ii = 0x0f; ij = 0x0f;}
 292   1              else if(j == 5) {ii = 0x1f; ij = 0xf7;}
 293   1              else if(j == 6) {ii = 0x3f; ij = 0xfc;}
 294   1              else if(j == 7) {ii = 0x7f; ij = 0xf8;}
 295   1              if(val)// 清除原位置内容
 296   1              {
 297   2                      for(i = 0; i < 8; i++)
 298   2                      {
 299   3      
 300   3                              st_data = disp_ram[k][column1 + i-2 ];
 301   3                              disp_ram[k][column1 + i - 2] = (st_data & ii) | (hzdata[i] << j) ;
 302   3                              if(k < 7)
 303   3                              {
 304   4                              st_data = disp_ram[k+1][column1+i-2];
 305   4                                      disp_ram[k+1][column1+i-2] = (st_data & ~ii) | (hzdata[i] >> (8-j));
 306   4                              }
 307   3                              else
 308   3                              {
 309   4                                  st_data = disp_ram[0][column1+i-2];
 310   4                                  disp_ram[0][column1+i-2] = (st_data & ~ii) | (hzdata[i] >> (8-j));
 311   4                              }
 312   3                      }
 313   2              }
 314   1              
 315   1              else//保留原位置内容
 316   1              {
 317   2                      for(i = 0; i < 8; i++)
 318   2                      {
 319   3                              st_data = disp_ram[k][column1 + i-2 ];
 320   3                              disp_ram[k][column1 + i - 2] = st_data | (hzdata[i] << j) ;
 321   3      
 322   3                              if(k < 7)
 323   3                              {
 324   4                              st_data = disp_ram[k+1][column1+i-2];
 325   4                                      disp_ram[k+1][column1+i-2] = st_data  | (hzdata[i] >> (8-j));
 326   4                              }
 327   3                              else
 328   3                              {
 329   4                                  st_data = disp_ram[0][column1+i-2];
 330   4                                      disp_ram[0][column1+i-2] = st_data   | (hzdata[i] >> (8-j));
 331   4                              }
 332   3                      }
 333   2              }
 334   1      
 335   1      }
 336          //********************************************************************************************************
             -******************
 337          //显示12*12汉字,思路是先放前面的12个字符,这将会分两页来完成,写每页的时候先把要显示的区域清空,
 338          //再写上要写的内容。再写后面的12个字符,这将会出现在第二和第三页上,也是先把要显示的区域清空?
 339          //写第二页的的时候要注意保留写前12个字符时的内容,所以清空第二页的时候有可能是保留上下两头的数据,
 340          void display_hz1212(unsigned char* hz_idptr,unsigned char page,unsigned char column)
 341          {
 342   1              unsigned  char xdata i,j,k,st_data;
 343   1              unsigned  char xdata ii,ij,jj;
 344   1              unsigned  char xdata hzdata[24];
 345   1              unsigned  char xdata page1,column1;
 346   1              
 347   1              page1 = page;
 348   1              column1 = column;
 349   1              if(column1 > 117) column1 = 2;
 350   1              
 351   1              for(i = 0;i < 24;i ++)
C51 COMPILER V7.06   LCD                                                                   06/25/2008 15:44:08 PAGE 7   

 352   1              {       
 353   2                      hzdata[i] = *hz_idptr ++;
 354   2              
 355   2              }
 356   1              k = page1/8;//传入的page1是行地址,k为实际的页地址
 357   1              if(k > 7) k = (k % 8);
 358   1              j = page1%8;//j为除以8后的数,表示离标准的页地址中的第一行的距离
 359   1              if(j == 0) {ii = 0; ij = 0xf0;jj = 0xFF;}
 360   1              else if(j == 1) {ii = 1; ij = 0xe1;jj = 0xFF;}//当要显示的输出现在页的第1行(之前是第0行),需要把之后的7

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -