📄 interrupt.lst
字号:
C51 COMPILER V7.06 INTERRUPT 05/14/2006 20:23:21 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE INTERRUPT
OBJECT MODULE PLACED IN interrupt.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE interrupt.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 //****************************************************
2 //实现功能:把键盘的输入码型在七段数码管上显示出来
3 //目标板:
4 //****************************************************
5 #include <reg51.h>
6 //*****************宏定义*****************************
7 #define p_key P1//宏定义键盘接口是P1
8 #define extint_num 2//int1
9 #define reg_group 0//中断使用的是第0组寄存器
10 #define led_date P0//定义数码管的数据输出是P0
11 #define choose_p P2//定义数码管的位选信号输出是P2
12 //*****************全局变量***************************
13 unsigned int display_num;//数码管要显示的数据,定义为全局变量
14 unsigned char key_int=0;//中断键盘子程序扫描到的键值
15 //******************定义子函数************************
16 unsigned char change(unsigned char i);//数码管显示码转换子程序
17 void display(unsigned int num);//数码管显示子程序
18 void delay_time(int i);//时间延时子程序
19 unsigned char read_key(void);//键盘读键值子程序
20 void extint_init(unsigned char int_num,unsigned char mode);//外部中断初始化子程序
21
22 //*********************主函数*************************
23 //描 述:把键盘输入的键盘码,用led显示出来
24 //入口参数:无
25 //返回参数:无
26 //设计人:ycj
27 //最后修改:时间(2006.5.1)修改人(ycj)
28 //****************************************************
29 int main(void)
30 {
31 1 extint_init(1,0);//外部中断1,方式0
32 1 EA=1; //开中断
33 1 while(1)
34 1 {
35 2 display((unsigned int)key_int); //显示
36 2 }
37 1 }
38 //**************************外部中断初始化函数*************************
39 //描 述:对外部中断初始化
40 //入口参数:unsigned char int_num(外部中断口,0=外部中断0,1=外部中断1)
41 // ,unsigned char mode(中断触发方式,0=低电平触发,1=边沿触发)
42 //返回参数:无
43 //设计人:ycj
44 //最后修改:时间(2006.5.1)修改人(ycj)
45 //*********************************************************************
46 void extint_init(unsigned char int_num,unsigned char mode)
47 {
48 1 if (int_num==0)
49 1 {
50 2 TCON&=~3;//清int0的IE0,IT0
51 2 TCON|=mode;//设定中断触发的模式
52 2 EX0=1;
53 2 }
54 1 else if (int_num==1)
55 1 {
C51 COMPILER V7.06 INTERRUPT 05/14/2006 20:23:21 PAGE 2
56 2 TCON&=~12;//清int1的IE1,IT1
57 2 TCON|=(mode<<3);//设定中断触发的模式
58 2 EX1=1;
59 2 }
60 1 }
61
62
63 //******************时间延迟函数**********************
64 //描 述:用指令实现延时一段时间
65 //入口参数:int i,为时间延迟参数
66 //出口参数:无
67 //设计人:ycj
68 //最后修改:时间(2006.5.1) 修改人(ycj)
69 //****************************************************
70 void delay_time(int i)
71 {
72 1 while(i)
73 1 i--;
74 1 }
75
76 //******************按键扫描函数**********************
77 //描 述:对4*4键盘进行扫描,程序只适合4*4键盘使用,
78 // 键盘占用一组完整的i/o口,在使用这个程序前
79 // 要宏定义p_key为用户实际连接键盘的i/o口
80 // #define p_key Pn;//(n=0、1、2、3)
81 //入口参数:无
82 //返回参数:若有检测到按键就返回按键的编号,否则返回0xff
83 //设计人:ycj
84 //最后修改:时间(2006.5.1)修改人(ycj)
85 //****************************************************
86 unsigned char read_key(void)
87 {
88 1 unsigned char j,key,key_buf=0;
89 1 p_key=0xff;
90 1 //检测是否有建按下//
91 1 p_key=0xf0;
92 1 key=p_key;
93 1 if(key==0xf0)
94 1 {
95 2 return(0xff);//没按键按下,返回0xff
96 2 }
97 1 //有按下,延时去抖//
98 1 delay_time(5000);
99 1 //确认是否有建按下//
100 1 p_key=0xf0;
101 1 key=p_key;
102 1 if(key==0xf0)
103 1 {
104 2 return(0xff);//没按键按下,返回0xff
105 2 }
106 1 //真的有按键按下,扫描是哪一行有按键按下//
107 1 for(j=0;j<4;j++)
108 1 {key=p_key&(0x10<<j);
109 2 if (key)
110 2 {
111 3 key=p_key;
112 3 }
113 2 else
114 2 {
115 3 key_buf=j*4;
116 3 p_key=~(0x10<<j);//第j行的按键按下了,第j行输出0,其他的i/o口输出1
117 3 //扫描是第j行的哪个按键按下//
C51 COMPILER V7.06 INTERRUPT 05/14/2006 20:23:21 PAGE 3
118 3 for(j=0;j<4;j++)
119 3 {
120 4 key=p_key&(1<<j);
121 4 if (key)
122 4 {
123 5 key=p_key;
124 5 }
125 4 else
126 4 {
127 5 key_buf+=j;
128 5 return(key_buf);//扫描到按键的确定位置,返回按键的编号
129 5 }
130 4 }
131 3 }
132 2 }
133 1 //没扫描到按键,//
134 1 return(0xff);
135 1 }
136 //***************七段数码管显示函数*******************
137 //描 述:对四位的扫描型七段数码管进行扫描显示,在使用
138 // 前要定义一个全局变量display_num
139 // unsigned int display_num;
140 //入口参数:unsigned int num,要显示的数字(0-9999)
141 //返回参数:无
142 //设计人:ycj
143 //最后修改:时间(2006.5.1)修改人(ycj)
144 //****************************************************
145 void display(unsigned int num)
146 {
147 1 if(num<10000)
148 1 {
149 2 display_num=num;
150 2 }
151 1 choose_p|=3;//先关显示
152 1 led_date=change(display_num/1000);//得到千位的数字,并转换成七段码型
153 1 choose_p&=0xfe;//选通千位
154 1 delay_time(50);//延时一段时间
155 1 choose_p|=1;//关显示
156 1 display_num=display_num%1000;
157 1 led_date=change(display_num/100);//得到百位的数字,并转换成七段码型
158 1 choose_p&=0xfd;//选通百位
159 1 delay_time(50);//延时一段时间
160 1 choose_p|=2;//关显示
161 1 display_num=display_num%100;
162 1 led_date=change(display_num/10);//得到十位的数字,并转换成七段码型
163 1 choose_p&=0xfb;//选通十位
164 1 delay_time(50);//延时一段时间
165 1 choose_p|=4;//关显示
166 1 led_date=change(display_num%10);//得到个位的数字,并转换成七段码型
167 1 choose_p&=0xf7;//选通十位
168 1 delay_time(50);//延时一段时间
169 1 choose_p|=8;//关显示
170 1 }
171 //****************数字-码型转换函数*******************
172 //描 述:把数字转换成七段码型,此程序仅配合共阳的七
173 // 段数码管使用
174 //入口参数:unsigned char i,要转换的数字(0-9),
175 //返回参数:转换后的七段码型,0xff表示转换失败
176 //设计人:ycj
177 //最后修改:时间(2006.5.1)修改人(ycj)
178 //****************************************************
179
C51 COMPILER V7.06 INTERRUPT 05/14/2006 20:23:21 PAGE 4
180 unsigned char change(unsigned char i)
181 {
182 1 switch(i)
183 1 {
184 2 case 0:
185 2 return(0xc0);//0的七段码型
186 2 case 1:
187 2 return(0xf9);//1的七段码型
188 2 case 2:
189 2 return(0xa4);//2的七段码型
190 2 case 3:
191 2 return(0xb0);//3的七段码型
192 2 case 4:
193 2 return(0x99);//4的七段码型
194 2 case 5:
195 2 return(0x92);//5的七段码型
196 2 case 6:
197 2 return(0x82);//6的七段码型
198 2 case 7:
199 2 return(0xf8);//7的七段码型
200 2 case 8:
201 2 return(0x80);//8的七段码型
202 2 case 9:
203 2 return(0x90);//9的七段码型
204 2 default:
205 2 return(0xff);//转换失败
206 2 }
207 1 }
208 //****************外部中断1处理函数*******************
209 //描 述:外部中断1处理子程序
210 //入口参数:无
211 //返回参数:无
212 //注意:无
213 //设计人:ycj
214 //最后修改:时间(2006.5.1)修改人(ycj)
215 //****************************************************
216 void int1_isr() interrupt extint_num using reg_group
217 {unsigned char i;
218 1 i=read_key();
219 1 if(i<16)
220 1 key_int=i;
221 1 //等待中断0的输入脚恢复到高电平
222 1 while(1)
223 1 if (P3&8)
224 1 break;
225 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 413 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 3 ----
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 + -