[应用方案] LCD12864显示

[复制链接]
1141|0
 楼主| janewood 发表于 2023-11-19 20:00 | 显示全部楼层 |阅读模式


  1. 液晶显示程序
  2. void busy12864()
  3. {
  4.         lcdDat=0xff;    //口线置1,防止干扰
  5.         rs=0; rw=1;           //置“命令、读”模式
  6.         //en=1; while(lcdDat&0x80); en=0;//忙等待
  7. }
  8. /** 写命令 参数:comDat为要发送的命令 **/
  9. void WriteCom(uchar comDat)
  10.         {  
  11.     busy12864();                     //忙,则等待
  12.         rs=0;rw=0;                                //置“命令、写”模式
  13.     lcdDat=comDat;en=1;en=0;//送出命令,并使之有效
  14. }
  15. /** 写数据 参数:dat为要发送的数据 **/
  16. void WriteDat(uchar dat){  
  17.     busy12864();                           //忙,则等待
  18.         rs=1;rw=0;                                  //置“数据、写”模式
  19.     lcdDat=dat;en=1;en=0;        //送出数据,并使之有效
  20. }


  21. /******** 任意尺寸点阵显示函数 ***********|
  22. |参数:显示位置:row页数,col列号,                  |
  23. |           字符大小:x横向像素,y纵向页数          |
  24. |           显示内容:tab字模表          ******/
  25. void showXY(uchar row,uchar col,uchar x,uchar y,uchar *tab){
  26.         uchar i,j;
  27.         bit right;
  28.         if(col<64){right=0;}
  29.         else {col-=64;right=1;}        
  30.         for(i=0;i<y;i++){
  31.                 if(right)cs1=1,cs2=0;
  32.                 else  cs1=0,cs2=1;
  33.                 WriteCom(addX0+row+i);
  34.                 WriteCom(addY0+col);   
  35.                 for(j=0;j<x;j++){
  36.                         if(col+j<64)WriteDat(tab[i*x+j]);
  37.                         else if(right==0)
  38.                                 {                 
  39.                                  cs1=1,cs2=0;                 
  40.                                  WriteCom(addX0+row+i);         
  41.                                  WriteCom(addY0+(col+j-64));
  42.                                  WriteDat(tab[i*x+j]);
  43.                          }                                                
  44.                 }
  45.         }
  46. }

  47. /* 返回一个8*16字符索引位置 */                                       
  48. uchar enN(uchar *s){
  49.         uchar i;
  50.         for(i=0;zm8x16_index[ i]!=0;i++)
  51.                 if(zm8x16_index[ i]==s[0])break;
  52.         return i;        
  53. }
  54. /* 返回一个16*16字符索引位置 */
  55. uchar cnN(uchar *s){
  56.         uchar i;
  57.         for(i=0;zm16x16_index[ i]!=0;i+=2)
  58.                 if(zm16x16_index[ i]==*s&&zm16x16_index[i+1]==*(s+1))break ;
  59.         return i/2;
  60. }
  61. /* 显示中英文字符串 */
  62. void showStr(uchar row,uchar col,uchar *s)
  63. {
  64.          uchar i;
  65.          for(i=0;s[ i]!=0;i++){
  66.                  if(s[ i]<0x80){      
  67.                         showXY(row,col,8,2,zm8x16_Table[enN(&s[ i])]);
  68.                         col+=8;
  69.                 }else{                        
  70.                         showXY(row,col,16,2,zm16x16_Table[cnN(&s[ i])]);     
  71.                         col+=16;i+=1;               
  72.                 }
  73.                 if(col>120)
  74.                 {         
  75.                         col=0;
  76.                         row+=2;
  77.                 }
  78.          }
  79. }


您需要登录后才可以回帖 登录 | 注册

本版积分规则

61

主题

1540

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部