📄 main.lst
字号:
C51 COMPILER V7.06 MAIN 08/22/2008 21:21:40 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 //************************************************************************
2 // File : main.c
3 // Date : 2008-08-22
4 // Version : 1.3
5 // Powerd by : shenyae86 QQ:184676957
6 // modify by :
7 //*************************************************************************
8 // Descriptoon:
9 // 数码管显示程序 显示120000 采用中断扫描模式
10 // 适用于CC100B、CC100C
11 // 产品网站 http://www.sxcckj.com 传诚科技
12 // 扑通的家用时钟一般只能设置一个闹钟时间,
13 // 但很多人均需为工作日、周末、早晨、午休等
14 // 不同时段设置不同的闹钟时间。如果是使用普通的闹钟,
15 // 只好每次休息前重新设置,很不方便,
16 // 有时甚至会出现忘记更改闹钟设置而睡过头的情况。
17 // 针对这种情况,本人利用89C51单片机设计了
18 // 一款有8种闹钟设置的时钟,通过一段
19 // 时间的使用,情况良好。
20 // help:
21 // 参见实验指导书
22 //*************************************************************************
23 #include <at89x51.h>
24 #include <intrins.h>
25
26 unsigned char hour,min,sec,year,month,day,weekday; //当前时间、日期、星期
27 unsigned int count_down; //1秒钟计时用
28 unsigned char code dis_code[]={
29 0xC0,/*0*/
30 0xF9,/*1*/
31 0xA4,/*2*/
32 0xB0,/*3*/
33 0x99,/*4*/
34 0x92,/*5*/
35 0x82,/*6*/
36 0xF8,/*7*/
37 0x80,/*8*/
38 0x90,/*9*/};//0-9 off
39
40 bit led_on; //数码管是否点亮的标志
41 unsigned char display[8]; //8位数码管要显示的数据
42 unsigned char attr; //八个数码管的闪烁控制字节,当为0时,对应数码管闪
43 bit flash; //LED 闪烁开关,与attr共同决定数码管是否闪烁
44 unsigned char show_status; //LED 显示状态标志
45 // 0:设置闹钟数据
46 // 1:显示当前日期及星期
47 // 2:显示当前时间
48 // 3:设置当前日期
49 // 4:设置当前时间
50
51 bit km; //按键已去抖动标志
52 bit kp; //按键已处理标志
53
54 bit sound; //蜂鸣器响标志
55 bit alarm_stop; //蜂鸣器响后用户手工按停标志
C51 COMPILER V7.06 MAIN 08/22/2008 21:21:40 PAGE 2
56 struct {
57 unsigned char h; //小时
58 unsigned char m; //分钟
59 } alarm[8]; //8个闹钟项
60 unsigned char alarm_en; //闹钟项启用标志
61 unsigned char alarm_wk; //闹钟项周末启用标志
62 unsigned char cur_alarm_set; //当前设置的闹钟项
63 unsigned char cur_alarm_active; //当前到点的闹钟项
64 bit new_alarm_info; //闹钟项内容已修改标志
65
66 sbit sound_output = P3^7; //蜂鸣器驱动端口,输出0时蜂鸣器响
67 sbit SDA_PIN = P1^6; //EEPROM数据线端口
68 sbit SCL_PIN = P1^5; //EEPROM时钟线端口
69 ////////////////////////////////////////////////////////////////
70 void I2cDelay() //EEPROM操作时需要的延时函数
71 {
72 1 _nop_();
73 1 _nop_();
74 1 _nop_();
75 1 _nop_();
76 1 _nop_();
77 1 _nop_();
78 1 }
79 ///////////////////////////////////////////////////////////////
80 void DelayX1ms(unsigned char count) //延迟函数,参数为毫秒数
81 {
82 1 unsigned char i,j;
83 1 for(i=0;i<count;i++)
84 1 for(j=0;j<240;j++);
85 1 }
86 ///////////////////////////////////////////////////////////////
87 void Start() //I2C启动,24C08使用I2C方式
88 {
89 1 SDA_PIN=1;
90 1 I2cDelay();
91 1 SCL_PIN=1;
92 1 I2cDelay();
93 1 SDA_PIN=0;
94 1 I2cDelay();
95 1 SCL_PIN=0;
96 1 }
97 /////////////////////////////////////////////////////////////////////
98 void Stop() //I2C停止
99 { I2cDelay(); SDA_PIN=0;
100 1 I2cDelay(); SCL_PIN=1;
101 1 I2cDelay(); SDA_PIN=1;
102 1 I2cDelay();
103 1 }
104 ////////////////////////////////////////////////////////////////////
105 bit SendByte(unsigned char value) //发送1字节数据给EEPROM
106 {unsigned char i;
107 1 bit no_ack=0;
108 1
109 1 for(i=0;i<8;i++) //发送8位数据
110 1 { I2cDelay();
111 2 if(value&0x80) SDA_PIN=1;
112 2 else SDA_PIN=0;
113 2 value=value<<1;
114 2 I2cDelay(); SCL_PIN=1;
115 2 I2cDelay();
116 2 I2cDelay(); SCL_PIN=0;
117 2 }
C51 COMPILER V7.06 MAIN 08/22/2008 21:21:40 PAGE 3
118 1
119 1 I2cDelay(); SDA_PIN=1; //确认脉冲周期,等待EEPROM的确认
120 1 I2cDelay(); SCL_PIN=1;
121 1 I2cDelay();
122 1 if(SDA_PIN==1) no_ack=1;
123 1 I2cDelay(); SCL_PIN=0;
124 1
125 1 return no_ack;
126 1 }
127 /////////////////////////////////////////////////////////////////////////
128 void mywrite(unsigned char address,unsigned char value) //向EEPROM写1字节
129 {
130 1 Start();
131 1 SendByte(0xa0);
132 1 SendByte(address);
133 1 SendByte(value);
134 1 Stop();
135 1 DelayX1ms(10);
136 1 }
137 ////////////////////////////////////////////////////////////////////////
138 unsigned char ReadByte() //从EEPROM接收1字节
139 {
140 1 unsigned char i,bval;
141 1 bval=0;
142 1 for(i=0;i<8;i++) //接收8位数据
143 1 { I2cDelay();
144 2 SDA_PIN=1; //从P1输入数据时,先往P1输入"1"
145 2 I2cDelay(); SCL_PIN=1;
146 2 I2cDelay(); bval=bval<<1; if(SDA_PIN) bval=bval|0x01;
147 2 I2cDelay(); SCL_PIN=0;
148 2 }
149 1 I2cDelay(); SDA_PIN=1; //确认脉冲周期,不送出确认
150 1 I2cDelay(); SCL_PIN=1;
151 1 I2cDelay();
152 1 I2cDelay();
153 1 return(bval);
154 1 }
155 ////////////////////////////////////////////////////////////////////////
156 unsigned char myread(unsigned char address) //从EEPROM读入1字节数据
157 {
158 1 unsigned char tmp;
159 1 Start();
160 1 SendByte(0xa0);
161 1 SendByte(address);
162 1 Start();
163 1 SendByte(0xa1);
164 1 tmp=ReadByte();
165 1 Stop();
166 1 DelayX1ms(2);
167 1 return(tmp);
168 1 }
169 ////////////////////////////////////////////////////////////////////////
170 void SetNext(void) //轮换调节函数
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -