📄 lcd_clock.lst
字号:
C51 COMPILER V8.02 LCD_CLOCK 11/02/2008 21:54:01 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE LCD_CLOCK
OBJECT MODULE PLACED IN LCD_CLOCK.OBJ
COMPILER INVOKED BY: D:\Program Files\keil C\C51\BIN\C51.EXE LCD_CLOCK.C BROWSE DEBUG OBJECTEXTEND
line level source
1 //=============================================
2 // 基于1602液晶显示可调时钟 //
3 //作者:万迅 2008年11月02日 //
4 //QQ:373179882 //
5 //E-mail:wanxunpcmo@163.com //
6 //使用AT89C51单片机 12MHz晶振 精确到毫秒 //
7 //=============================================
8 //库与数据缩写定义
9 #include <AT89X51.h> //包含AT89X51库
10 #define uc unsigned char //定义数据格式缩写
11 #define ui unsigned int //定义数据整形缩写
12 #define control_number 2 //定义可供调节的数据数
13 //=============================================
14 //与1602液晶显示模块(LCM)的接口定义
15 #define DB_BUS P2 //定义数据总线
16 sbit RS=P3^0; //定义:数据(1)/指令(0)使能引脚
17 sbit RW=P3^1; //定义:读(1)/写(0)使能信号
18 sbit E=P3^2; //定义执行操作使能信号,下降沿有效
19 sbit busy=DB_BUS^7; //定义忙信号
20 //=============================================
21 //定义按键接口
22 sbit FUN_KEY=P1^0; //定义功能键
23 sbit INC_KEY=P1^1; //定义增加键
24 sbit DEC_KEY=P1^2; //定义减少键
25 //=============================================
26 //定义相关数据
27 uc hou,min,sec,mil; //定义:小时(hou),分钟(min),秒(sec),毫秒(mil)
28 uc connum; //定义数据可调允许位,为0时不可调
29 bit k0,k1,k2; //定义按键状态位,防止因长按按键引起多次操作
30 //=============================================
31 //函数预定义
32 void writcode(uc cd); //写指令函数
33 void writdata(uc dat); //写数据函数
34 //=============================================
35
36 //液晶显示模块(LCM)初始化
37 void init_lcm()
38 { writcode(0x38); //设置功能:8位通信;两行显示;5x7显示单元
39 1 writcode(0x38); //重写一次防止因1602通电时的假就绪而引起的功能设置失败
40 1 writcode(0x08); //关闭显示屏
41 1 writcode(0x01); //清屏
42 1 writcode(0x0c); //开显示屏并置光标不可见,光标所在字符不闪烁
43 1 writcode(0x06); //设置输入模式
44 1 }
45 //单片机基本初始化
46 void uart_init() //定义初始化定时函数
47 { hou=min=sec=mil=0; //时,分,秒初始化
48 1 connum=0; //置数据可调允许位为0,即数据不可调节
49 1 k0=k1=k2=1; //按键状态初始化
50 1 TMOD=0x01; //定时计数工作方式1
51 1 IE=0x82; //允许定时计数中断0
52 1 TH0=0xd8; //
53 1 TL0=0xf0; //定时10ms
54 1 TR0=1; //开启定时计数器0
55 1 }
C51 COMPILER V8.02 LCD_CLOCK 11/02/2008 21:54:01 PAGE 2
56 //每10ms中断一次的定时中断
57 //实现毫秒100进1,秒60进1,分钟60进1,小时24清零时钟功能
58 void timer0() interrupt 1 using 2
59 { TH0=0xd8; //
60 1 TL0=0xf0; //定时10ms
61 1 if(mil>=99)
62 1 { mil=0;
63 2 if(sec>=59)
64 2 { sec=0;
65 3 if(min>=59)
66 3 { min=0;
67 4 hou=hou>=23?0:++hou;
68 4 }
69 3 else ++min;
70 3 }
71 2 else ++sec;
72 2 }
73 1 else ++mil;
74 1 }
75 //等待空闲函数
76 //检查忙状态,等待空闲
77 void chkbusy()
78 { RS=0; //定义数据类型为指令
79 1 E=1; //置E为1
80 1 RW=1; //RW为“1”,使能信号E为“1”表示从总线读数据
81 1 DB_BUS=0xff; //置数据总线为0xff以便正确读出忙信号
82 1 while(!busy); //等待直到不忙为止
83 1 }
84
85 void writcode(uc cd)
86 { chkbusy(); //等待空闲
87 1 RW=0; //数据操作为写
88 1 RS=0; //数据类型为指令
89 1 E=1;
90 1 DB_BUS=cd; //将指令写到数据总线端口
91 1 E=0; //E产生下跳沿将总线上的数据写入1602
92 1 }
93
94 void writdata(uc dat)
95 { chkbusy(); //等待空闲
96 1 RW=0; //数据操作为写
97 1 E=1;
98 1 RS=1; //数据类型为数据
99 1 DB_BUS=dat; //将数据写到数据总线端口
100 1 E=0; //E产生下跳沿将总线上的数据写入1602
101 1 }
102 //屏幕显示函数
103 //注:指定DDRAM地址后每写一次数据DDRAM地址自动加一
104 void display()
105 { writcode(0x80); //置DD RAM地址为0x00(0x80-0x80=0x00)
106 1 switch(connum) //屏幕显示的数据与DD RAM地数据相对应,初始时0x00对应屏幕上的第一行第一个字符
107 1 { case 1:writdata('h');break; //数据可调允许位为1,即允许调节小时则写第一行第一个字符为‘h’
108 2 case 2:writdata('m');break; //数据可调允许位为2,即允许调节分钟则写第一行第一个字符为‘m’
109 2 default:writdata(' '); //数据不可调则清空第一行第一个字符
110 2 }
111 1 writdata(' '); //空出一格
112 1 writdata(hou/10+48); //取小时的十位并将其加48转换成其ASCII后写数据到DDRAM
113 1 writdata(hou%10+48); //取小时的个位并将其加48转换成其ASCII后写数据到DDRAM
114 1 writdata(':'); //编译器会自动将‘:’转换为ASCII码
115 1 writdata(min/10+48); //以下同理
116 1 writdata(min%10+48);
117 1 writdata(':');
C51 COMPILER V8.02 LCD_CLOCK 11/02/2008 21:54:01 PAGE 3
118 1 writdata(sec/10+48);
119 1 writdata(sec%10+48);
120 1 writdata('-');;
121 1 writdata(mil/10+48);
122 1 writdata(mil%10+48);
123 1 writdata(' ');
124 1 hou>12?writdata('P'):writdata('A'); //小时大于12则显示‘P’小于则显示‘A’
125 1 writdata('M');
126 1 }
127 //按键检测函数
128 //
129 void chkkey()
130 { if(k0==1&&FUN_KEY==0) //与标志位结合起来可判断按键的下跳沿
131 1 { k0=0; //按键按下将标志位清零表示按键处于按下状态
132 2 connum=connum>=control_number? 0:++connum; //改变数据可调允许位的值
133 2 }
134 1 if(k1==1&&INC_KEY==0)
135 1 { k1=0;
136 2 if(connum==1)hou=hou>=23?0:++hou; //按下加键根据数据可调允许位的值对数据进行操作
137 2 if(connum==2)min=min>=59?0:++min;
138 2 }
139 1 if(k2==1&&DEC_KEY==0)
140 1 { k2=0;
141 2 if(connum==1)hou=hou==0?23:--hou; //按下减键根据数据可调允许位的值对数据进行操作
142 2 if(connum==2)min=min==0?59:--min;
143 2 }
144 1 k0=FUN_KEY?1:0; //一下操作使按键状态与标志位处以同一状态
145 1 k1=INC_KEY?1:0;
146 1 k2=DEC_KEY?1:0;
147 1 }
148
149 void main(void)
150 { uart_init(); //对单片机进行基本初始化
151 1 init_lcm(); //初始化1602液晶显示模块
152 1 while(1)
153 1 { display(); //屏幕显示
154 2 chkkey(); //按键检
155 2 }
156 1
157 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 492 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 5 ----
IDATA SIZE = ---- ----
BIT SIZE = 3 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -