找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1962|回复: 5
收起左侧

单片机怎么把LCD1602程序在LCD12864里实现?

[复制链接]
ID:1019521 发表于 2022-5-7 21:55 | 显示全部楼层 |阅读模式
求大佬给段代码参考一下,或者给个思路,实在是想不出来了。
  1. #ifndef _LCD_12864
  2. #define _LCD_12864
  3. /*****************************预定义**************************************/
  4. #define uchar unsigned char
  5. #define uint unsigned int/***************************12864管脚配置****************************/
  6. #define port P2
  7. sbit  rs=P3^0;
  8. sbit  rw=P3^1;
  9. sbit   e=P3^2;
  10. sbit cs1=P3^3;
  11. sbit cs2=P3^4;
  12. /********************************************************************************************
  13. * 函数名称:Delay()
  14. * 功    能:延迟时间=a*1ms
  15. * 入口参数:
  16. * 出口参数:无
  17. *********************************************************************************************/
  18. void Delay(uint a)
  19. {
  20.    uchar  i;
  21.    while(a--)
  22.    for(i=0;i<125;i++);
  23. }
  24. /********************************************************************************************
  25. * 函数名称:Lcd_Display_On()
  26. * 功    能:LCD显示开
  27. * 入口参数:无
  28. * 出口参数:无
  29. *********************************************************************************************/
  30. void Lcd_Display_On()
  31. {  
  32.    port=0x3f;
  33.    rs=0;
  34.    rw=0;
  35.    e=1;
  36.    e=0;  
  37. }
  38. /********************************************************************************************
  39. * 函数名称:Lcd_Display_Off()
  40. * 功    能:LCD显示关
  41. * 入口参数:无
  42. * 出口参数:无
  43. *********************************************************************************************/
  44. void Lcd_Display_Off()
  45. {  
  46.    port=0x3e;
  47.    rs=0;
  48.    rw=0;
  49.    e=1;
  50.    e=0;  
  51. }
  52. /********************************************************************************************
  53. * 函数名称:Lcd_Set_X(uchar x)
  54. * 功    能:LCD设置X坐标
  55. * 入口参数:x
  56. * 出口参数:无
  57. *********************************************************************************************/
  58. void Lcd_Set_X(uchar x)
  59. {  
  60.    port=0xb8|x;
  61.    rs=0;
  62.    rw=0;
  63.    e=1;
  64.    e=0;  
  65. }
  66. /********************************************************************************************
  67. * 函数名称:Lcd_Set_Y(uchar y)
  68. * 功    能:LCD设置Y坐标
  69. * 入口参数:y
  70. * 出口参数:无
  71. *********************************************************************************************/
  72. void Lcd_Set_Y(uchar y)
  73. {  
  74.    port=0x40|y;
  75.    rs=0;
  76.    rw=0;
  77.    e=1;
  78.    e=0;  
  79. }
  80. /********************************************************************************************
  81. * 函数名称:Lcd_Set_X_Y(uchar x, uchar y )
  82. * 功    能:LCD设置x y坐标
  83. * 入口参数:x y
  84. * 出口参数:无
  85. *********************************************************************************************/
  86. void Lcd_Set_X_Y(uchar x, uchar y)
  87. {  
  88.    
  89.    if( y<64 )
  90.       { cs1=1; cs2=0; Lcd_Set_Y( y ); }
  91.    else
  92.       { cs1=0; cs2=1; Lcd_Set_Y( y-64 );  }
  93.     Lcd_Set_X( x);
  94. }
  95. /********************************************************************************************
  96. * 函数名称:Lcd_Write_Command()
  97. * 功    能:写指令代码
  98. * 入口参数:无
  99. * 出口参数:无
  100. *********************************************************************************************/
  101. /*void Lcd_pos(uchar x,uchar y)
  102. {
  103.         uchar pos;
  104.         switch(x)                                    
  105.      {
  106.           case 0:x=0x80;break;   
  107.           case 1:x=0x90;break;   
  108.           case 2:x=0x88;break;   
  109.           case 3:x=0x98;break;  
  110.     default:break;
  111.                  }
  112.                  pos=x+y;
  113. }

  114. /********************************************************************************************
  115. * 函数名称:Lcd_Write_Command()
  116. * 功    能:写指令代码
  117. * 入口参数:无
  118. * 出口参数:无
  119. *********************************************************************************************/
  120. void Lcd_Write_Command(uchar temp)
  121. {  
  122.    port=temp;
  123.    rs=0;
  124.    rw=0;
  125.    e=1;
  126.    e=0;  
  127. }
  128. /********************************************************************************************
  129. * 函数名称:Lcd_Write_Byte()
  130. * 功    能:写数据
  131. * 入口参数:无
  132. * 出口参数:无
  133. *********************************************************************************************/
  134. void Lcd_Write_Byte(uchar temp)
  135. {  
  136.    port=temp;
  137.    rs=1;
  138.    rw=0;
  139.    e=1;
  140.    e=0;  
  141. }
  142. /****************************************************************************
  143. *名称:Lcd_Character_16X8( bit bit_flag, uchar x, uchar y, uchar code *point )
  144. *功能:显示16X8字符(字母)         
  145. *入口参数:
  146. *出口参数:
  147. *说明:bit_flag = 1 正常显示  bit_flag = 0 黑白反相显示
  148. ****************************************************************************/
  149. void Lcd_Character_16X8( bit bit_flag, uchar x, uchar y, uchar code *point )
  150. {
  151.    uchar i , j,temp;
  152.    temp=y;
  153.    if( bit_flag )
  154.    {   
  155.       for( i=0; i<2; i++ )
  156.       {
  157.          x+=i;
  158.              y=temp;
  159.          for( j=0;j<8;j++ )
  160.          {
  161.             Lcd_Set_X_Y( x, y ); y++;
  162.             Lcd_Write_Byte( point[ i*8 + j] );  
  163.          }
  164.       }
  165.    }
  166.    else
  167.    {
  168.       for( i = 0; i < 2; i++ )
  169.       {
  170.          x += i;
  171.          y = temp;
  172.          for( j = 0; j < 8; j++ )
  173.          {
  174.             Lcd_Set_X_Y( x, y ); y++;
  175.             Lcd_Write_Byte( ~point[ i * 8 + j ] );
  176.          }
  177.       }
  178.    }
  179. }
  180. /****************************************************************************
  181. * 名称:Lcd_Character_16X16( bit bit_flag, uchar x, uchar y, uchar code *point )
  182. * 功能:显示16*16字符(汉字)      
  183. * 入口参数:x y data
  184. * 出口参数:无
  185. *说明:bit_flag = 1 正常显示 bit_flag = 0 黑白反相显示
  186. ****************************************************************************/
  187. void Lcd_Character_16X16( bit bit_flag, uchar x, uchar y, uchar code *point )
  188. {
  189.    uchar i,j,temp ;
  190.    temp=y;
  191.    if( bit_flag )
  192.    {
  193.       for( i=0; i<2; i++ )
  194.       {
  195.          x+=i;
  196.              y=temp;
  197.          for( j=0;j<16;j++ )
  198.          {
  199.             Lcd_Set_X_Y( x, y ); y++;
  200.             Lcd_Write_Byte( point[ i*16 + j] );  
  201.          }
  202.       }
  203.    }
  204.    else
  205.    {
  206.       for( i = 0; i<2; i++ )
  207.       {
  208.          x += i;
  209.          y = temp;
  210.          for( j = 0; j < 16; j++ )
  211.          {
  212.             Lcd_Set_X_Y( x, y ); y++;
  213.             Lcd_Write_Byte( ~ point[ i * 16 + j ] );
  214.          }
  215.       }
  216.    }
  217. }
  218. /****************************************************************************
  219. * 名称:Lcd_Clear(void)
  220. * 功能:清屏        
  221. * 入口参数:无
  222. * 出口参数:无
  223. ****************************************************************************/
  224. void Lcd_Clear()
  225. {
  226.    uchar i,j;
  227.    cs1=1;cs2=1;
  228.    for(i=0;i<8;i++)
  229.    {
  230.       Lcd_Set_X( i );
  231.       Lcd_Set_Y( 0 );
  232.       for(j=0;j<64;j++)
  233.          Lcd_Write_Byte(0x00);
  234.    }
  235. }
  236. /*******************************************************************************************
  237. * 函数名称:Lcd_Initial()
  238. * 功    能:初始化LCD
  239. * 入口参数:无
  240. * 出口参数:无
  241. *********************************************************************************************/
  242. void Lcd_Initial()
  243. {  
  244.    Lcd_Display_Off();
  245.    Lcd_Write_Command(0xb8);     //Page_Add
  246.    Lcd_Write_Command(0x40);     //Col_Add
  247.    Lcd_Write_Command(0xc0);     //Start_Line
  248.    Lcd_Display_On();
  249.    Lcd_Clear();
  250. }

  251. /****************************************************************************
  252. * 名称:Lcd_Time(uchar * clock_time )
  253. * 功能:显示时间      
  254. * 入口参数:无
  255. * 出口参数:无                 
  256. * 说明    : 时间数组 BCD 码形式
  257. ****************************************************************************/
  258. void Lcd_Time(uchar * clock_time )
  259. {
  260.    uchar i=0;
  261.    //显示   "hour时min分sec秒"                                            
  262.    i= * clock_time >> 4;
  263.    Lcd_Character_16X8( 1, 0, 80, letter_logo[i]);    //显示   sec的高位
  264.    i= * clock_time & 0x0f;
  265.    Lcd_Character_16X8( 1, 0, 88, letter_logo[i]);    //显示   sec的低位
  266.    Lcd_Character_16X16( 1, 0, 96 , time_logo[2]);  //显示   秒

  267.    clock_time ++;
  268.    i= *  clock_time >> 4;
  269.    Lcd_Character_16X8( 1, 0, 48, letter_logo[i]);    //显示   min的高位
  270.    i= * clock_time & 0x0f;
  271.    Lcd_Character_16X8( 1, 0, 56, letter_logo[i]);   //显示   min的低位
  272.    Lcd_Character_16X16( 1, 0, 64 , time_logo[1]);  //显示   分

  273.    clock_time ++;
  274.    i= * clock_time >> 4;
  275.    Lcd_Character_16X8( 1, 0, 16 , letter_logo[i]);    //显示   hour的高位
  276.    i= * clock_time & 0x0f;
  277.    Lcd_Character_16X8( 1, 0, 24 , letter_logo[i]);    //显示   hour的低位
  278.    Lcd_Character_16X16( 1, 0, 32 , time_logo[0]);  //显示   分         
  279. }


  280. /****************************************************************************
  281. * 名称:Lcd_Data(uchar * clock_time )
  282. * 功能:显示日期      
  283. * 入口参数:无
  284. * 出口参数:无                 
  285. * 说明    : 时间数组 BCD 码形式
  286. ****************************************************************************/
  287. void Lcd_Week( uchar week )
  288. {  
  289.    Lcd_Character_16X16( 1, 6, 0,  week_logo[7] ); //星
  290.    Lcd_Character_16X16( 1, 6, 16, week_logo[8] ); //期
  291.    Lcd_Character_16X16( 1, 6, 32, week_logo[  week & 0x0f ] );
  292. }
  293. /******************************************************************************
  294. * 函数名称: Lcd_Clock( uchar *clock_time )
  295. * 功能: 显示时钟
  296. * 入口参数: 时钟地址
  297. * 出口参数: 无
  298. ********************************************************************************/

  299. void Lcd_Clock( uchar * clock_time )
  300. {
  301.    Lcd_Time( clock_time ); //显示时间
  302. }
  303. /******************************************************************************
  304. * 函数名称: Lcd_welcome()
  305. * 功能: 显示欢迎语
  306. * 入口参数: 无
  307. * 出口参数: 无
  308. ********************************************************************************/
  309. void Lcd_welcome()
  310. {         
  311.          Lcd_Character_16X16( 1,2, 32, chushi_logo[0] );
  312.    Lcd_Character_16X16( 1,2, 48, chushi_logo[1] );
  313.    Lcd_Character_16X16( 1,2, 64, chushi_logo[2] );
  314.    Lcd_Character_16X16( 1,2, 80, chushi_logo[3] );
  315.    Lcd_Character_16X16( 1,5, 32, chushi_logo[4] );
  316.    Lcd_Character_16X16( 1,5, 48, chushi_logo[5] );
  317.    Lcd_Character_16X16( 1,5, 64, chushi_logo[6]);
  318.    Lcd_Character_16X16( 1,5, 80, chushi_logo[7] );
  319. }
  320. /******************************************************************************
  321. * 函数名称: Lcd_welcome()
  322. * 功能: 显示欢迎语
  323. * 入口参数: 无
  324. * 出口参数: 无
  325. ********************************************************************************/
  326. void Lcd_dsgt()
  327. {
  328.                 Lcd_Character_16X8(1,2,0,letter_logo[1]);
  329.           Lcd_Character_16X8(1,2,8,letter_logo[10]);
  330.     Lcd_Character_16X8(1,2,16,letter_logo[5]);
  331.           Lcd_Character_16X8(1,2,24,letter_logo[13]);
  332.                  Lcd_Character_16X8(1,2,32,letter_logo[2]);
  333.           Lcd_Character_16X8(1,2,40,letter_logo[10]);
  334.     Lcd_Character_16X8(1,2,48,letter_logo[6]);
  335.           Lcd_Character_16X8(1,2,56,letter_logo[13]);
  336.                 Lcd_Character_16X8(1,2,64,letter_logo[3]);
  337.           Lcd_Character_16X8(1,2,72,letter_logo[10]);
  338.     Lcd_Character_16X8(1,2,80,letter_logo[7]);
  339.           Lcd_Character_16X8(1,2,88,letter_logo[13]);
  340.           Lcd_Character_16X8(1,2,96,letter_logo[4]);
  341.           Lcd_Character_16X8(1,2,104,letter_logo[10]);
  342.     Lcd_Character_16X8(1,2,112,letter_logo[8]);
  343.           Lcd_Character_16X8(1,2,120,letter_logo[13]);
  344. }
  345. /******************************************************************************
  346. * 函数名称: Lcd_welcome()
  347. * 功能: 显示欢迎语
  348. * 入口参数: 无
  349. * 出口参数: 无
  350. ********************************************************************************/
  351. void Lcd_tim()
  352. {
  353.                
  354.           Lcd_Character_16X8(1,4,32,letter_logo[0]);
  355.                 Lcd_Character_16X8(1,4,40,letter_logo[0]);
  356.           Lcd_Character_16X8(1,4,48,letter_logo[10]);
  357.                 Lcd_Character_16X8(1,4,56,letter_logo[0]);
  358.           Lcd_Character_16X8(1,4,64,letter_logo[0]);
  359.                 Lcd_Character_16X8(1,4,72,letter_logo[10]);
  360.           Lcd_Character_16X8(1,4,80,letter_logo[0]);
  361.                 Lcd_Character_16X8(1,4,88,letter_logo[0]);

  362. }


  363. /******************************************************************************
  364. * 函数名称: Lcd_welcome()
  365. * 功能: 显示欢迎语
  366. * 入口参数: 无
  367. * 出口参数: 无
  368. ********************************************************************************/
  369. void Lcd_Show()
  370. {
  371. Lcd_dsgt();

  372. Lcd_tim();
  373. }



  374. /*******************************************************************************
  375. * 名称: Lcd_Temperature( uchar * temperture )
  376. * 功能: 显示温度
  377. * 入口参数: 温度
  378. * 出口参数: 无
  379. *********************************************************************************/
  380. void Lcd_Temperture( uchar * temperature )
  381. {
  382.   uchar temp;

  383.   uchar sign=0;    //定义符号标志位,revised by iam3i

  384.   if(temperature[1]>127)
  385.   {
  386.   sign=1;
  387.   temperature[0]=(~temperature[0]+1);
  388.   if((temperature[0])>=0xff)
  389.   temperature[1]=(~temperature[1])+1;
  390.   else
  391.   temperature[1]=~temperature[1];
  392.   }
  393.   else
  394.   sign=0;
  395.   switch( * temperature & 0x0f )                    //查表 精确到 0.1  °C
  396.    {
  397.       case 0x00: temp = 0; break;
  398.       case 0x01: temp = 1; break;
  399.       case 0x02: temp = 1; break;
  400.       case 0x03: temp = 2; break;
  401.       case 0x04: temp = 2; break;
  402.       case 0x05: temp = 3; break;
  403.       case 0x06: temp = 4; break;
  404.       case 0x07: temp = 4; break;
  405.       case 0x08: temp = 5; break;
  406.       case 0x09: temp = 6; break;
  407.       case 0x0a: temp = 6; break;
  408.       case 0x0b: temp = 7; break;
  409.       case 0x0c: temp = 8; break;
  410.       case 0x0d: temp = 8; break;
  411.       case 0x0e: temp = 9; break;
  412.       case 0x0f: temp = 9; break;
  413.       default:  break;
  414.    }

  415.    Lcd_Character_16X8( 1, 6, 56, letter_logo[12] );
  416.    Lcd_Character_16X8( 1, 6, 64, letter_logo[10] );
  417.    Lcd_Character_16X8( 1, 6, 120, temperture_logo[2] );    //   C
  418.    Lcd_Character_16X8( 1, 6, 112, temperture_logo[1] );    //   °
  419.    Lcd_Character_16X8( 1, 6, 104, letter_logo[temp] );  //  小数位
  420.    Lcd_Character_16X8( 1, 6, 96,  temperture_logo[0] );     //  .
  421.    temp = ( * temperature ) >> 4;
  422.    temperature++;
  423.    temp |= ( * temperature ) << 4;
  424.    Lcd_Character_16X8( 1, 6, 88, letter_logo[temp% 10 ] ); //个位
  425.    if (temp/10==0 )
  426.    Lcd_Character_16X8(1,6,80,letter_logo[13]);        //十位为0,不显示
  427.    else
  428.    Lcd_Character_16X8( 1, 6, 80, letter_logo[temp/10 ] );  //十位,该程序不能正确显示大于99.9度的温度
  429.   
  430.    if(sign==1)
  431.    Lcd_Character_16X8(1,6,72,letter_logo[11]);
  432.    else
  433.    Lcd_Character_16X8(1,6,72,letter_logo[13]);
  434.    
  435. }


  436. /********************************************************************************
  437. * 名称: void Week_convert( uchar * clock_time )
  438. * 功能: 输入BCD阳历数据;输出BCD星期
  439. * 入口参数:
  440. * 出口参数:
  441. * 说明: 算法: ( 日期 + 年份 + 所过闰年 + 月校正 ) / 7 的余数就是星期 如果是闰年又不到 3 月份上述之和 要减一天 再
  442. ********************************************************************************/
  443. void Week_Convert( bit c, uchar * clock_time )
  444. {
  445.    uchar year, month, day; //定义 年 月 天
  446.    uchar temp;

  447.    clock_time += 3; //指向日
  448.    day = ( * clock_time >> 4 ) * 10 + ( *clock_time & 0x0f ); //BCD转换十进制
  449.    clock_time ++; //指向月
  450.    month = ( * clock_time >> 4 ) * 10 + ( * clock_time & 0x0f );
  451.    clock_time ++; //指向年
  452.    year = ( * clock_time >> 4 ) * 10 + ( * clock_time & 0x0f );

  453.    if( c == 0 ) //如果为21世纪,年份数加100
  454.       year += 100;
  455.    temp = year / 4; //所过闰年数只算1900年之后的
  456.    temp = year + temp;
  457.    temp = temp % 0x07; //为节省资源,先进行一次取余,避免数大于0xff,避免使用整型数据
  458.    temp = temp + day + table_week[ month - 1 ];
  459.    if( ( year % 4  == 0 ) && ( month <3  ) )
  460.       temp -=1;
  461.    Lcd_Week( temp % 7 );
  462. }

  463. /********************************************************************************/
  464. #endif
