Proteus 8 畫原理圖仿真 1602 LCD顯示字符

 

如下是源程序:spa

  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 }

 

仿真顯示少了一個字符, 不知道什麼緣由。 等真機到了,在試驗。指針

相關文章
相關標籤/搜索