找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机+lcd1602液晶屏打字机程序

[复制链接]
跳转到指定楼层
楼主
ID:137190 发表于 2016-9-27 19:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

完整程序下载:
1602液晶屏打字机.zip (21.45 KB, 下载次数: 13)

  1. /********************************************************************************************
  2. 程序名:    1602液晶屏时钟程序
  3. 编写人:    杜洋 
  4. 编写时间:  2009年7月6日
  5. 硬件支持:  LCD1602液晶屏  STC12C2052 外部12MHZ晶振
  6. 说明备注:    使用2402液晶屏程序,与1602液晶屏程序完全兼容
  7. /********************************************************************************************/
  8. #include <STC12C2052AD.h>                                                // 包含头文件 //
  9. /********************************************************************************************/
  10. typedef unsigned char      uint8;          // 无符号8位整型变量 //

  11. /********************************************************************************************
  12. // 引脚定义 // (使用者根据实际更改)
  13. /********************************************************************************************/
  14. #define                LCM2402_DB0_DB7                P1                        // 定义LCM2402的数据总线
  15. sbit LCM2402_RS   = P3 ^ 2;                                        // 定义LCM2402的RS控制线
  16. sbit LCM2402_RW   = P3 ^ 3;                                        // 定义LCM2402的RW控制线
  17. sbit LCM2402_E    = P3 ^ 4;                                        // 定义LCM2402的E控制线
  18. sbit LCM2402_Busy = P1 ^ 7;                                        // 定义LCM2402的测忙线(与LCM2402_DB0_DB7关联)
  19. /********************************************************************************************
  20. // 定义LCM2402指令集 // (详细请见技术手册)
  21. /********************************************************************************************/
  22. #define                        CMD_clear                0x01             // 清除屏幕
  23. #define                        CMD_back                0x02             // DDRAM回零位
  24. #define                        CMD_dec1                0x04             // 读入后AC(指针)减1,向左写
  25. #define                        CMD_add1                0x06             // 读入后AC(指针)加1,向右写
  26. #define                        CMD_dis_gb1                0x0f             // 开显示_开光标_开光标闪烁
  27. #define                        CMD_dis_gb2                0x0e             // 开显示_开光标_关光标闪烁
  28. #define                        CMD_dis_gb3                0x0c             // 开显示_关光标_关光标闪烁
  29. #define                        CMD_OFF_dis                0x08             // 关显示_关光标_关光标闪烁
  30. #define                        CMD_set82                0x38             // 8位总线_2行显示
  31. #define                        CMD_set81                0x30             // 8位总线_1行显示(上边行)
  32. #define                        CMD_set42                0x28             // 4位总线_2行显示
  33. #define                        CMD_set41                0x20             // 4位总线_1行显示(上边行)
  34. #define                        lin_1                        0x80             // 4位总线_1行显示(上边行)
  35. #define                        lin_2                        0xc0             // 4位总线_1行显示(上边行)

  36. /********************************************************************************************
  37. // 读LCM忙程序 [底层协议] // (所有底层协议都无需关注)
  38. // LCM2402测忙,若LCM2402处于忙状态,本函数将等待至非忙状态 //
  39. /********************************************************************************************/
  40. void LCM2402_TestBusy(void){
  41.            LCM2402_DB0_DB7 = 0xff;                //设备读状态
  42.            LCM2402_RS = 0;
  43.            LCM2402_RW = 1;
  44.            LCM2402_E = 1;
  45.            while(LCM2402_Busy);                //等待LCM不忙
  46.            LCM2402_E = 0;                                //
  47. }
  48. /********************************************************************************************
  49. // 写指令程序 //
  50. // 向LCM2402写命令 本函数需要1个指令集的入口参数 //
  51. /********************************************************************************************/
  52. void LCM2402_WriteCMD(uint8 LCM2402_command) {
  53.           LCM2402_TestBusy();
  54.           LCM2402_DB0_DB7 = LCM2402_command;
  55.           LCM2402_RS = 0;
  56.           LCM2402_RW = 0;
  57.           LCM2402_E = 1;
  58.           LCM2402_E = 0;
  59. }
  60. /********************************************************************************************
  61. // 写数据程序 //
  62. // 向LCM2402写数据 //
  63. /********************************************************************************************/
  64. void LCM2402_WriteData(uint8 LCM2402_data){
  65.     LCM2402_TestBusy();
  66.         LCM2402_DB0_DB7 = LCM2402_data;
  67.           LCM2402_RS = 1;
  68.           LCM2402_RW = 0;
  69.           LCM2402_E = 1;
  70.           LCM2402_E = 0;
  71. }
  72. /********************************************************************************************
  73. // 打印字符串程序 // (本函数调用指针函数)
  74. // 向LCM发送一个字符串,长度48字符之内
  75. // 第一行位置 0x00~0x17  第二行位置 0x40~0x57
  76. // 应用举例:print(0x80,"doyoung.net"); //在第一行第一位处从左向右打印doyoung.net字符串
  77. /********************************************************************************************/
  78. void print(uint8 a,uint8 *str){
  79.         LCM2402_WriteCMD(a | 0x80);
  80.         while(*str != '\0'){
  81.                 LCM2402_WriteData(*str++);
  82.         }
  83.         *str = 0;
  84. }
  85. /********************************************************************************************
  86. // 打印单字符程序 //
  87. // 第一行位置 0x00~0x17  第二行位置 0x40~0x57
  88. // 向LCM发送一个字符,以十六进制(0x00)表示
  89. // 应用举例:print(0xc0,0x30); //在第二行第一位处打印字符“0”
  90. /********************************************************************************************/
  91. void print2(uint8 a,uint8 t){
  92.                 LCM2402_WriteCMD(a | 0x80);
  93.                 LCM2402_WriteData(t);
  94. }
  95. /********************************************************************************************
  96. // LCM2402初始化 //(使用者可自定义,加 * 号程序行必须保留但可修改)
  97. /********************************************************************************************/
  98. void LCM2402_Init(void){
  99.           LCM2402_WriteCMD(CMD_set82);        //* 显示模式设置:显示2行,每个字符为5*7个像素
  100.           LCM2402_WriteCMD(CMD_clear);        //  显示清屏
  101.           LCM2402_WriteCMD(CMD_back);                //* 数据指针指向第1行第1个字符位置
  102.           LCM2402_WriteCMD(CMD_add1);                //  显示光标移动设置:文字不动,光标右移
  103.           LCM2402_WriteCMD(CMD_dis_gb3);         //  显示开及光标设置:显示开,光标开,闪烁开
  104. }
  105. /********************************************************************************************/
  106. //                        以上是LCM2402驱动程序                        //
  107. /*********************************************************************************************/

  108. /********************************************************************************************
  109. 串口初始化程序:波特率4800,(终端设置:4800,8,无,1,无)
  110. /********************************************************************************************/
  111. void Init_COM(void){
  112.         TMOD = 0x20;        //定时器工作方式设置,定时器1方式2
  113.         SCON = 0x50;        //串口工作方式1,允许串口接收   
  114.         TH1 = 0xF3;                //定时器初值高8位设置
  115.         TL1 = 0xF3;                //定时器初值低8位设置
  116.         PCON = 0x80;        //波特率倍频
  117.         TR1 = 1;                //定时器启动   
  118. }

  119. /********************************************************************************************
  120. 主程序:实现接收数据并把接收到的数据发送出去
  121. /********************************************************************************************/
  122. void main(){
  123.    unsigned char dat,li=0x80;
  124.    Init_COM();                //串口初始化
  125.    LCM2402_Init();        //LCM2402初始化
  126.    print(0x80," DoYoung Studio "); //在第一行打印LOGO字符
  127.    print(0x40,"Input your words"); //在第二行打印LOGO字符
  128.    while(1){
  129.        if (RI == 1){                //接收中断标志位为1时
  130.                         dat = SBUF;                //接收数据 SBUF 为单片机的接收发送缓冲寄存器
  131.             RI = 0;                        //令接收中断标志位为0(软件清零)
  132.                     SBUF = dat;                //将接收的数据发送回PC
  133.                         while(TI == 0);
  134.                         TI = 0;
  135.                         print2(li,dat); //在第一行显示串口字符串
  136.                         li++;
  137.                         if(li > 0x8f){
  138.                                 li = 0x40;
  139.                         }
  140.                         if(li > 0x4f && li < 0x80){
  141.                                 li = 0x80;
  142.                         }
  143.                 }
  144.    }
  145. }
  146. /********************************************************************************************/

  147. /*************************************************************
  148. * 杜洋工作室 DoYoung Studio
  149. * 分享创意电子 Share ideas of electronic
  150. /*************************************************************/
复制代码



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

使用道具 举报

沙发
ID:7485 发表于 2016-9-27 19:47 | 只看该作者
电脑打字,串口发送,单片机接收,送1602显示?
回复

使用道具 举报

板凳
ID:137190 发表于 2016-9-28 00:36 | 只看该作者
ahshmj 发表于 2016-9-27 19:47
电脑打字,串口发送,单片机接收,送1602显示?

是的就是这个流程,电脑上要打开串口调试助手。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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