📄 8155.lst
字号:
C51 COMPILER V7.06 8155 06/01/2007 16:17:16 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE 8155
OBJECT MODULE PLACED IN .\8155.obj
COMPILER INVOKED BY: f:\Keil\C51\BIN\C51.EXE ..\..\我的课程设计\《单片机技术》课程设计\课程设计\8155.c BROWSE DEBUG OBJE
-CTEXTEND PRINT(.\8155.lst) OBJECT(.\8155.obj)
stmt level source
1 /*----------------设计者:吴海林*-------------------------------/
2 /*程序功能说明:本程序是用89S52和8155设计的电子钟*/
3 /*硬件功能说明:本设计是用8155的PA口作为数码管显示的段控,PC口作为数码管显示的位控,
4 PB口用于按键控制,其中PB的第0口用于控制电子钟的开始和停止,当按一下电子钟开始
5 开作,再按一下就停止工作,等待调时,再按一下就又开始工作.第1口用于调秒,按一下秒
6 就加1 ,第2口用于调分,当按一下分就加1,第3口用于调时,当按一下,分就加1.*/
7
8
9 #include "absacc.h"
10 #include "reg51.h" //调用库函数;
11 #define PA XBYTE[0xfdf9]
12 #define PB XBYTE[0xfdfa]
13 #define PC XBYTE[0xfdfb]
14 #define COM XBYTE[0xfdf8] //预定义PA,PB,PC,以及命令字的口地址;
15 typedef unsigned char uchar;
16 uchar code tab[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xf3}; //在ROM中定义数字转换码;
17 uchar data b[6]={0,0,0,0,0,10};
18 uchar data i=0;
19 void disp(uchar idata *p); //显示函数;
20 void deltime(uchar s); //延时函数;
21 void diskey(void); //键扫描函数;
22 void chap1(void); //开始/停止键单独扫描函数;
23 void add(void); //定时器0中断函数;
24 void sss(void); //电子钟运行时,秒,分,时加1函数;
25 void add1(void); //调时时,秒加1函数;
26 void add2(void); //调时时,分加1函数;
27 void add3(void); //调时时,时加1函数;
28 void start(void);
29 /*定时器初始化设置以及调用显示P.和键扫程序*/
30 void main(void)
31 {
32 1 TMOD=0x01;
33 1 TH0=0x3c;
34 1 TL0=0xb0;
35 1 TR0=1;
36 1 EA=1;
37 1 ET0=1;
38 1 disp(b);
39 1 diskey();
40 1 }
41 /*显示程序,数码管从左边第一位开始逐位向右移动显示*/
42 void disp(uchar idata *p)
43 { uchar data sel,i;
44 1 COM=0x0d; //8155口命令字设置,PA口,PC口为输出,PB口为输入;
45 1 sel=0x01;
46 1 for(i=0;i<6;i++)
47 1 {if(i==2||i==4){PA=(tab[*p]|0x80);PC=~sel;} //当数码管显示第3、5位时,数码管会显示点;
48 2 else {PA=tab[*p];PC=~sel;}
49 2 deltime(1);
50 2 PC=0xff;
51 2 p++;
52 2 sel=sel<<1;}
53 1 }
54 /*延时程序,使数码管每次点亮的时间足够长*/
C51 COMPILER V7.06 8155 06/01/2007 16:17:16 PAGE 2
55 void deltime(uchar s)
56 {
57 1 uchar data j;
58 1 while(s--)
59 1 {for(j=0;j<=125;j++);}
60 1 }
61 /*对开始/停止键单独扫描,当按下时即跳出此函数*/
62 void chap1(void)
63 {
64 1 for(;;)
65 1 {
66 2
67 2 while((PB&0x01)==1) //当开始/停止键按下时,跳出while循环;
68 2 {disp(b);}
69 2 disp(b);
70 2 disp(b);
71 2 if((PB&0x01)==0)break;}
72 1
73 1 for(;;)
74 1 { while((PB&0x01)==0) //当开始/停止键释放时,跳出while循环;
75 2 {disp(b);}
76 2 disp(b);
77 2 disp(b);
78 2 if((PB&0x01)==1)break;
79 2 }
80 1 }
81 /*----------------键扫描程序--------------------------*/
82 void diskey(void)
83 { uchar data n,m=23;
84 1 chap1(); //等待开始/停止健按下;
85 1 b[5]=0;
86 1 Loop: TR0=1; //开始计时;
87 1
88 1 chap1(); //等待开始/停止键按下;
89 1
90 1 TR0=0; //停止计时,进入调时程序;
91 1 for(;;)
92 1 {
93 2 while(1)
94 2 {while((PB&0x0f)==0x0f){disp(b);}//当查询有键按下时跳出for循环;
95 3 disp(b);disp(b);
96 3 if((PB&0x0f)!=0x0f)break;}
97 2 /*检查是哪个键按下*/
98 2 if((PB&0x02)==0)n=1; //当调秒键按下时,n=1;
99 2 if((PB&0x04)==0)n=2; //当调分键按下时,n=2;
100 2 if((PB&0x08)==0)n=3; //当调时键按下时,n=3;
101 2 if((PB&0x01)==0){start(); goto Loop;} //开始/停止键按下时,n=4;
102 2
103 2 while(m--)disp(b);
104 2 m=23;
105 2 if((PB&0x0f)!=0x0f)
106 2 {if(n==1)add1(); //当n=1时,调用秒加1函数;
107 3 if(n==2)add2(); //当n=2时,调用分加1函数;
108 3 if(n==3)add3(); //当n=3时,调用时加1函数;
109 3 }
110 2 }}
111
112 void start(void)
113 {while(1)
114 1 {while((PB&0x0f)!=0x0f)disp(b);//等待键释放,当释放后,跳出循环;
115 2 disp(b);disp(b);
116 2 if((PB&0x0f)==0x0f)break;
C51 COMPILER V7.06 8155 06/01/2007 16:17:16 PAGE 3
117 2 }
118 1 }
119 /*--------------------秒加1程序-------------------------*/
120 void add1(void)
121 {b[0]++;
122 1 if(b[0]==10){ b[0]=0;b[1]++;}
123 1 if(b[1]==6)b[1]=0;
124 1 }
125 /*-------------------分加1程序-------------------------*/
126 void add2(void)
127 { b[2]++;
128 1 if(b[2]==10){ b[2]=0;b[3]++;}
129 1 if(b[3]==6) b[3]=0; }
130 /*-------------------时加1程序-------------------------*/
131 void add3(void)
132 { b[4]++;
133 1 if(b[4]==10){b[4]=0;b[5]++;}
134 1 if(b[5]==2&&b[4]==4){b[4]=0;b[5]=0;}
135 1 }
136 /*-------------定时器0中断函数,当i加到10时,秒就加1-------------------*/
137 void add(void) interrupt 1 using 1
138 { TH0=0x3c;
139 1 TL0=0xb0;
140 1 i++;
141 1 if(i==10) //当i=10时,跳到sss()函数;
142 1 {i=0;
143 2 sss();}
144 1 }
145 /*-------------秒,分,时加1程序----------------------*/
146 void sss(void)
147 { b[0]++;
148 1 if(b[0]==10){b[0]=0;b[1]++;} //当秒的个位加到10时,秒的十位加1,个位清0;
149 1 if(b[1]==6){b[1]=0;b[2]++;} //当秒的十位到10时,分的个位加1,秒的十位清0;
150 1 if(b[2]==10){b[2]=0;b[3]++;}
151 1 if(b[3]==6){b[3]=0;b[4]++;}
152 1 if(b[4]==10){b[4]=0;b[5]++;}
153 1 if(b[5]==2&&b[4]==4){b[5]=0;b[4]=0;}
154 1
155 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 556 ----
CONSTANT SIZE = 11 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 7 5
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 + -