单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:2717|回复:1
打印上一主题下一主题

ATMEGA16单片机YJ12864液晶图形及文字显示源代码

[复制链接]
跳转到指定楼层
楼主
ID:835047发表于 2020-10-27 10:53|只看该作者回帖奖励
12864液晶  图形及文字显示源代码

单片机源程序如下:
  1. #include< iom16v.h>                 //包含型号头文件
  2. #include< macros.h>                 //包含"位"操作头文件
  3. #include< stdio.h>                 //标准输入输出头文件
  4. #include< AVR_PQ1A.h>           //包含自定义常量头文件

  5. #pragma data:code //以下是字模工具取出的图片数组
  6. const uchar GDRAM[1024]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  7. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

  8. ^^^^^^^^^^省略
  9. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
  10. #pragma data:data

  11. /*******************************************
  12. 函数名称: LCD12864_portini
  13. 功   能: 初始化12864液晶用到的IO口
  14. 参   数: 无
  15. 返回值  : 无
  16. /********************************************/
  17. void LCD12864_portini(void)
  18. {
  19.        LCDb_CTRL_DDR |= BIT(LCDb_RS)|BIT(LCDb_RW)|BIT(LCDb_E)|BIT(LCDb_RST);//配置控制管脚为输出
  20.        LCDb_DATA_DDR |= 0xFF;  //配置数据管脚为输出
  21.        LCDb_SET_RST;           //不使能复位端
  22. }
  23. /*******************************************
  24. 函数名称: LCD12864_readbyte
  25. 功   能: 从12864液晶读出一个字节数据或者指令
  26. 参   数: DatCmd--为iDat时是数据,为iCmd时是指令
  27. 返回值  : dByte--读回的数据或者指令
  28. /********************************************/
  29. uchar LCD12864_readbyte(uchar DatCmd)
  30. {
  31.        uchar dByte;
  32.        if (DatCmd == iCmd)             //指令操作
  33.            LCDb_CLR_RS;
  34.        else
  35.            LCDb_SET_RS;
  36.           
  37.        LCDb_SET_RW;                     //读操作
  38.        LCDb_SET_E;
  39.        LCDb_DATA_DDR=0x00;       //数据总线定义为输入
  40.        dByte=LCDb_DI;                 //读数据或者指令
  41.        Delayms(1);                       //时序调整
  42.        LCDb_CLR_E;      
  43.        LCDb_DATA_DDR|=0xff;       //数据总线还原为输出
  44.        return dByte;
  45. }
  46. /*******************************************
  47. 函数名称: LCD12864_sendbyte
  48. 功   能: 向12864液晶写入一个字节数据或者指令
  49. 参   数: DatCmd--为iDat时是数据,为iCmd时是指令
  50.                dByte--为写入12864的数据或者指令
  51. 返回值  : 无
  52. /********************************************/
  53. void LCD12864_sendbyte(uchar DatCmd, uchar dByte)
  54. {
  55.        if (DatCmd == iCmd)           //指令操作
  56.            LCDb_CLR_RS;
  57.        else
  58.            LCDb_SET_RS;
  59.           
  60.        LCDb_CLR_RW;                 //写操作
  61.        LCDb_SET_E;
  62.        LCDb_DO = dByte;           //写入数据
  63.        Delayus(100);
  64.        LCDb_CLR_E;      
  65. }
  66. /*******************************************
  67. 函数名称: LCD12864_sendstr
  68. 功   能: 向12864液晶写入一个字符串
  69. 参   数: ptString--字符串指针
  70. 返回值  : 无
  71. /********************************************/
  72. void LCD12864_sendstr(uchar *ptString)
  73. {
  74.        while((*ptString)!='\0')             //字符串未结束一直写
  75.        {
  76.            LCD12864_sendbyte(iDat, *ptString++);
  77.        }
  78. }
  79. /*******************************************
  80. 函数名称: LCD12864_clear
  81. 功   能: 12864液晶清屏
  82. 参   数: 无
  83. 返回值  : 无
  84. /********************************************/
  85. void LCD12864_clear(void)
  86. {
  87.        LCD12864_sendbyte(iCmd,LCDb_CLS);
  88.        Delayms(2);// 清屏指令写入后,2ms 的延时是很必要的!!!
  89. }
  90. /*******************************************
  91. 函数名称: LCD12864_readBF
  92. 功   能: 12864液晶清屏
  93. 参   数: 无
  94. 返回值  : busy--为1时忙,为0时可以接收指令
  95. /********************************************/
  96. uchar LCD12864_readBF(void)
  97. {      
  98.        uchar busy;
  99.        busy=LCD12864_readbyte(iCmd);           //读回BF标志和地址
  100.        if(busy&0x80)                                 //如果忙,返回忙状态
  101.            busy=1;
  102.        else                                             //不忙,可以写入
  103.            busy=0;
  104.        return busy;
  105. }
  106. /*******************************************
  107. 函数名称: LCD12864_gotoXY
  108. 功   能: 移动到指定位置
  109. 参   数: Row--指定的行
  110.                Col--指定的列
  111. 返回值  : 无
  112. /********************************************/
  113. void LCD12864_gotoXY(uchar Row, uchar Col)
  114. {      
  115.        switch (Row)             //选择行
  116.        {
  117.            case 2:
  118.                  LCD12864_sendbyte(iCmd, LCDb_L2 + Col); break;       //写入第2行的指定列
  119.            case 3:
  120.                  LCD12864_sendbyte(iCmd, LCDb_L3 + Col); break;       //写入第3行的指定列
  121.            case 4:
  122.                  LCD12864_sendbyte(iCmd, LCDb_L4 + Col); break;       //写入第4行的指定列      
  123.            default:
  124.                  LCD12864_sendbyte(iCmd, LCDb_L1 + Col); break;       //写入第1行的指定列      
  125.        }
  126. }
  127. /*******************************************
  128. 函数名称: LCD12864_initial
  129. 功   能: 12864液晶初始化
  130. 参   数: 无
  131. 返回值  : 无
  132. /********************************************/
  133. void LCD12864_initial(void)
  134. {
  135.        Delayms(100);                       // 等待内部复位
  136.        LCD12864_portini();                 //端口初始化
  137.       
  138.        LCD12864_sendbyte(iCmd, LCDb_FUNCTION);       //功能、模式设定
  139.        while(LCD12864_readBF());
  140.        LCD12864_sendbyte(iCmd, LCDb_ON);           //打开显示
  141.        while(LCD12864_readBF());
  142.        LCD12864_clear();                                 //清屏
  143.        while(LCD12864_readBF());
  144.        LCD12864_sendbyte(iCmd, LCDb_ENTRY);       // 输入模式设定          
  145. }
  146. /*******************************************
  147. 函数名称: LCD12864_opGDRAM
  148. 功   能: 向GDRAM写入数据,并显示(完成绘图功能)
  149. 参   数: ptGDRAM--GDRAM数据指针
  150. 返回值  : 无
  151. /********************************************/
  152. void LCD12864_opGDRAM(const uchar *ptGDRAM)
  153. {
  154.        uchar i,j;
  155.        uint x=0;
  156.        while(LCD12864_readBF());       //读忙标志
  157.        LCD12864_sendbyte(iCmd,LCDb_EXTCMD1);           //扩充指令集,并关闭绘图显示      
  158.        //写入并显示上半屏幕
  159.        for(i=0;i<32;i++)                               //行地址计数
  160.      {                      
  161.          for(j=0;j<8;j++)                           //列地址计数
  162.          {                                
  163.                          LCD12864_sendbyte(iCmd,0x80|i);//输入行地址
  164.                        Delayus(10);
  165.                          LCD12864_sendbyte(iCmd,0x80|j);//输入列地址
  166.                        Delayus(10);
  167.              LCD12864_sendbyte(iDat,ptGDRAM[x++]); //输入高位字节数据
  168.                        Delayus(10);          
  169.                        LCD12864_sendbyte(iDat,ptGDRAM[x++]); //输入低位字节数据
  170.                        Delayus(10);
  171.          }
  172.      }
  173.        //写入并显示下半屏幕
  174.        for(i=0;i<32;i++)        
  175.      {                      
  176.          for(j=8;j<16;j++)    
  177.          {        
  178.                          LCD12864_sendbyte(iCmd,0x80|i);//输入行地址
  179.                        Delayus(10);
  180.                          LCD12864_sendbyte(iCmd,0x80|j);//输入列地址
  181.                        Delayus(10);
  182.              LCD12864_sendbyte(iDat,ptGDRAM[x++]); //输入高位字节数据    
  183.                        Delayus(10);
  184.                        LCD12864_sendbyte(iDat,ptGDRAM[x++]); //输入低位字节数据
  185.                        Delayus(10);
  186.          }
  187.      }
  188.        Delayus(10);
  189.        LCD12864_sendbyte(iCmd,LCDb_EXTCMD2);                   //打开绘图显示
  190.        LCD12864_sendbyte(iCmd,LCDb_BASCMD);                   //还原回基本指令集模式
  191. }

  192. /*******************************************
  193. 函数名称: main
  194. 功   能: 12864液晶驱动主程序
  195. 参   数: 无
  196. 返回值  : 无
  197. /********************************************/
  198. void main(void)
  199. {
  200. uchar i;
  201. Board_init( );                                               //初始化开发板
  202. LCD12864_initial();                                   //初始化12864液晶
  203.   
  204. while(1)
  205. {
  206.   LCD12864_clear();
  207.   while(LCD12864_readBF());
  208.   LCD12864_gotoXY(1,0);                                     //第1行,第1列显示
  209.   LCD12864_sendstr("AVR_PQ1A  开发板");      
  210.   LCD12864_gotoXY(2,2);                                     //第2行,第3列显示
  211.   LCD12864_sendstr("皮球制作");      
  212.   LCD12864_gotoXY(3,0);                                   //第3行,第1列显示
  213.   LCD12864_sendstr("电话:13212800564");      
  214.   LCD12864_gotoXY(4,1);                                   //第4行,第2列显示
  215.   LCD12864_sendstr("xxxxxxxx ");      
  216.   Delayms(40000);                                         //延时等待
  217.   
  218.   LCD12864_clear();                                       //清屏幕
  219.   LCD12864_opGDRAM(GDRAM);                             //完成绘图,绘图后返回基本指令集模式
  220.   Delayms(40000);
  221. }
  222. }
复制代码

所有程序51hei提供下载:
4_12864.rar(35.84 KB, 下载次数: 26)


实验例程介绍.pdf

193.64 KB, 下载次数: 15, 下载积分: 黑币 -5

AVR_PQ1A BOARD.pdf

86.56 KB, 下载次数: 12, 下载积分: 黑币 -5

沙发
ID:1发表于 2020-10-27 15:31|只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)

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

Powered by 单片机教程网