📄 51
字号:
C51 COMPILER V8.09 EX83 07/12/2010 14:33:01 PAGE 1
C51 COMPILER V8.09, COMPILATION OF MODULE EX83
OBJECT MODULE PLACED IN ex83.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE ex83.c BROWSE DEBUG OBJECTEXTEND
line level source
1 //用LCD显示适时检测结果
2 #include<reg52.h> //包含单片机寄存器的头文件
3 #include<stdlib.h> //包含随机函数rand()的定义文件
4 #include<intrins.h> //包含_nop_()函数定义的头文件
5 sbit RS=P2^7; //寄存器选择位,将RS位定义为P2.0引脚
6 sbit RW=P2^6; //读写选择位,将RW位定义为P2.1引脚
7 sbit E=P2^5; //使能信号位,将E位定义为P2.2引脚
8 sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚
9 unsigned char code digit[ ]={"0123456789"}; //定义字符数组显示数字
10 unsigned char code string[ ]={"Test Result"}; //定义字符数组显示提示信息
11 /*****************************************************
12 函数功能:延时1ms
13 (3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
14 ***************************************************/
15 void delay1ms()
16 {
17 1 unsigned char i,j;
18 1 for(i=0;i<10;i++)
19 1 for(j=0;j<33;j++)
20 1 ;
21 1 }
22 /*****************************************************
23 函数功能:延时若干毫秒
24 入口参数:n
25 ***************************************************/
26 void delay(unsigned char n)
27 {
28 1 unsigned char i;
29 1 for(i=0;i<n;i++)
30 1 delay1ms();
31 1 }
32 /*****************************************************
33 函数功能:判断液晶模块的忙碌状态
34 返回值:result。result=1,忙碌;result=0,不忙
35 ***************************************************/
36 unsigned char BusyTest(void)
37 {
38 1 bit result;
39 1 RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态
40 1 RW=1;
41 1 E=1; //E=1,才允许读写
42 1 _nop_(); //空操作
43 1 _nop_();
44 1 _nop_();
45 1 _nop_(); //空操作四个机器周期,给硬件反应时间
46 1 result=BF; //将忙碌标志电平赋给result
47 1 E=0; //将E恢复低电平
48 1 return result;
49 1 }
50 /*****************************************************
51 函数功能:将模式设置指令或显示地址写入液晶模块
52 入口参数:dictate
53 ***************************************************/
54 void WriteInstruction (unsigned char dictate)
55 {
C51 COMPILER V8.09 EX83 07/12/2010 14:33:01 PAGE 2
56 1 while(BusyTest()==1); //如果忙就等待
57 1 RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令
58 1 RW=0;
59 1 E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,
60 1 // 就是让E从0到1发生正跳变,所以应先置"0"
61 1 _nop_();
62 1 _nop_(); //空操作两个机器周期,给硬件反应时间
63 1 P0=dictate; //将数据送入P0口,即写入指令或地址
64 1 _nop_();
65 1 _nop_();
66 1 _nop_();
67 1 _nop_(); //空操作四个机器周期,给硬件反应时间
68 1 E=1; //E置高电平
69 1 _nop_();
70 1 _nop_();
71 1 _nop_();
72 1 _nop_(); //空操作四个机器周期,给硬件反应时间
73 1 E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
74 1 }
75 /*****************************************************
76 函数功能:指定字符显示的实际地址
77 入口参数:x
78 ***************************************************/
79 void WriteAddress(unsigned char x)
80 {
81 1 WriteInstruction(x|0x80); //显示位置的确定方法规定为"80H+地址码x"
82 1 }
83 /*****************************************************
84 函数功能:将数据(字符的标准ASCII码)写入液晶模块
85 入口参数:y(为字符常量)
86 ***************************************************/
87 void WriteData(unsigned char y)
88 {
89 1 while(BusyTest()==1);
90 1 RS=1; //RS为高电平,RW为低电平时,可以写入数据
91 1 RW=0;
92 1 E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,
93 1 // 就是让E从0到1发生正跳变,所以应先置"0"
94 1 P0=y; //将数据送入P0口,即将数据写入液晶模块
95 1 _nop_();
96 1 _nop_();
97 1 _nop_();
98 1 _nop_(); //空操作四个机器周期,给硬件反应时间
99 1 E=1; //E置高电平
100 1 _nop_();
101 1 _nop_();
102 1 _nop_();
103 1 _nop_(); //空操作四个机器周期,给硬件反应时间
104 1 E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
105 1 }
106 /*****************************************************
107 函数功能:对LCD的显示模式进行初始化设置
108 ***************************************************/
109 void LcdInitiate(void)
110 {
111 1 delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间
112 1 WriteInstruction(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口
113 1 delay(5); //延时5ms ,给硬件一点反应时间
114 1 WriteInstruction(0x38);
115 1 delay(5);
116 1 WriteInstruction(0x38); //连续三次,确保初始化成功
117 1 delay(5);
C51 COMPILER V8.09 EX83 07/12/2010 14:33:01 PAGE 3
118 1 WriteInstruction(0x0c); //显示模式设置:显示开,无光标,光标不闪烁
119 1 delay(5);
120 1 WriteInstruction(0x06); //显示模式设置:光标右移,字符不移
121 1 delay(5);
122 1 WriteInstruction(0x01); //清屏幕指令,将以前的显示内容清除
123 1 delay(5);
124 1 }
125 /*****************************************************
126 函数功能:主函数
127 ***************************************************/
128 void main(void)
129 {
130 1 unsigned char i; //定义变量i指向字符串数组元素
131 1 unsigned int x; //定义变量,储存检测结果
132 1 unsigned char D1,D2,D3,D4,D5; //分别储存采集的个位、十位、百位、千位和万位数字
133 1 LcdInitiate(); //调用LCD初始化函数
134 1 delay(10); //延时10ms,给硬件一点反应时间
135 1 WriteAddress(0x02); // 从第1行第3列开始显示
136 1 i = 0; //指向字符数组的第1个元素
137 1 while(string[i] != '\0')
138 1 {
139 2 WriteData(string[i]);
140 2 i++; //指向下字符数组一个元素
141 2 }
142 1 while(1) //无限循环
143 1 {
144 2 x=rand(); //模拟数据采集
145 2 D1=x%10; //计算个位数字
146 2 D2=(x%100)/10; //计算十位数字
147 2 D3=(x%1000)/100; //计算百位数字
148 2 D4=(x%10000)/1000; //计算千位数字
149 2 D5=x/10000; //计算万位数字
150 2 WriteAddress(0x45); // 从第2行第6列开始显示
151 2 WriteData(digit[D5]); //将万位数字的字符常量写入LCD
152 2 WriteData(digit[D4]); //将千位数字的字符常量写入LCD
153 2 WriteData(digit[D3]); //将百位数字的字符常量写入LCD
154 2 WriteData(digit[D2]); //将十位数字的字符常量写入LCD
155 2 WriteData('.'); //将小数点的字符常量写入LCD
156 2 WriteData(digit[D1]); //将个位数字的字符常量写入LCD
157 2 for(i=0;i<4;i++) //延时1s(每1s采集一次数据)
158 2 delay(250); //延时250ms
159 2 }
160 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 371 ----
CONSTANT SIZE = 23 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 5
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -