找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2829|回复: 10
收起左侧

大家好,谁能帮我看看这个12864液晶程序,哪里有错误

[复制链接]
ID:83228 发表于 2015-7-25 10:07 | 显示全部楼层 |阅读模式
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char

sbit lcd_rs=P2^6;
sbit lcd_en=P2^7;
sbit lcd_rw=P2^5;
sbit  PSB=        P3^2;
sbit          LCD12864_RSET=P3^3;

uchar  table1[]=
"哈哈哈哈哈哈哈哈";

void delayms(uint xms)
  {
   uint i,j;
   for(i=xms;i>0;i--)
   for(j=110;j>0;j--);
  }
   void  write_cmd(uchar cmd)
   {          LCD12864_RSET = 1;
    lcd_rs=0;
        lcd_rw=0;
        _nop_();
        _nop_();
    P0=cmd;
                 _nop_();
        _nop_();
        lcd_en=1;
        delayms(2);                                         
        lcd_en=0;
        delayms(2);
  }
  void write_data(uchar dat)
  {        LCD12864_RSET = 1;
    lcd_rs=1;
        lcd_rw=0;
        _nop_();
        _nop_();

        P0=dat;
                _nop_();
        _nop_();
        lcd_en=1;
        delayms(5);
        lcd_en=0;
        delayms(1);
  }

void init()
{
           uchar i;
        PSB=1;
        LCD12864_RSET = 0;
        for (i=0; i<100; i++);
          lcd_rs=0;
        LCD12864_RSET = 1;
        delayms(1);

  write_cmd(0x30);
  delayms(1);

  write_cmd(0x30);
  delayms(1);
  write_cmd(0x0f);
  delayms(1);

  write_cmd(0x01);
  delayms(1);

  write_cmd(0x06);
  delayms(1);
}
  void display1(void)
  {
   uchar i;
   write_cmd(0x80);
   for(i=0;i<16;i++)
   {
     write_data(table1[i]);
         delayms(1);
        }
   }

void main()
{
   init();
   while(1)
   {
   display1();
   
   }

}

回复

使用道具 举报

ID:84652 发表于 2015-7-25 14:39 | 显示全部楼层
液晶写数据一遍就够了。把主程序里的display1();放到while(1)前面。
回复

使用道具 举报

ID:79544 发表于 2015-7-25 17:04 | 显示全部楼层
我现在用的正确的程序:
  1. /**************************************************
  2.         功能:12864显示汉字
  3.         单片机:STC12C5A60S2
  4.         晶振:11.0592M
  5.         作者:苏义江
  6.         时间:2015-7-25
  7. *****************************************************/
  8. #include<reg52.h>
  9. #define uchar unsigned char
  10. #define uint unsigned int


  11. sbit E=P3^7;//脉冲使能
  12. sbit RW=P3^6;//读写选择
  13. sbit RS=P3^5;//数据命令选择
  14. sbit rst=P1^0;//12864复位
  15. uchar code table[]={"我爱单片机!"};
  16. uchar code table1[]={"白日依山尽!"};
  17. // 延时ms函数:
  18. void Delayms(uint t)//STC12C5A60S2  1ms
  19. {
  20.     uint i,j;
  21.     for(i=t;i>0;i--)
  22.              for(j=0;j<800;j++);
  23. }

  24. // 12864写命令函数:
  25. void Write12864Command(uchar com)
  26. {
  27.        P0=com;//赋值
  28.        E=0;//写命令前三控制线的状态
  29.                 Delayms(10);
  30.        RS=0;
  31.        RW=0;
  32.        E=1;//拉高,写命令
  33.                 Delayms(10);
  34.        E=0;//写命令后三控制线的状态
  35.                 Delayms(10);
  36.        RS=1;
  37.        RW=1;
  38. }
  39. //12864写数据函数:
  40. void Write12864Data( uchar dat)
  41. {
  42.            Delayms(10);
  43.        P0=dat;//赋值
  44.        E=0;//写数据前三控制线的状态
  45.                 Delayms(10);
  46.        RS=1;
  47.        RW=0;   
  48.        E=1;//拉高,写数据
  49.            Delayms(10);
  50.        E=0;//写数据后三控制线的状态
  51.                 Delayms(10);
  52.        RS=0;
  53.        RW=1;
  54. }   
  55. //12864初始化函数:
  56. void Initialize12864()
  57. {
  58.        rst=0;//复位12864
  59.        Delayms(30);
  60.        rst=1;
  61.        Delayms(20);
  62.        Write12864Command(0x30);//功能设定:8位控制方式,使用基本指令
  63.        Write12864Command(0x08);//显示关
  64.        Write12864Command(0x01);//清屏
  65.        Write12864Command(0x06);//地址计数器加一、光标右移
  66.        Write12864Command(0x0c);//显示开
  67. }
  68. //清屏
  69. void Clear12864Screen()
  70. {
  71.         Write12864Data(0x00);//清屏
  72. }
  73. void main()
  74. {
  75.         uchar i;
  76.         Delayms(100);
  77.         Initialize12864();
  78.         Clear12864Screen();
  79.         Write12864Command(0x80);
  80.         for(i=0;i<12;i++)
  81.         {
  82.                 Write12864Data(table[i]);
  83.                 Delayms(5);
  84.         }
  85.         Write12864Command(0x88);
  86.         for(i=0;i<12;i++)
  87.         {
  88.                 Write12864Data(table1[i]);
  89.                 Delayms(5);
  90.         }
  91.         while(1);
  92.                
  93. }
