📄 lcd1.lst
字号:
C51 COMPILER V6.12 LCD1 09/10/2005 14:56:41 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE LCD1
OBJECT MODULE PLACED IN .\lcd1.OBJ
COMPILER INVOKED BY: C:\KEIL\C51\BIN\C51.EXE .\lcd1.c DEBUG OBJECTEXTEND
stmt level source
1 #include <reg51.h>
2 #include <intrins.h> //内部函数,包含_nop_()空函数指令
3 #define uchar unsigned char
4 #define uint unsigned int
5 sbit RS = P2^5; // 定义LCD模块控制引脚
6 sbit RW = P2^6;
7 sbit E = P2^7;
8 #define DataPort P0 //定义LCD模块数据端口
9 #define Busy 0x80 //忙标志,D7位为1说明忙
10 uchar Xpos; //列方向地址指针
11 uchar Ypos; //行方向地址指针
12
13 //以下是短延时函数
14 void Delay5Ms(void) {
15 1 uint i = 5552;
16 1 while(i--);
17 1 }
18 //以下是读忙状态函数
19 // 功能:在正常读写操作之前检测LCD模块的忙状态,
20 //D7 = 0:LCD控制器空闲;D7 = 1:LCD控制器忙
21 void CheckBusy( void )
22 {
23 1 DataPort = 0xff; //P1口写1
24 1 RS=0; //选择指令寄存器
25 1 RW=1; //选择读模式
26 1 _nop_();
27 1 E=1; //使能LCD
28 1 _nop_();
29 1 _nop_();
30 1 while( DataPort & Busy );//若D7=1,则DataPort&Busy=1,说明忙,等待
31 1 E=0; //若D7=0,说明不忙,令E=0
32 1 }
33 //以下是写入IR寄存器命令函数
34 //功能:向LCD模块写入命令字符CMD
35 //若 AttribC = 1 检测忙信号,若 AttribC = 0 不检测忙信号
36 void WriteIR(uchar CMD,uchar AttribC)
37 {
38 1 if (AttribC) CheckBusy();//若AttribC =1,则检测忙信号,否则,顺序执行
39 1 RS = 0; //选择指令寄存器
40 1 RW = 0; //选择写模式
41 1 _nop_();
42 1 DataPort = CMD; //将命令送数据端口
43 1 _nop_();
44 1 E = 1; //使能LCD
45 1 _nop_();
46 1 _nop_();
47 1 E = 0; //禁止LCD
48 1 }
49 //以下是写入DDR寄存器函数
50 //功能:在当前光标位置显示一个字符
51 void WriteDDR( char c )
52 {
53 1 CheckBusy(); //检测忙信号
54 1 RS = 1; //选择数据寄存器
55 1 RW = 0; //选择写模式
C51 COMPILER V6.12 LCD1 09/10/2005 14:56:41 PAGE 2
56 1 _nop_();
57 1 DataPort = c; // 将显示字符送往数据口
58 1 _nop_();
59 1 E = 1; //写使能
60 1 _nop_();
61 1 _nop_();
62 1 E = 0; //禁止LCD
63 1 }
64 //以下是光标定位函数
65 void LcdPos(uchar Xpos,uchar Ypos)
66 {
67 1 uchar tmp; //定义tmp为指令码
68 1 Xpos&=0x0f; //16xx型液晶的范围是0~15
69 1 Ypos&=0x01; //Y的范围是0~1
70 1 tmp=Xpos;
71 1 if(Ypos==1)
72 1 tmp|=0xc0; //若Ypos为1(显示第2行),地址码+0xc0
73 1 tmp|=0x80; //若Ypos为0(显示第1行),地址码+0x80
74 1 WriteIR (tmp,0);
75 1 }
76 //以下是初始化函数
77 //功能:向LCD模块写入不同命令,完成必要的初始化过程
78 void LcdReset( void )
79 {
80 1 WriteIR( 0x38, 0); //功能设置指令,8位接口,显示2行,5×7字符
81 1 WriteIR( 0x38, 1); //设置显示模式(以后均检测忙信号)
82 1 WriteIR( 0x08, 1); //显示开关控制指令,显示关闭
83 1 WriteIR( 0x01, 1); //清屏指令,将DDRAM数据全部填入"空白"
84 1 WriteIR( 0x06, 1); //输入方式设置指令,字符不动,光标自动右移一格
85 1 WriteIR( 0x0f, 1); //显示开关控制指令,显示器开,光标开,光标闪烁
86 1 }
87 //以下是在指定行列显示字符函数
88 void WriteChar(uchar Xpos,uchar Ypos,char c)
89 {
90 1 LcdPos(Xpos,Ypos);
91 1 WriteDDR(c);
92 1 }
93 //以下是主函数
94 void main(void)
95 {
96 1 LcdReset(); // LCD模块初始化
97 1 Delay5Ms(); //延是等待复位
98 1 WriteChar(0,1,'A'); //Xpos=0(第1列),Ypos=1(第2行),显示字符A
99 1 for(;;)
100 1 {;}
101 1 }
102
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 152 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 2 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -