找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6549|回复: 8
打印 上一主题 下一主题
收起左侧

晶联讯12864液晶屏测试单片机程序

  [复制链接]
跳转到指定楼层
楼主
ID:227504 发表于 2017-11-20 22:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
JLX12864测试程序,如果玩会了,会再更新

单片机源程序如下:
  1. #include <reg51.H>
  2. #include <intrins.h>
  3. sbit lcd_sclk=P3^2; //接口定义:lcd_sclk 就是LCD 的sclk
  4. sbit lcd_sid=P3^1; //接口定义:lcd_sid 就是LCD 的sid
  5. sbit lcd_rs=P3^0; //接口定义:lcd_rs 就是LCD 的rs
  6. sbit lcd_reset=P1^0; //接口定义:lcd_reset 就是LCD 的reset
  7. sbit lcd_cs1=P1^1; //接口定义:lcd_cs1 就是LCD 的cs1
  8. sbit Rom_IN=P1^2; //字库IC 接口定义:Rom_IN 就是字库IC 的SI
  9. sbit Rom_OUT=P1^3; //字库IC 接口定义:Rom_OUT 就是字库IC 的SO
  10. sbit Rom_SCK=P1^4; //字库IC 接口定义:Rom_SCK 就是字库IC 的SCK
  11. sbit Rom_CS=P1^5; //字库IC 接口定义Rom_CS 就是字库IC 的CS#
  12. sbit key=P2^0; //定义一个按键
  13. #define uchar unsigned char
  14. #define uint unsigned int
  15. #define ulong unsigned long
  16. uchar code bmp1[];
  17. uchar code bmp2[];
  18. uchar code bmp3[];
  19. uchar code cheng1[];
  20. uchar code gong1[];
  21. uchar code zhuang1[];
  22. uchar code tai1[];
  23. uchar code shi1[];
  24. uchar code yong1[];
  25. void delay_us(int i);
  26. uchar code jiong1[]={/*-- 文字: 囧 --*/
  27. /*-- 宋体12; 此字体下对应的点阵为:宽x 高=16x16 --*/
  28. 0x00,0xFE,0x82,0x42,0xA2,0x9E,0x8A,0x82,0x86,0x8A,0xB2,0x62,0x02,0xFE,0x00,0x00,
  29. 0x00,0x7F,0x40,0x40,0x7F,0x40,0x40,0x40,0x40,0x40,0x7F,0x40,0x40,0x7F,0x00,0x00};
  30. uchar code lei1[]={/*-- 文字: 畾 --*/
  31. /*-- 宋体12; 此字体下对应的点阵为:宽x 高=16x16 --*/
  32. 0x80,0x80,0x80,0xBF,0xA5,0xA5,0xA5,0x3F,0xA5,0xA5,0xA5,0xBF,0x80,0x80,0x80,0x00,
  33. 0x7F,0x24,0x24,0x3F,0x24,0x24,0x7F,0x00,0x7F,0x24,0x24,0x3F,0x24,0x24,0x7F,0x00};
  34. /*写指令到LCD 模块*/
  35. void transfer_command_lcd(int data1)
  36. {
  37.         char i;
  38.         lcd_cs1=0;
  39.         lcd_rs=0;
  40.         for(i=0;i<8;i++)
  41.         {
  42.                 lcd_sclk=0;
  43.                 delay_us(1);
  44.         if(data1&0x80) lcd_sid=1;
  45.         else lcd_sid=0;
  46.         lcd_sclk=1;
  47.         delay_us(1);
  48.         data1=data1<<=1;
  49.         }
  50.         lcd_cs1=1;
  51. }
  52. /*写数据到LCD 模块*/
  53. void transfer_data_lcd(int data1)
  54. {
  55.         char i;
  56.         lcd_cs1=0;
  57.         lcd_rs=1;
  58.         for(i=0;i<8;i++)
  59.         {
  60.                 lcd_sclk=0;
  61.                 if(data1&0x80) lcd_sid=1;
  62.                 else lcd_sid=0;
  63.                 lcd_sclk=1;
  64.                 data1=data1<<=1;
  65.         }
  66.         lcd_cs1=1;
  67. }
  68. /*延时*/
  69. void delay(int i)
  70. {
  71.         int j,k;
  72.         for(j=0;j<i;j++)
  73.         for(k=0;k<500;k++);
  74. }
  75. /*短延时*/
  76. void delay_us(int i)
  77. {
  78.         int j,k;
  79.         for(j=0;j<i;j++)
  80.         for(k=0;k<2;k++);
  81. }
  82. /*等待一个按键,我的主板是用P2.0 与GND 之间接一个按键*/
  83. void waitkey()
  84. {
  85.         repeat:
  86.         if (P2&0x01) goto repeat;
  87.                 else delay(60);
  88.         if (P2&0x01) goto repeat;
  89.                 else
  90.                 delay(400);
  91. }
  92. /*LCD 模块初始化*/
  93. void initial_lcd()
  94. {
  95.         lcd_reset=0; /*低电平复位*/
  96.                 delay(20);
  97.         lcd_reset=1; /*复位完毕*/
  98.                 delay(20);
  99.         transfer_command_lcd(0xe2); /*软复位*/
  100.                 delay(5);
  101.         transfer_command_lcd(0x2c); /*升压步聚1*/
  102.                 delay(5);
  103.         transfer_command_lcd(0x2e); /*升压步聚2*/
  104.                 delay(5);
  105.         transfer_command_lcd(0x2f); /*升压步聚3*/
  106.                 delay(5);
  107.         transfer_command_lcd(0x24); /*粗调对比度,可设置范围0x20~0x27*/
  108.         transfer_command_lcd(0x81); /*微调对比度*/
  109.         transfer_command_lcd(0x15); /*0x1a,微调对比度的值,可设置范围0x00~0x3f*/
  110.         transfer_command_lcd(0xa2); /*1/9 偏压比(bias)*/
  111.         transfer_command_lcd(0xc8); /*行扫描顺序:从上到下*/
  112.         transfer_command_lcd(0xa0); /*列扫描顺序:从左到右*/
  113.         transfer_command_lcd(0x40); /*起始行:第一行开始*/
  114.         transfer_command_lcd(0xaf); /*开显示*/
  115. }
  116. void lcd_address(uint page,uint column)
  117. {
  118.         column=column-1;
  119.         transfer_command_lcd(0xb0+page-1); /*设置页地址*/
  120.         transfer_command_lcd(0x10+(column>>4&0x0f)); /*设置列地址的高4 位*/
  121.         transfer_command_lcd(column&0x0f); /*设置列地址的低4 位*/
  122. }
  123. /*全屏清屏*/
  124. void clear_screen()
  125. {
  126.         unsigned char i,j;
  127.         for(i=0;i<9;i++)
  128.         {
  129.                 lcd_address(1+i,1);
  130.         for(j=0;j<224;j++)
  131.         {
  132.                 transfer_data_lcd(0x00);
  133.         }
  134.         }
  135.         lcd_cs1=1;
  136. }
  137. //===显示测试画面:例如全显示,隔行显示,隔列显示,雪花显示=====
  138. void test_display(uchar data1,uchar data2)
  139. {
  140.         int i,j;
  141.         for(j=0;j<8;j++)
  142.         {
  143.                 lcd_address(j+1,1);
  144.         for(i=0;i<128;i++)
  145.         {
  146.                 transfer_data_lcd(data1);
  147.                 transfer_data_lcd(data2);
  148.         }
  149.         }
  150. }
  151. /*显示128x64 点阵图像*/
  152. void display_128x64(uchar *dp)
  153. {
  154.         uint i,j;
  155.         for(j=0;j<8;j++)
  156.         {
  157.         lcd_address(j+1,1);
  158.         for (i=0;i<128;i++)
  159.         {
  160.                 transfer_data_lcd(*dp); /*写数据到LCD,每写完一个8 位的数据后列地址自动加1*/
  161.                 dp++;
  162.         }
  163.         }
  164. }
  165. /*显示32x32 点阵图像、汉字、生僻字或32x32 点阵的其他图标*/
  166. void display_graphic_32x32(uchar page,uchar column,uchar *dp)
  167. {
  168.         uchar i,j;
  169.         for(j=0;j<4;j++)
  170.         {
  171.                 lcd_address(page+j,column);
  172.         for (i=0;i<31;i++)
  173.         {
  174.                 transfer_data_lcd(*dp); /*写数据到LCD,每写完一个8 位的数据后列地址自动加1*/
  175.         dp++;
  176.         }
  177.         }
  178. }
  179. /*显示16x16 点阵图像、汉字、生僻字或16x16 点阵的其他图标,reverse=1 反显*/
  180. void display_graphic_16x16(uint page,uint column,uchar reverse,uchar *dp)
  181. {
  182.         uint i,j;
  183.         for(j=0;j<2;j++)
  184.         {
  185.                 lcd_address(page+j,column);
  186.         for (i=0;i<16;i++)
  187.         {
  188.                 if(reverse==1)
  189.                         transfer_data_lcd(~*dp); /*写数据到LCD,每写完一个8 位的数据后列地址自动加1*/
  190.                 else
  191.                         transfer_data_lcd(*dp); /*写数据到LCD,每写完一个8 位的数据后列地址自动加1*/
  192.                 dp++;
  193.         }
  194.         }
  195. }
  196. /*显示8x16 点阵图像、ASCII, 或8x16 点阵的自造字符、其他图标,reverse=1 反显*/
  197. void display_graphic_8x16(uint page,uchar column,uchar reverse,uchar *dp)
  198. {
  199.         uint i,j;
  200.         for(j=0;j<2;j++)
  201.         {
  202.                 lcd_address(page+j,column);
  203.         for (i=0;i<8;i++)
  204.         {
  205.                 if(reverse==1)
  206.                         transfer_data_lcd(~*dp); /*写数据到LCD,每写完一个8 位的数据后列地址自动加1*/
  207.                 else
  208.                         transfer_data_lcd(*dp); /*写数据到LCD,每写完一个8 位的数据后列地址自动加1*/
  209.         dp++;
  210.         }
  211.         }
  212. }
  213. /*显示 5*7 点阵图像、ASCII, 或5x7 点阵的自造字符、其他图标*/
  214. void display_graphic_5x7(uint page,uchar column,uchar reverse,uchar *dp)
  215. {
  216.         uint col_cnt;
  217.         uchar page_address;
  218.         uchar column_address_L,column_address_H;
  219.         page_address = 0xb0+page-1;
  220.         column_address_L =(column&0x0f)-1;
  221.         column_address_H =((column>>4)&0x0f)+0x10;
  222.         transfer_command_lcd(page_address); /*Set Page Address*/
  223.         transfer_command_lcd(column_address_H); /*Set MSB of column Address*/
  224.         transfer_command_lcd(column_address_L); /*Set LSB of column Address*/
  225.         for (col_cnt=0;col_cnt<6;col_cnt++)
  226.         {
  227.                 if(reverse==1)
  228.                         transfer_data_lcd(~*dp); /*写数据到LCD,每写完一个8 位的数据后列地址自动加1*/
  229.                 else
  230.                         transfer_data_lcd(*dp); /*写数据到LCD,每写完一个8 位的数据后列地址自动加1*/
  231.                 dp++;
  232.         }
  233. }
  234. /****送指令到晶联讯字库IC***/
  235. void send_command_to_ROM( uchar datu )
  236. {
  237.         uchar i;
  238.         for(i=0;i<8;i++ )
  239.         {
  240.                 if(datu&0x80)
  241.                         Rom_IN = 1;
  242.                 else
  243.                         Rom_IN = 0;
  244.                         datu = datu<<1;
  245.                         Rom_SCK=0;
  246.                         Rom_SCK=1;
  247.         }
  248. }
  249. /****从晶联讯字库IC 中取汉字或字符数据(1 个字节)***/
  250. static uchar get_data_from_ROM( )
  251. {
  252.         uchar i;
  253.         uchar ret_data=0;
  254.         Rom_SCK=1;
  255.         for(i=0;i<8;i++)
  256.         {
  257.                 Rom_OUT=1;
  258.                 Rom_SCK=0;
  259.                 ret_data=ret_data<<1;
  260.         if( Rom_OUT )
  261.                 ret_data=ret_data+1;
  262.         else
  263.                 ret_data=ret_data+0;
  264.                 Rom_SCK=1;
  265.         }
  266.         return(ret_data);
  267. }
  268. /*从相关地址(addrHigh:地址高字节,addrMid:地址中字节,addrLow:地址低字节)中连续读出DataLen 个字节的数据到 pBuff 的地址*/
  269. /*连续读取*/
  270. void get_n_bytes_data_from_ROM(uchar addrHigh,uchar addrMid,uchar addrLow,uchar *pBuff,uchar DataLen )
  271. {
  272.         uchar i;
  273.         Rom_CS = 0;
  274.         lcd_cs1=1;
  275.         Rom_SCK=0;
  276.         send_command_to_ROM(0x03);
  277.         send_command_to_ROM(addrHigh);
  278.         send_command_to_ROM(addrMid);
  279.         send_command_to_ROM(addrLow);
  280.         for(i = 0; i < DataLen; i++ )
  281.         *(pBuff+i) =get_data_from_ROM();
  282.         Rom_CS = 1;
  283. }
  284. /******************************************************************/
  285.         ulong fontaddr=0;
  286. void display_GB2312_string(uchar y,uchar x,uchar reverse,uchar *text)
  287. {
  288.         uchar i= 0;
  289.         uchar addrHigh,addrMid,addrLow ;
  290.         uchar fontbuf[32];
  291.         while((text[i]>0x00))
  292.         {
  293.                 if(((text[i]>=0xb0) &&(text[i]<=0xf7))&&(text[i+1]>=0xa1))
  294.                 {
  295.                         /*国标简体(GB2312)汉字在晶联讯字库IC 中的地址由以下公式来计算:*/
  296.                 /*Address = ((MSB - 0xB0) * 94 + (LSB - 0xA1)+ 846)*32+ BaseAdd;BaseAdd=0*/
  297.                 /*由于担心8 位单片机有乘法溢出问题,所以分三部取地址*/
  298.                         fontaddr = (text[i]- 0xb0)*94;
  299.                         fontaddr += (text[i+1]-0xa1)+846;
  300.                         fontaddr = (ulong)(fontaddr*32);
  301.                         addrHigh = (fontaddr&0xff0000)>>16; /*地址的高8 位,共24 位*/
  302.                         addrMid = (fontaddr&0xff00)>>8; /*地址的中8 位,共24 位*/
  303.                         addrLow = fontaddr&0xff; /*地址的低8 位,共24 位*/
  304.                         get_n_bytes_data_from_ROM(addrHigh,addrMid,addrLow,fontbuf,32 );/*取32 个字节的数据,存到"fontbuf[32]"*/
  305.                         display_graphic_16x16(y,x,reverse,fontbuf);/*显示汉字到LCD 上,y 为页地址,x 为列地址,fontbuf[]为数据*/
  306.                         i+=2;
  307.                         x+=16;
  308.                 }
  309.                 else if(((text[i]>=0xa1) &&(text[i]<=0xa3))&&(text[i+1]>=0xa1))
  310.                 {
  311.                         /*国标简体(GB2312)15x16 点的字符在晶联讯字库IC 中的地址由以下公式来计算:*/
  312.                         /*Address = ((MSB - 0xa1) * 94 + (LSB - 0xA1))*32+ BaseAdd;BaseAdd=0*/
  313.                         /*由于担心8 位单片机有乘法溢出问题,所以分三部取地址*/
  314.                         fontaddr = (text[i]- 0xa1)*94;
  315.                         fontaddr += (text[i+1]-0xa1);
  316.                         fontaddr = (ulong)(fontaddr*32);
  317.                         addrHigh = (fontaddr&0xff0000)>>16; /*地址的高8 位,共24 位*/
  318.                         addrMid = (fontaddr&0xff00)>>8; /*地址的中8 位,共24 位*/
  319.                         addrLow = fontaddr&0xff; /*地址的低8 位,共24 位*/
  320.                         get_n_bytes_data_from_ROM(addrHigh,addrMid,addrLow,fontbuf,32 );/*取32 个字节的数据,存到"fontbuf[32]"*/
  321.                         display_graphic_16x16(y,x,reverse,fontbuf);/*显示汉字到LCD 上,y 为页地址,x 为列地址,fontbuf[]为数据*/
  322.                         i+=2;
  323.                         x+=16;
  324. }
  325. else if((text[i]>=0x20) &&(text[i]<=0x7e))
  326. {
  327. unsigned char fontbuf[16];
  328. fontaddr = (text[i]- 0x20);
  329. fontaddr = (unsigned long)(fontaddr*16);
  330. fontaddr = (unsigned long)(fontaddr+0x3cf80);
  331. addrHigh = (fontaddr&0xff0000)>>16;
  332. addrMid = (fontaddr&0xff00)>>8;
  333. addrLow = fontaddr&0xff;
  334. get_n_bytes_data_from_ROM(addrHigh,addrMid,addrLow,fontbuf,16 );/*取16 个字节的数据,存到"fontbuf[32]"*/
  335. display_graphic_8x16(y,x,reverse,fontbuf);/*显示8x16的ASCII字到LCD 上,y 为页地址,x 为列地址,fontbuf[]为数据*/
  336. i+=1;
  337. x+=8;
  338. }
  339. else
  340. i++;
  341. }
  342. }
  343. void display_string_5x7(uchar y,uchar x,uchar *text)
  344. {
  345. unsigned char i= 0;
  346. unsigned char addrHigh,addrMid,addrLow ;
  347. while((text[i]>0x00))
  348. {
  349. if((text[i]>=0x20) &&(text[i]<=0x7e))
  350. {
  351. unsigned char fontbuf[8];
  352. fontaddr = (text[i]- 0x20);
  353. fontaddr = (unsigned long)(fontaddr*8);
  354. fontaddr = (unsigned long)(fontaddr+0x3bfc0);
  355. addrHigh = (fontaddr&0xff0000)>>16;
  356. addrMid = (fontaddr&0xff00)>>8;
  357. addrLow = fontaddr&0xff;
  358. get_n_bytes_data_from_ROM(addrHigh,addrMid,addrLow,fontbuf,8);/*取8 个字节的数据,存到"fontbuf[32]"*/
  359. display_graphic_5x7(y,x,0,fontbuf);/*显示5x7的ASCII字到LCD上,y为页地址,x 为列地址,fontbuf[]为数据*/
  360. i+=1;
  361. x+=6;
  362. }
  363. else
  364. i++;
  365. }
  366. }
  367. //===============main program===================
  368. void main(void)
  369. {
  370. while(1)
  371. {
  372. Rom_CS=1;
  373. lcd_cs1=0;
  374. initial_lcd();
  375. clear_screen(); //clear all dots
  376. display_128x64(bmp1);
  377. waitkey();
  378. clear_screen(); //clear all dots
  379. display_128x64(bmp2);
  380. waitkey();
  381. clear_screen(); //clear all dots
  382. display_128x64(bmp3);
  383. waitkey();
  384. clear_screen();
  385. display_GB2312_string(1,1,0,"JLX12864G-132-PC"); /*在第1 页,第1 列,显示一串16x16 点阵汉字或8x16 的ASCII 字*/
  386. display_GB2312_string(3,1,1,"16X16 简体汉字库,");
  387. display_GB2312_string(5,1,0,"或8X16 点阵ASCII,"); /*显示一串16x16 点阵汉字或8x16 的ASCII 字.以下雷同*/
  388. display_GB2312_string(7,1,0,"或5X7 点阵ASCII 码");
  389. waitkey();
  390. clear_screen();
  391. display_GB2312_string(1,1,0,"abcdefghijklmnoprstuvwxyz"); /*在第1 页,第1 列,显示一串16x16 点阵汉字或8*16 的ASCII 字*/
  392. display_string_5x7(3,1,"abcdefghijklmnopqrstu");/*在第3 页,第1 列,显示一串5x7 点阵的ASCII 字*/
  393. display_string_5x7(4,1,"JLX electronics Co., ");/*显示一串5x7 点阵的ASCII 字*/
  394. display_string_5x7(5,1,"Ltd. established at ");/*显示一串5x7 点阵的ASCII 字*/
  395. display_string_5x7(6,1,"year 2004.Focus LCM. ");/*显示一串5x7 点阵的ASCII 字*/
  396. display_string_5x7(7,1,"TEL:TEL:0755-29784961 ");/*显示一串5x7 点阵的ASCII 字*/
  397. display_string_5x7(8,1,"FAX:0755-29784964 ");/*显示一串5x7 点阵的ASCII 字*/
  398. waitkey();
  399. clear_screen();
  400. display_graphic_32x32(1,(1+32*1),cheng1); /*在第1 页,第49 列显示单个汉字"成"*/
  401. display_graphic_32x32(1,(1+32*2),gong1); /*在第1 页,第49 列显示单个汉字"功"*/
  402. display_graphic_16x16(6,1,1,zhuang1); /*在第5 页,第1 列显示单个汉字"状"*/
  403. display_graphic_16x16(6,(1+16),1,tai1); /*在第5 页,第17 列显示单个汉字"态"*/
  404. display_GB2312_string(6,(1+16*2),0,":");
  405. display_graphic_16x16(6,(1+16*2+8),0,shi1); /*在第5 页,第41 列显示单个汉字"使"*/
  406. display_graphic_16x16(6,(1+16*3+8),0,yong1); /*在第5 页,第49 列显示单个汉字"用"*/
  407. display_GB2312_string(6,(1+16*4+8*2),0,"12:45");
  408. waitkey();
  409. clear_screen();
  410. ……………………

  411. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
JLX12864测试程序.docx (22.96 KB, 下载次数: 101)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:61140 发表于 2018-1-4 04:00 | 只看该作者
试过了,高低不显示
回复

使用道具 举报

板凳
ID:274607 发表于 2018-2-5 16:51 | 只看该作者
我的好像运行也是不对
回复

使用道具 举报

地板
ID:92753 发表于 2018-3-8 22:50 | 只看该作者
楼主会使用这个液晶串行显示一个浮点变量吗?
回复

使用道具 举报

5#
ID:97811 发表于 2018-5-18 22:01 | 只看该作者
进来学习的,谢谢分享
回复

使用道具 举报

6#
ID:227504 发表于 2018-5-25 22:10 | 只看该作者
guxiaoxing 发表于 2018-2-5 16:51
我的好像运行也是不对

我的液晶jlx12864-g-086无字库。我的显示正常呀,是不是接线问题
回复

使用道具 举报

7#
ID:581531 发表于 2019-7-13 16:51 | 只看该作者
有用
回复

使用道具 举报

8#
ID:398219 发表于 2021-12-1 14:15 | 只看该作者
这人就是例程嘛,怎么显示自已定义的变量呀
回复

使用道具 举报

9#
ID:1067203 发表于 2023-4-4 21:03 | 只看该作者
能生成hex文件,但我没点亮屏,用的是89c52芯片
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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