复制代码
回复

使用道具 举报

ID:79544 发表于 2015-7-25 18:21 | 显示全部楼层
你用这个程序看看:
  1. /**************************************************
  2.         功能:12864显示汉字
  3.         单片机:STC12C5A60S2
  4.         晶振:11.0592M
  5.         作者:苏义江
  6.         时间:2015-7-25修改
  7. *****************************************************/
  8. #include<reg52.h>
  9. #define uchar unsigned char
  10. #define uint unsigned int


  11. sbit E=P3^7;//脉冲使能
  12. sbit RW=P3^6;//读写选择
  13. sbit RS=P3^5;//数据命令选择
  14. sbit rst=P1^0;//12864复位
  15. uchar code table3[]="欲穷千里目";
  16. uchar code table4[]="更上一丛楼";
  17. uchar code table1[]="白日依山尽";
  18. uchar code table2[]="黄河入海流";
  19. // 延时ms函数:
  20. void Delayms(uint t)//STC12C5A60S2  1ms
  21. {
  22.     uint i,j;
  23.     for(i=t;i>0;i--)
  24.              for(j=0;j<800;j++);
  25. }

  26. // 12864写命令函数:
  27. void Write12864Command(uchar com)
  28. {
  29.        P0=com;//赋值
  30.        E=0;//写命令前三控制线的状态
  31.                 Delayms(10);
  32.        RS=0;
  33.        RW=0;
  34.        E=1;//拉高,写命令
  35.                 Delayms(10);
  36.        E=0;//写命令后三控制线的状态
  37.                 Delayms(10);
  38.        RS=1;
  39.        RW=1;
  40. }
  41. //12864写数据函数:
  42. void Write12864Data( uchar dat)
  43. {
  44.            Delayms(10);
  45.        P0=dat;//赋值
  46.        E=0;//写数据前三控制线的状态
  47.                 Delayms(10);
  48.        RS=1;
  49.        RW=0;   
  50.        E=1;//拉高,写数据
  51.            Delayms(10);
  52.        E=0;//写数据后三控制线的状态
  53.                 Delayms(10);
  54.        RS=0;
  55.        RW=1;
  56. }   
  57. //12864初始化函数:
  58. void Initialize12864()
  59. {
  60.        rst=0;//复位12864
  61.        Delayms(30);
  62.        rst=1;
  63.        Delayms(20);
  64.        Write12864Command(0x30);//功能设定:8位控制方式,使用基本指令
  65.        Write12864Command(0x08);//显示关
  66.        Write12864Command(0x01);//清屏
  67.        Write12864Command(0x06);//地址计数器加一、光标右移
  68.        Write12864Command(0x0c);//显示开
  69. }
  70. //清屏
  71. void Clear12864Screen()
  72. {
  73.         Write12864Data(0x00);//清屏
  74. }
  75. void main()
  76. {
  77.         uchar i;
  78.         Delayms(100);
  79.         Initialize12864();
  80.         Clear12864Screen();
  81.        
  82.         Write12864Command(0x80);
  83.         for(i=0;i<11;i++)
  84.         {
  85.                 Write12864Data(table1[i]);
  86.                 Delayms(5);
  87.         }
  88.         Write12864Command(0x90);
  89.         for(i=0;i<11;i++)
  90.         {
  91.                 Write12864Data(table2[i]);
  92.                 Delayms(5);
  93.         }
  94. Write12864Command(0x88);
  95.         for(i=0;i<12;i++)
  96.         {
  97.                 Write12864Data(table3[i]);
  98.                 Delayms(5);
  99.         }
  100. Write12864Command(0x98);
  101.         for(i=0;i<12;i++)
  102.         {
  103.                 Write12864Data(table4[i]);
  104.                 Delayms(5);
  105.         }
  106.         while(1);
  107.                
  108. }
复制代码
回复

使用道具 举报

ID:83228 发表于 2015-7-25 23:07 来自手机 | 显示全部楼层
腾飞的龙 发表于 2015-7-25 17:04
我现在用的正确的程序:

好的,谢谢昂
回复

使用道具 举报

ID:83228 发表于 2015-7-25 23:07 来自手机 | 显示全部楼层
王朗的诱惑 发表于 2015-7-25 14:39
液晶写数据一遍就够了。把主程序里的display1();放到while(1)前面。

好的,谢谢昂
回复

使用道具 举报

ID:86892 发表于 2015-7-26 15:17 | 显示全部楼层
液晶写数据一遍就够了。把主程序里的display1();放到while(1)前面。
回复

使用道具 举报

ID:86938 发表于 2015-7-27 10:50 | 显示全部楼层
定时器设置不对
回复

使用道具 举报

ID:86938 发表于 2015-7-27 11:17 | 显示全部楼层
液晶写数据一遍就够了。把主程序里的display1();放到while(1)前面。
回复

使用道具 举报

ID:87008 发表于 2015-7-27 20:37 | 显示全部楼层
一直在写入?显示函数放在while(1)前面吧
回复

使用道具 举报

ID:87012 发表于 2015-7-27 20:48 | 显示全部楼层
都是高手,俺来学习一下哈
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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