• Proteus 8 画原理图仿真 1602 LCD显示字符


    以下是源程序:

      1 #include <reg52.h>
      2 #include<intrins.h>
      3 
      4 /**
      5  * P2 上接的是 D1 ~ D7
      6  */
      7 sbit RS = P3 ^ 0;//数据 H 命令 L
      8 sbit RW = P3 ^ 1;//读 H 写 L
      9 sbit E  = P3 ^ 2;//高电平 H 使能
     10 #define DATA P2
     11 
     12 /**
     13  * 经过逻辑分析仪测量时间 
     14  * 单指令是 5us
     15  * nop 0.4ms
     16  * 经过试验发现, 只需要一个单指令执行时间 5us 休眼就可以
     17  * E = 1 后需要等一小段时间, 在手册中并没有说明 - 
     18  */
     19 
     20 void delayms(char ms);
     21 char is_busy();
     22 void write_cmd(unsigned char cmd);
     23 void write_data(unsigned char dat);
     24 void pos (unsigned char pos);
     25 
     26 void main()
     27 {
     28     //初始化 复位 lcd1602
     29     write_cmd(0x38);//设置显示模式 指令码 00111000 => 0x38
     30     delayms(1);
     31     write_cmd(0x0c);//开显示 不显示光标 不闪烁
     32     delayms(1);
     33     write_cmd(0x06);//光标设置 写字符后指针加一
     34     delayms(1);
     35     write_cmd(0x01);//光标清0 指针清0
     36     delayms(1);
     37     
     38     pos (0);
     39     write_data('1');
     40     write_data('2');
     41     write_data('3');
     42     write_data('4');
     43     write_data('5');
     44     write_data('6');
     45     write_data('7');
     46     write_data('8');
     47     write_data('9');
     48     write_data('0');
     49     
     50     pos (0x40);
     51     
     52     write_data('1');
     53     write_data('2');
     54     write_data('3');
     55     write_data('4');
     56     write_data('5');
     57     
     58     while(1);
     59 }
     60 
     61 void pos (unsigned char pos)
     62 {
     63     //设置指针位置 0x80 | 位置
     64     write_cmd(pos|0x80);
     65 }
     66 
     67 void write_data(unsigned char dat)
     68 {
     69     while(is_busy());
     70     RS = 1;
     71     RW = 0;
     72     E  = 0;
     73     //_nop_();
     74     DATA = dat;
     75     _nop_();
     76     E = 1;//在E 高向低变化时传输
     77     E = 0;
     78 }
     79 
     80 void write_cmd(unsigned char cmd)
     81 {
     82     while(is_busy());
     83     RS = 0;
     84     RW = 0;
     85     E  = 0;
     86     //_nop_();
     87     DATA = cmd;
     88     _nop_();
     89     E = 1;//在E 高向低变化时传输
     90     E = 0;
     91 }
     92 
     93 char is_busy()
     94 {
     95     int a=0;
     96     char result;
     97     RS = 0;//发送的是命令
     98     RW = 1;// 99     //_nop_();
    100     E  = 1;//使能
    101     _nop_();
    102     result = (1<<7 & DATA);//7bit 1 忙 0 不忙
    103     E = 0;//取消使能
    104     return result;
    105 }
    106 
    107 void delayms(char ms)        //@12.000MHz
    108 {
    109     while(ms--)
    110     {
    111         unsigned char i, j;
    112         i = 2;
    113         j = 239;
    114         do
    115         {
    116             while (--j);
    117         } while (--i);
    118     }
    119 }

    仿真显示少了一个字符, 不知道什么原因。 等真机到了,在试验。

  • 相关阅读:
    JSP&JavaBean
    Cookie&&Session
    多个请求使用同一个 Servlet
    C3P0--数据库连接池
    navicat设置唯一键——unique
    J2EE常用组件简介
    JSP基础知识_3
    JSP基础知识_2
    JSP基础知识_1
    Android
  • 原文地址:https://www.cnblogs.com/ningci/p/5426286.html
Copyright © 2020-2023  润新知