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