以下是源程序:
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 }
仿真显示少了一个字符, 不知道什么原因。 等真机到了,在试验。