C51 COMPILER V6.12 12864A_3 03/02/2007 13:44:57 PAGE 1 C51 COMPILER V6.12, COMPILATION OF MODULE 12864A_3 OBJECT MODULE PLACED IN .\12864A-3.OBJ COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE .\12864A-3.c DEBUG OBJECTEXTEND stmt level source 1 /*******************************************************************/ 2 /* */ 3 /* ME300B单片机开发系统演示程序 - 128*64LCD显示红外遥控器键值显示 */ 4 /* */ 5 //;* LCD型号:TS12864A-3(带汉字库)或兼容型号 控制器ST7920 */ 6 //;* MCU:AT89S52 ,晶体频率:11.0592MHz */ 7 /* */ 8 /* 邮箱: gguoqing@willar.com */ 9 /* 网站: http://www.willar.com */ 10 /* 作者: gguoqing */ 11 /* 时间: 2006/05/26 */ 12 /* */ - 13 /*【版权】Copyright(C)伟纳电子 www.willar.com All Rights Reserved */ 14 /*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息! */ 15 /* */ 16 /*******************************************************************/ 17 18 #include 19 #include 20 21 #define uchar unsigned char 22 #define uint unsigned int 23 /*TS12864A-3 端口定义*/ 24 #define LCD_data P0 //数据口 25 sbit LCD_RS = P3^5; //寄存器选择输入 26 sbit LCD_RW = P3^6; //液晶读/写控制 27 sbit LCD_EN = P3^4; //液晶使能控制 28 sbit LCD_PSB = P3^7; //串/并方式控制 29 sbit wela = P2^6; 30 sbit dula = P2^7; 31 32 uchar code dis1[] = {"天祥电子"}; 33 uchar code dis2[] = {"www.txmcu.com"}; 34 uchar code dis3[] = {"TX-1C 学习板 "}; 35 uchar code dis4[] = {"是您最好的选择! "}; 36 37 #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();}; 38 uchar IRDIS[2]; 39 uchar IRCOM[4]; 40 void delay0(uchar x); //x*0.14MS 41 void beep(); 42 void dataconv(); 43 void lcd_pos(uchar X,uchar Y); //确定显示位置 44 /*******************************************************************/ 45 /* */ 46 /* 延时函数 */ 47 /* */ 48 /*******************************************************************/ 49 void delay(int ms) 50 { 51 1 while(ms--) 52 1 { 53 2 uchar i; 54 2 for(i=0;i<250;i++) C51 COMPILER V6.12 12864A_3 03/02/2007 13:44:57 PAGE 2 55 2 { 56 3 _nop_(); 57 3 _nop_(); 58 3 _nop_(); 59 3 _nop_(); 60 3 } 61 2 } 62 1 } 63 /*******************************************************************/ 64 /* */ 65 /*检查LCD忙状态 */ 66 /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */ 67 /* */ 68 /*******************************************************************/ 69 bit lcd_busy() 70 { 71 1 bit result; 72 1 LCD_RS = 0; 73 1 LCD_RW = 1; 74 1 LCD_EN = 1; 75 1 delayNOP(); 76 1 result = (bit)(P0&0x80); 77 1 LCD_EN = 0; 78 1 return(result); 79 1 } 80 /*******************************************************************/ 81 /* */ 82 /*写指令数据到LCD */ 83 /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */ 84 /* */ 85 /*******************************************************************/ 86 void lcd_wcmd(uchar cmd) 87 { 88 1 while(lcd_busy()); 89 1 LCD_RS = 0; 90 1 LCD_RW = 0; 91 1 LCD_EN = 0; 92 1 _nop_(); 93 1 _nop_(); 94 1 P0 = cmd; 95 1 delayNOP(); 96 1 LCD_EN = 1; 97 1 delayNOP(); 98 1 LCD_EN = 0; 99 1 } 100 /*******************************************************************/ 101 /* */ 102 /*写显示数据到LCD */ 103 /*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */ 104 /* */ 105 /*******************************************************************/ 106 void lcd_wdat(uchar dat) 107 { 108 1 while(lcd_busy()); 109 1 LCD_RS = 1; 110 1 LCD_RW = 0; 111 1 LCD_EN = 0; 112 1 P0 = dat; 113 1 delayNOP(); 114 1 LCD_EN = 1; 115 1 delayNOP(); 116 1 LCD_EN = 0; C51 COMPILER V6.12 12864A_3 03/02/2007 13:44:57 PAGE 3 117 1 } 118 /*******************************************************************/ 119 /* */ 120 /* LCD初始化设定 */ 121 /* */ 122 /*******************************************************************/ 123 void lcd_init() 124 { 125 1 126 1 LCD_PSB = 1; //并口方式 127 1 128 1 lcd_wcmd(0x34); //扩充指令操作 129 1 delay(5); 130 1 lcd_wcmd(0x30); //基本指令操作 131 1 delay(5); 132 1 lcd_wcmd(0x0C); //显示开,关光标 133 1 delay(5); 134 1 lcd_wcmd(0x01); //清除LCD的显示内容 135 1 delay(5); 136 1 } 137 /*********************************************************/ 138 /* */ 139 /* 主程序 */ 140 /* */ 141 /*********************************************************/ 142 main() 143 { 144 1 uchar i; 145 1 delay(10); //延时 146 1 wela=0; 147 1 dula=0; 148 1 lcd_init(); //初始化LCD 149 1 150 1 lcd_pos(0,0); //设置显示位置为第一行的第1个字符 151 1 i = 0; 152 1 while(dis1[i] != '\0') 153 1 { //显示字符 154 2 lcd_wdat(dis1[i]); 155 2 i++; 156 2 } 157 1 lcd_pos(1,0); //设置显示位置为第二行的第1个字符 158 1 i = 0; 159 1 while(dis2[i] != '\0') 160 1 { 161 2 lcd_wdat(dis2[i]); //显示字符 162 2 i++; 163 2 } 164 1 lcd_pos(2,0); //设置显示位置为第三行的第1个字符 165 1 i = 0; 166 1 while(dis3[i] != '\0') 167 1 { 168 2 lcd_wdat(dis3[i]); //显示字符 169 2 i++; 170 2 } 171 1 lcd_pos(3,0); //设置显示位置为第四行的第1个字符 172 1 i = 0; 173 1 while(dis4[i] != '\0') 174 1 { 175 2 lcd_wdat(dis4[i]); //显示字符 176 2 i++; 177 2 } 178 1 while(1); C51 COMPILER V6.12 12864A_3 03/02/2007 13:44:57 PAGE 4 179 1 } 180 181 182 183 /*********************************************************/ 184 /* */ 185 /* 延时x*0.14ms子程序 */ 186 /* */ 187 /*********************************************************/ 188 189 void delay0(uchar x) //x*0.14MS 190 { 191 1 uchar i; 192 1 while(x--) 193 1 { 194 2 for (i = 0; i<13; i++) {} 195 2 } 196 1 } 197 /*********************************************************/ 198 /* */ 199 /* 设定显示位置 */ 200 /* */ 201 /*********************************************************/ 202 void lcd_pos(uchar X,uchar Y) 203 { 204 1 uchar pos; 205 1 if (X==0) 206 1 {X=0x80;} 207 1 else if (X==1) 208 1 {X=0x90;} 209 1 else if (X==2) 210 1 {X=0x88;} 211 1 else if (X==3) 212 1 {X=0x98;} 213 1 pos = X+Y ; 214 1 lcd_wcmd(pos); //显示地址 215 1 } MODULE INFORMATION: STATIC OVERLAYABLE CODE SIZE = 310 ---- CONSTANT SIZE = 55 ---- XDATA SIZE = ---- ---- PDATA SIZE = ---- ---- DATA SIZE = 6 2 IDATA SIZE = ---- ---- BIT SIZE = ---- 1 END OF MODULE INFORMATION. C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)