找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机驱动不带字库的液晶12864显示源程序(有详细注释)

[复制链接]
跳转到指定楼层
楼主
ID:422071 发表于 2018-11-6 22:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include <REG52.H>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. delay(uint i){ while(i--);}
  5. //12864引脚定义
  6. #define lcdDat P0  /* LCD12864 数据线 */
  7. sbit cs1= P2^3;    /* 右屏片选,高电平有效 */
  8. sbit cs2= P2^4;    /* 左屏片选,高电平有效 */
  9. sbit en = P2^0;    /* 读,写使能,高电平有效,下沿锁定数据 */
  10. sbit rw = P2^1;    /* 1读\0写 */
  11. sbit rs = P2^2;    /* 1数据\0指令 */
  12. /** LCM忙检测 **/
  13. busy12864(){
  14. lcdDat=0xff;    //口线置1,防止干扰
  15. rs=0; rw=1;    //置“命令、读”模式
  16. //en=1; while(lcdDat&0x80); en=0;//忙等待
  17. }
  18. /** 写命令 参数:comDat为要发送的命令 **/
  19. WriteCom(uchar comDat){  
  20.     busy12864();       //忙,则等待
  21. rs=0;rw=0;    //置“命令、写”模式
  22.     lcdDat=comDat;en=1;en=0;//送出命令,并使之有效
  23. }
  24. /** 写数据 参数:dat为要发送的数据 **/
  25. WriteDat(uchar dat){  
  26.     busy12864();      //忙,则等待
  27. rs=1;rw=0;      //置“数据、写”模式
  28.     lcdDat=dat;en=1;en=0; //送出数据,并使之有效
  29. }
  30. //清屏函数
  31. void clrLCD(){
  32. uchar i,j;
  33. cs1=cs2=1;      //同时选中左右屏
  34. for(i=0;i<8;i++){    //共8页
  35.   WriteCom(0xB8+i);  //光标到i页
  36.   WriteCom(0x40);    //光标到页首
  37.   for(j=0;j<64;j++)WriteDat(0); //写0清屏
  38. }
  39. }
  40. /** 初始化12864 **/
  41. Init12864(){
  42. lcdDat=0xff;   //口线置1,防止干扰
  43. rs=0; rw=1;    //置“命令、读”模式
  44. //en=1; while(lcdDat&0x10); en=0;//等待复位完成
  45. WriteCom(0x3f);   //开显示
  46. WriteCom(0xc0);   //设置显示起始行
  47. clrLCD();    //清屏
  48. }
  49. uchar code zm8x16_index[]="ABC"; //索引字串
  50. uchar code zm8x16_Table[][16]={  //字串字模
  51. 0xE0,0xF0,0x98,0x8C,0x98,0xF0,0xE0,0,15,15,0x0,0,0,15,15,0,//A
  52. 0x04,0xFC,0xFC,0x44,0x44,0xFC,0xB8,0, 8,15,0xF,8,8,15, 7,0,//B
  53. 0xF0,0xF8,0x0C,0x04,0x04,0x0C,0x18,0,0x03,7,0xC,8,8,12,6,0 //C
  54. };
  55. uchar code zm16x16_index[]="您好";//字串索引
  56. uchar code zm16x16_Table[][32]={  //字串字模
  57. 0x40,32,16,0xFC,0x23,16,0x8C,0x67,4,0xF4,4,0x44,0x94,0x8C,0,0,//您
  58. 64,48,0,0x77,0x80,0x81,0x88,0x92,0xB4,0x83,128,0xE0,0,17,96,0,
  59. 16,16,15,31,16,0xF0,128,130,130,130,0xE2,0x92,0x8A,0xC6,128,0,//好
  60. 0x40,0x22,0x15,0x08,0x14,0x63,0,0,0x40,0x80,0x7F,0x00,0,0,0,0
  61. };
  62. /******** 任意尺寸点阵显示函数 ***********|
  63. |参数:显示位置:row页数,col列号,    |
  64. |    字符大小:x横向像素,y纵向页数   |
  65. |    显示内容:tab字模表          ******/
  66. showXY(uchar row,uchar col,uchar x,uchar y,uchar *tab){
  67. uchar i,j;
  68. bit right;
  69. if(col<64){right=0;} //置左右屏标志
  70. else {col-=64;right=1;}
  71. for(i=0;i<y;i++){
  72.   if(right)cs1=0,cs2=1;
  73.   else  cs1=1,cs2=0;
  74.   WriteCom(0xb8+row+i); //行
  75.   WriteCom(0x40+col);   //列
  76.   for(j=0;j<x;j++){
  77.    if(col+j<64)WriteDat(tab[i*x+j]); //未跨屏
  78.    else if(right==0){    //从左屏跨右屏
  79.      cs1=0,cs2=1;    //选中右屏
  80.      WriteCom(0xb8+row+i);    //设置行
  81.      WriteCom(0x40+(col+j-64));
  82.      WriteDat(tab[i*x+j]);
  83.    }       //在右屏越界不显示
  84.   }
  85. }
  86. }
  87. /* 返回一个8*16字符索引位置 */     
  88. uchar enN(uchar *s){
  89. uchar i;
  90. for(i=0;zm8x16_index[i]!=0;i++)if(zm8x16_index[i]==s[0])break;
  91. return i;
  92. }
  93. /* 返回一个16*16字符索引位置 */
  94. uchar cnN(uchar *s){
  95. uchar i;
  96. for(i=0;zm16x16_index[i]!=0;i+=2)
  97.   if(zm16x16_index[i]==*s&&zm16x16_index[i+1]==*(s+1))break ;
  98. return i/2;
  99. }
  100. /* 显示字符串 */
  101. void showStr(uchar row,uchar col,uchar *s){
  102.   uchar i;
  103.   for(i=0;s[i]!=0;i++){
  104.    if(s[i]<0x80){  //英文
  105.    showXY(row,col,8,2,zm8x16_Table[enN(&s[i])]);
  106.    col+=8;
  107.   }else{   
  108.    showXY(row,col,16,2,zm16x16_Table[cnN(&s[i])]);
  109.    col+=16;i+=1;  
  110.   }
  111.   if(col>120){  //换行处理
  112.    col=0;
  113.    row+=2;
  114.   }
  115.   }
  116. }
  117. void main(){
  118. Init12864();    //初始化
  119. showStr(0,0,"您好好ABC好");
  120. while(1);
  121. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:199427 发表于 2018-11-7 09:11 | 只看该作者
谢谢楼主分享的液晶12864显示源程序!
回复

使用道具 举报

板凳
ID:403593 发表于 2018-11-7 11:18 | 只看该作者
请问这个屏是什么驱动芯片?是KS0108驱动的么?
回复

使用道具 举报

地板
ID:285143 发表于 2018-12-23 09:36 | 只看该作者
你好,请问
0x40,32,16,0xFC,0x23,16,0x8C,0x67,4,0xF4,4,0x44,0x94,0x8C,0,0,//您
64,48,0,0x77,0x80,0x81,0x88,0x92,0xB4,0x83,128,0xE0,0,17,96,0,

这些数据是怎么取得的,我用的那个取模软件取出的不能正常显示
回复

使用道具 举报

5#
ID:285143 发表于 2018-12-24 15:18 来自手机 | 只看该作者
已解决,谢谢你的源码
回复

使用道具 举报

6#
ID:541690 发表于 2019-6-9 11:27 | 只看该作者
正好在学习液晶显示,学习下
回复

使用道具 举报

7#
ID:114701 发表于 2019-12-3 09:42 来自手机 | 只看该作者
谢谢分享!
回复

使用道具 举报

8#
ID:685851 发表于 2020-1-13 21:51 | 只看该作者
你好,请问
0x40,32,16,0xFC,0x23,16,0x8C,0x67,4,0xF4,4,0x44,0x94,0x8C,0,0,//您
64,48,0,0x77,0x80,0x81,0x88,0x92,0xB4,0x83,128,0xE0,0,17,96,0,

这些数据是怎么取得的,我用的那个取模软件取出的也不能正常显示
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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