复制代码

上面的是LCD12864函数,怎么能在12864中把这段1602里的代码实现?
  1. void write_sfm(uint8_t add,uint8_t date)        //时间写入函数
  2. {
  3. uint8_t shiw,gew;
  4. shiw=date/10;
  5. gew=date%10;
  6. lcd_wcmd(0x80+0x40+add);
  7. lcd_wdat(0x30+shiw);
  8. lcd_wdat(0x30+gew);
  9. }
  10.         void write_dsgt(uint8_t add,uint8_t date)        //药量写入函数
  11.         {
  12. lcd_wcmd(0x80+0x40+add);
  13. lcd_wdat(0x30+date);
  14. }
复制代码
  1. if(s3num==2)
  2. {
  3. shi++;
  4. if(shi==24)
  5. shi=0;
  6. write_sfm(8,shi);
  7. lcd_wcmd(0x80+0x40+8);
  8. }
  9. if(s3num==3)
  10. {
  11.         dsg1++;
  12.         if(dsg1==10)
  13. dsg1=0;
  14. write_dsgt(0,dsg1);
  15. lcd_wcmd(0x80+0x40+0);
  16. }
  17.         if(s3num==4)
  18. {
  19.         dsg2++;
  20.         if(dsg2==10)
  21. dsg2=0;
  22. write_dsgt(2,dsg2);
  23. lcd_wcmd(0x80+0x40+2);
  24. }
  25.         if(s3num==5)
  26. {
  27.         dsg3++;
  28.         if(dsg3==10)
  29. dsg3=0;
  30. write_dsgt(4,dsg3);
  31. lcd_wcmd(0x80+0x40+4);
  32. }
  33. if(s3num==6)
  34. {
  35.         dsg4++;
  36.         if(dsg4==10)
  37. dsg4=0;
  38. write_dsgt(6,dsg4);
  39. lcd_wcmd(0x80+0x40+6);
复制代码

sheji.rar

42.98 KB, 下载次数: 9

1602程序

回复

使用道具 举报

ID:390416 发表于 2022-5-7 23:49 | 显示全部楼层
LCD1602和LCD12864 功能寄存器地址 都是一样的,唯一的区别就是存储地址不一样。改改就行了。
正常工作的LCD1602程序,也可以直接在LCD12864显示几个文字或者乱码。
回复

使用道具 举报

ID:1012735 发表于 2022-5-8 04:39 | 显示全部楼层
//行控制码1602&1604通用
#define LINE0                0x80
#define LINE1                0xC0
#define LINE2                0x90
#define LINE3                0xD0
回复

使用道具 举报

ID:584814 发表于 2022-5-8 09:37 | 显示全部楼层
两者相同点就是都用点阵来显示,不同点是1602直接调字库显示而12864就是调也要打点。
所以,先读懂代码,然后改起来就很容易了。
回复

使用道具 举报

ID:155507 发表于 2022-5-8 11:11 | 显示全部楼层
LCD12864在市面上主要分为两种,一种是采用st7920控制器驱动的,有PSB,它一般带有中文字库字模,价格略高一点。另一种是采用KS0108控制器驱动,有CS1和CS2,它只是点阵模式,不带字库。

带中文字库的,采用st7920控制器驱动的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式驱动

你发的程序是采用KS0108控制器驱动,不带字库
如果不带字库,为了显示一个汉字,就需要传送一大批点阵数据。
如果带字库,显示一个汉字,仅仅需要传送两个字节汉字内码。
这种情况下,速度就很快。

回复

使用道具 举报

ID:61140 发表于 2022-5-8 14:28 | 显示全部楼层
//LCD12864行地址地址定义                                                  *
//第一行地址:80H 81H 82H 83H 84H 85H 86H 87H          *
//第二行地址:90H 91H 92H 93H 94H 95H 96H 97H          *
//第三行地址:88H 89H 8AH 8BH 8CH 8DH 8EH 8FH          *
//第四行地址:98H 99H 9AH 9BH 9CH 9DH 9EH 9FH          *

这个是LCD12864的显示地址,照这个修改即可,另LCD1602显示的时候只能显示数字和英文字母以及西文字符和一些图标,但LCD12864可以显示128*64的图片,如果带字库的还可以直接显示汉字.
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表