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 }

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

原文地址:https://www.cnblogs.com/ningci/p/5426286.html