找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6201|回复: 1
收起左侧

带中文字库的LCD12864单片机显示程序

[复制链接]
ID:77367 发表于 2015-4-19 03:12 | 显示全部楼层 |阅读模式
  1. 带中文字库的LCD12864显示几个字的代码.txt成熟不是心变老,而是眼泪在眼里打转却还保持微笑。把一切平凡的事做好既不平凡,把一切简单的事做对既不简单。下面是带中文字库的LCD12864

  2. #include<reg52.h>

  3. #include <math.h>



  4. void lcd_init(void);

  5. void clr_lcd(void);

  6. void send_com(unsigned char cmd);

  7. void send_data(unsigned char dat);

  8. void chek_busy(void);

  9. void set_xy(unsigned char xpos,unsigned char ypos);

  10. void print(unsigned char x,unsigned char y,char* str);

  11. void printstr(unsigned char xpos,unsigned char ypos,unsigned char str[],unsigned char k);



  12. unsigned char code buf[4] ={0xbb,0xb6,0xd3,0xad};//欢迎





  13. #define DATA       P2

  14. #define CONTROL P0

  15. #define E    7           //并行的使能信号        sbit E   = P0^7

  16. #define RW   6          //并行的读写信号         sbit RW = P0^6

  17. #define RS   5         //并行的指令数据选择信号 sbit RS = P0^5  

  18. #define PSB 4         //并/串行接口选择         sbit PSB = P0^4

  19. #define RST 3         //复位 低电平有效         sbit RST = P0^3

  20. #define SETB(x,y) (x|=(1<<y))

  21. #define CLRB(x,y) (x&=(~(1<<y)))

  22. #define CHKB(x,y) (x&(1<<y))





  23. /********************测忙碌**********************/

  24. //测忙碌子程序

  25. //RS=0,RW=1,E=H,D0-D7=状态字

  26. /************************************************/

  27. void chek_busy(void)

  28. { unsigned char temp1;//状态信息(判断是否忙)

  29.    CLRB(CONTROL,RS);    // RS = 0;

  30.    SETB(CONTROL,RW);    // RW = 1;

  31.    SETB(CONTROL,E);    // E = 1;

  32.    do{temp1 = DATA;DATA=0xFF;} while(temp1&0x80);

  33.    SETB(CONTROL,E);   // E = 1;

  34.    DATA=0xFF;

  35. }

  36. /********************写命令**********************/

  37. //写命令子程序

  38. //

  39. /************************************************/

  40. void send_com(unsigned char cmd)/*写命令*/

  41. {

  42. chek_busy();

  43. CLRB(CONTROL,RS); //RS = 0;

  44. CLRB(CONTROL,RW); //RW = 0;

  45. DATA = cmd;

  46. SETB(CONTROL,E); //E = 1;

  47. CLRB(CONTROL,E); //E = 0;

  48. }

  49. /********************写数据**********************/

  50. //写数据子程序

  51. //

  52. /************************************************/

  53. void send_data(unsigned char dat)

  54. {

  55. chek_busy();

  56. SETB(CONTROL,RS); //RS = 1;

  57. CLRB(CONTROL,RW); //RW = 0;

  58. DATA = dat;

  59. SETB(CONTROL,E); //E = 1;

  60. CLRB(CONTROL,E); //E = 0;

  61. }

  62. /********************初始化**********************/

  63. //复位、通讯方式选择

  64. /************************************************/

  65. void lcd_init(void)

  66. {

  67.     SETB(CONTROL,RST);//复位RST=1

  68.     SETB(CONTROL,PSB);       //通讯方式为并口PSB = 1

  69.       //send_com(0x34);//34H--扩充指令操作

  70. send_com(0x30);//功能设置,一次送8位数据,基本指令集

  71. send_com(0x0C);//0000,1100 整体显示,游标off,游标位置off

  72. send_com(0x01);//0000,0001 清DDRAM

  73. send_com(0x02);//0000,0010 DDRAM地址归位

  74. send_com(0x80);//1000,0000 设定DDRAM 7位地址000,0000到地址计数器AC

  75. }



  76. /*******************************************************************/

  77. //          设置显示位置    xpos(1~16),tpos(1~4)

  78. /*******************************************************************/

  79. void set_xy(unsigned char xpos,unsigned char ypos)

  80. {

  81. switch(ypos)

  82. {

  83.    case 1:

  84.     send_com(0X80|xpos);break;

  85.    case 2:

  86.     send_com(0X90|xpos);break;

  87.    case 3:

  88.     send_com(0X88|xpos);break;

  89.    case 4:

  90.     send_com(0X98|xpos);break;

  91.    default:break;

  92. }

  93. }

  94. /*******************************************************************/

  95. //          在指定位置显示字符串

  96. /*******************************************************************/

  97. void print(unsigned char x,unsigned char y,char* str)

  98. {

  99.     unsigned char lcd_temp;

  100.     set_xy(x,y);

  101.     lcd_temp=*str;

  102.     while(lcd_temp != 0x00)

  103.     {

  104.         send_data(lcd_temp);

  105.         lcd_temp=*(++str);

  106.     }

  107. }



  108. /********************写字符串******************/

  109. //写字符串子程序

  110. //xpos1取0~7共八列,ypos1取0~3共四行。

  111. /**********************************************/

  112.     void printstr(unsigned char xpos,unsigned char ypos,unsigned char str[],unsigned char k)

  113. { unsigned char n;

  114.      switch (ypos)

  115.     { case 1: xpos |= 0x80;break;         //第一行

  116.       case 2: xpos |= 0x90;break;         //第二行

  117.       case 3: xpos |= 0x88;break;         //第三行

  118.       case 4: xpos |= 0x98;break;         //第四行

  119.       default: break;

  120.      }

  121.       send_com(xpos);                                    //此处的Xpos已转换为LCM的显示寄存器实际地址

  122.       for(n=0;n < k;n++)

  123.      {

  124.       send_data(str[n]);//显示汉字时注意码值,连续两个码表示一个汉字

  125.       }

  126.    }



  127. /********************清屏************************/

  128. //清屏

  129. /************************************************/

  130. void clr_lcd(void)

  131. {

  132.    send_com(0x01);

  133.    //send_com(0x34);

  134.    //send_com(0x30);

  135. }



  136. /**************主函数***********************/

  137. void main ()

  138. {

  139. lcd_init();     //设定液晶工作方式

  140. printstr(1,1,buf,4);

  141. print(5,1,"光临");

  142. print(0,3," SEEGU百度空间");

  143. while(1) { }

  144. }
复制代码


回复

使用道具 举报

ID:73992 发表于 2018-1-5 17:11 | 显示全部楼层
IMG0001B.jpg IMG0002A.jpg
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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