单片机C语言程序1
单片机外部中断实验(附C语言程序)

单片机外部中断实验(附c程序)一、实验目的掌握外部中断的C语言和汇编语言编程方法,会用外部中断解决实际应用问题。
二、实验内容8051C51单片机P2.0接一个发光二极管LED1、P2.1接一个发光二极管LED2,P3.2接一个开关、P3.3接一个开关要求实现以下功能:(1)合上、P3.3断开时LED1闪烁(2)P3.2断开、P3.3合上时LED2闪烁(3)P3.2合上后(不断开)再合上P3.3,LED1闪烁LED2不闪烁(4)P3.3合上后(不断开)再合上P3.2,LED2不闪烁LED1闪烁试编写C语言和汇编语言程序使用自然优先级就可以也可 XO 高级X1低级PX0=1 PX1=0四、实验电路五、参考程序(自己完成)C程序:Include<reg52.h>Sbit P2_0=P2^0;Sbit P2_1=P2^1;Sbit P3_2=P3^2;Sbit P3_3=P3^3;void delay02s(void) //延时0.2秒子程序{unsigned char i,j,k;for(i=20;i>0;i--)for(j=20;j>0;j--)for(k=248;k>0;k--);}Void main{EA=1;EX0=1;EX1=1;ITO=1;IT1=1;PX0=1;PX1=0;While(1);}Void int0(void) interrupt 0 { if(!P3_2){While(1){P2_0=1;delay02s();P2_0=0;delay02s();}}}Void int1(void) interrupt 2 { if(!P3_3){While(1){P2_1=1;delay02s();P2_1=0;delay02s();}}}。
单片机c语言实例程序300篇

单片机c语言实例程序300篇单片机C语言【程序1】题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。
组成所有的排列后再去掉不满足条件的排列。
2.程序源代码:main(){inti,j,k;printf("\n");for(i=1;i<5;i++)/某以下为三重循环某/for(j=1;j<5;j++)for(k=1;k<5;k++){if(i!=k&&i!=j&&j!=k)/某确保i、j、k三位互不相同某/printf("%d,%d,%d\n",i,j,k);}}==============================================================【程序2】题目:企业发放的奖金根据利润提成。
利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?1.程序分析:请利用数轴来分界,定位。
注意定义时需把奖金定义成长整型。
2.程序源代码:main()单片机C语言{longinti;intbonu1,bonu2,bonu4,bonu6,bonu10,bonu;canf("%ld",&i);bonu1=100000某0.1;bonu2=bonu1+100000某0.75;bonu4=bonu2+200000某0.5;bonu6=bonu4+200000某0.3;bonu10=bonu6+400000某0.15;if(i<=100000)bonu=i某0.1;eleif(i<=200000)bonu=bonu1+(i-100000)某0.075;eleif(i<=400000)bonu=bonu2+(i-200000)某0.05;eleif(i<=600000)bonu=bonu4+(i-400000)某0.03;eleif(i<=1000000)bonu=bonu6+(i-600000)某0.015;elebonu=bonu10+(i-1000000)某0.01;printf("bonu=%d",bonu);}============================================================ ==【程序3】题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后的结果满足如下条件,即是结果。
单片机c语言程序设计

单片机c语言程序设计
单片机C语言程序设计是指使用C语言编写单片机控制程序,实现各种功能和任务。
具体步骤如下:
1. 确定程序功能:首先明确单片机的控制目标和需求,确定要实现的功能。
2. 编写主函数:使用C语言编写一个主函数,作为程序的入
口点。
在主函数中,可以定义变量、调用函数、编写主要的程序逻辑。
3. 初始化设置:在主函数中,进行单片机的初始化设置,包括引脚初始化、时钟设置、模块初始化等。
4. 编写中断服务函数:根据需要,编写中断服务函数。
在中断服务函数中,处理特定的中断事件,例如定时器中断、外部中断等。
5. 编写任务函数:根据程序的需求,编写各个任务函数。
任务函数可以是循环执行的函数,或者是根据事件触发执行的函数。
6. 实现控制逻辑:在任务函数中编写具体的控制逻辑代码,根据需要使用控制语句(如if、switch)和循环语句(如for、while)。
7. 进行调试和测试:完成编写后,进行程序的调试和测试,通过仿真器或者实际连接到单片机的硬件进行测试。
8. 优化和修改:根据测试结果进行程序的优化和修改,改善程序的性能和功能。
9. 生成可执行文件:将C源文件编译成可执行文件,可以直接下载到单片机中运行。
10. 下载和运行:将生成的可执行文件通过下载器下载到目标单片机中,并进行运行测试。
以上是单片机C程序设计的一般步骤,具体的实现方法和内容会根据不同的单片机型号和功能需求而有所不同。
第4章单片机C语言1

变量:在程序运行中其值可以改变的量。
定义一个变量,编译系统就会自动为它安排一个存贮区,具体的 地址值 ,用户不必在意。一个变量由变量名和变量值构成. 变量名:存贮单元地址的符号表示。 变量的值:变量所在地址单元存放的内容。
Microcontroller 单片机的C语言 05
数据类型:数据的长度。 无论哪种数据都是存放在存贮单元中的,每一个数据究竟要占用几 个单元,都要提供给编译系统,正如汇编语言中存放数据的单元要用DB、 DW、DD伪指令进行定义一样。
Microcontroller 单片机的C语言
10
4.3.2
在固定的存贮器地址进行变量参数传递是C51的一个标准特征,定 义了变量、参数传递区的存贮器模式,也就是默认了变量和参数传递 区存贮器类型、无需再对变量和参数传递区的存贮器类型进行说明。 存贮器模式决定了变量的默认存贮器类型、参数传递区和无明确存 贮区类型的说明。有三种存贮器模式:SMALL、LARGE 和 COMPACT。
Microcontroller 单片机的C语言
14
下面表格表示两种语言将m单元的内容送n单元的对照语句: 直接寻址
汇编语言 MOV n,m 传送语句 C 语言 n=m; 赋值语句 汇编语言 MOV R1,#m ; m的地址送R1 MOV n,@R1 ; m单片机的C语言
04
4.2 C51的数据类型
C51的数据有常量和变量之分。 常量:在程序运行中其值不变的量。 数值型常量:可以为十进制数、 十六进制数( 用0x表示)和字符 (用‘ ’ 引号括起)。 符号型常量:用符号表示常量,此符号需用宏定义指令(#define)对 其进行定义(相当于汇编的‚EQU‛伪指令)。 如:#define PI 3.1415那么程序中只要出现PI的地方,编译 程序都译为3.1415。
(完整word版)单片机C语言程序设计实训100例

《单片机C语言程序设计实训100例—基于8051+Proteus仿真》案例第 01 篇基础程序设计01 闪烁的LED/*名称:闪烁的LED说明:LED按设定的时间间隔闪烁*/#include<reg51.h〉#define uchar unsigned char#define uint unsigned intsbit LED=P1^0;//延时void DelayMS(uint x){uchar i;while(x-—){for(i=0;i〈120;i++);}}//主程序void main(){while(1){LED=~LED;DelayMS(150);}}02 从左到右的流水灯/* 名称:从左到右的流水灯说明:接在P0口的8个LED从左到右循环依次点亮,产生走马灯效果*/#include〈reg51。
h〉#include<intrins。
h>#define uchar unsigned char #define uint unsigned int//延时void DelayMS(uint x){uchar i;while(x—-){for(i=0;i〈120;i++);}}//主程序void main(){P0=0xfe;while(1){P0=_crol_(P0,1); //P0的值向左循环移动DelayMS(150);}}03 8只LED左右来回点亮/*名称:8只LED左右来回点亮说明:程序利用循环移位函数_crol_和_cror_形成来回滚动的效果*/#include<reg51.h>#include〈intrins.h>#define uchar unsigned char #define uint unsigned int//延时void DelayMS(uint x){uchar i;while(x——){for(i=0;i〈120;i++);}}//主程序void main(){uchar i;P2=0x01;while(1){for(i=0;i〈7;i++){P2=_crol_(P2,1); //P2的值向左循环移动DelayMS(150);}for(i=0;i<7;i++){P2=_cror_(P2,1); //P2的值向右循环移动DelayMS(150);}}}04 花样流水灯/* 名称:花样流水灯说明:16只LED分两组按预设的多种花样变换显示*/#include<reg51。
STC单片机C语言程序设计STC单片机C语言编程入门

STC单片机C语言程序设计STC单片机C语言编程入门STC单片机是一种广泛应用于嵌入式系统和物联网设备中的微控制器。
它具有体积小、功耗低、运算能力强等特点,被广泛应用于各种控制系统中。
本文将介绍STC单片机C语言程序设计的入门知识,以帮助初学者快速上手。
首先,我们需要了解一些基本的概念和术语。
1.单片机:单片机是一种集成电路芯片,其中包含了中央处理器、存储器、输入输出接口等功能模块。
它可以独立完成特定的任务,不需要额外的硬件设备与之配合。
2.C语言:C语言是一种高级编程语言,被广泛应用于嵌入式系统开发中。
它具有简洁、高效的特点,易于理解和学习。
了解了上述基本概念后,接下来我们将介绍一些STC单片机C语言程序设计的入门知识。
2. 程序结构:一个C语言程序通常由多个函数组成,其中一个函数名为main(。
程序从main(函数开始执行,执行完main(函数后程序结束。
3.数据类型:C语言中有多种数据类型,包括整型、浮点型、字符型等。
在使用数据类型时,需要根据需要选择合适的数据类型。
4.变量和常量:在C语言中,可以使用变量和常量来存储数据。
变量是可以改变值的,而常量是固定不变的值。
5. 输入和输出:C语言中使用标准库函数scanf(和printf(来实现输入和输出操作。
通过这两个函数可以从键盘获取输入数据,并将结果输出到屏幕上。
6. 控制语句:在C语言中,可以使用if语句、for循环和while循环等控制语句来控制程序的执行流程。
通过控制语句,可以实现条件判断、循环执行等功能。
7.函数:函数是C语言中的重要概念,它可以将一段代码封装成一个独立的模块,方便重复使用。
在编写程序时,可以自定义函数来实现特定的功能。
8.数组:数组是一种存储相同类型数据的连续内存区域。
在C语言中,可以使用数组来存储一组数据,并对数据进行操作。
9.文件操作:C语言提供了文件操作函数,可以对文件进行读写操作。
通过文件操作,可以实现数据的持久化存储。
51单片机C语言编程100例-单片机c语言编程
51单片机C语言编程100例-单片机c语言编程51单片机C语言编程100例在嵌入式系统领域,单片机是常用的硬件平台之一。
而C语言作为一种高级编程语言,能够为单片机编程提供更高的效率和便利性。
本文将介绍51单片机C语言编程的100个实例,帮助读者了解并掌握单片机的基本编程技巧和应用方法。
一、LED灯控制1. 实例介绍:通过控制51单片机的IO口输出,实现对LED灯的亮灭控制。
2. 实例代码:```#include <reg51.h>sbit LED = P1^0; // 定义P1口的第0位为LEDvoid main(){while(1){LED = 0; // LED灯亮delay(1000); //延时1秒LED = 1; // LED灯灭delay(1000); //延时1秒}}```二、数码管显示1. 实例介绍:使用数码管显示数字0-9,并实现数码管的动态显示效果。
2. 实例代码:```#include <reg51.h>unsigned char code DispTab[] ={0xC0,0XF9,0XA4,0XB0,0X99,0X92,0X82};sbit WeiDu = P1^2;sbit DUAN = P1^0;void delay(unsigned int t){unsigned int i;while(t--)for(i=0;i<125;i++);}void main(){unsigned int i;while(1){P0 = DispTab[i]; // 显示数字iDUAN = 1; //点亮段码DUAN = 0; //关闭段码P0 = ~(0x01 << i); // 选择数码管的位 WeiDu = 0; // 打开选通位WeiDu = 1; // 关闭选通位delay(100); // 延时100msi++;if(i > 9) i = 0;}}```三、外部中断1. 实例介绍:使用外部中断,当外部输入信号发生变化时,触发中断程序。
单片机c语言开关程序
单片机c语言开关程序单片机是一种集成电路,它具有微处理器、存储器和输入输出端口等功能。
在单片机中,C语言是一种常用的编程语言,可以用来开发各种程序。
本文将详细介绍如何使用C语言编写一个简单的开关程序。
开关是我们日常生活中常见的一种电子元件,它可以控制电路的通断。
在单片机中,我们可以通过编写程序来控制开关的状态。
下面是一个使用C语言编写的开关程序示例:```c#include <reg52.h> // 包含单片机的头文件sbit LED = P1^0; // 将P1.0引脚定义为LED输出口sbit SW = P3^2; // 将P3.2引脚定义为开关输入口void main(){LED = 0; // 初始状态下关闭LEDwhile(1){if(SW == 0) // 当开关按下时{LED = 1; // 打开LED}else{LED = 0; // 关闭LED}}}```上述程序使用了51单片机的C语言编程,通过将P1.0引脚定义为LED输出口,P3.2引脚定义为开关输入口,实现了一个简单的开关控制LED的功能。
在主函数中,我们首先将LED置为0,即关闭LED。
然后通过一个无限循环,不断检测开关的状态。
当开关按下时,开关引脚的电平为低电平(0),此时将LED置为1,即打开LED;当开关松开时,开关引脚的电平为高电平(1),此时将LED置为0,即关闭LED。
通过这段简单的代码,我们可以实现一个基本的开关控制LED的功能。
当按下开关时,LED会亮起;当松开开关时,LED会熄灭。
这个程序可以很好地理解开关的工作原理和单片机的输入输出控制。
当然,这只是一个简单的示例程序,实际应用中可能会更加复杂。
在实际开发中,我们可以根据需要添加更多的功能,如控制多个LED灯、设置开关的触发条件等。
通过不断学习和实践,我们可以掌握更多关于单片机C语言开发的技巧和知识,实现更多有趣和实用的功能。
通过C语言编写单片机的开关程序,我们可以实现对开关状态的监测和控制。
51单片机计数器程序c语言
下面是一个51单片机计数器的简单程序,使用C语言编写。
c
#include <reg51.h>
// 定义计数器的值
volatile unsigned int counter = 0;
// 定义外部中断0的服务函数
void INT0_Handler() interrupt 0 {
// 清除外部中断0标志位
EX0 = 0;
// 计数器值加1
counter++;
}
void main() {
// 设置外部中断0触发方式为下降沿触发
IT0 = 1;
// 使能外部中断0
EX0 = 1;
// 全局中断使能
EA = 1;
while(1) {
// 在此处添加处理计数器值的代码,例如:
// if (counter >= 100) {
// // 计数器值达到100,执行某些操作
// counter = 0; // 计数器清零
// }
}
}
此代码实现了51单片机的外部中断0的计数器功能。
当INT0引脚检测到下降沿时,会触发外部中断0,并执行INT0_Handler()函数,使counter值加1。
在main()函数中,可以添加处理counter值的代码。
例如,当counter值达到某个阈值时,可以执行特定的操作。
注意,这只是一个基础的示例,具体的代码可能会因具体硬件和应用需求而略有不同。
单片机 一阶滤波器 c语言程序
单片机一阶滤波器 c语言程序下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。
文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you! In addition, this shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!单片机一阶滤波器C语言程序概述在嵌入式系统中,滤波器是一种常见的信号处理器件,用于去除信号中的噪声或者其他干扰。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
0.5秒自加一,并输出;#include <reg51.h>#include <absacc.h>sbit LED_BIT =P1^6;void day1s(void){int x,y;for(x=0;x<=130;x++)for(y=0;y<=1000;y++); }void main(){while(1){int i=1,sum=0;LED_BIT =0;for(i=0;i<255;){sum=sum+i;i++;day1s();P0=sum;}}}可调速的单灯左移:#include "reg51.h"#include "absacc.h"#define zuoyi(x,y) x=x<<y int delay(int a){int b;for(;a>0;a--)for(b=1000;b>0;b--); }sbit LED_BIT = P1^6; void main(){int t=55,q=1;LED_BIT = 0;P0=0x00;while(1){if(P0){zuoyi(P0,q);delay(t);}elseP0=0x01;}}累加灯位左移:#include "reg51.h"#include "absacc.h"#define zuoyi(x) x=x<<1 void delay(){int a,b;for(a=65;a>0;a--)for(b=1000;b>0;b--);}sbit LED_BIT = P1^6;void main(){int i=0;LED_BIT = 0;P0=0x0;while(1){if(P0){zuoyi(P0);delay();i++;}else if(P0==0x0&&i==0){P0=0X1;delay();}else if(i==8){P0=0X3;delay();}else if(i==16){P0=0X7;delay();}else if(i==24){P0=0XF;delay();}else if(i==32){P0=0X1F;delay();}else if(i==40){P0=0X3F;delay();}else if(i==48){P0=0X7F;delay();}else if(i==56){P0=0XFF;delay();}else if(i==64){P0=0X0;i=0;}}}中断服务程序#include "reg51.h"#include "absacc.h"sbit BUZ_KEY=P3^3;sbit BUZ_BIT=P1^2;void delay10ms(){unsigned i,j;for(i=128;i>0;i--)for(j=10;j>0;j--);}void int1_srv(void) interrupt 1{unsigned i=0x0;delay10ms();if(BUZ_KEY==0){ while(BUZ_KEY==0);i=i^(1<<2);P1=i;}}void main(){EX1=1;ET1=1;EA=1;BUZ_BIT=0;while(1);}中断服务程序2#include "reg51.h"#include "absacc.h"sbit LED_BIT =P3^3;unsigned int x=1;unsigned int q=1000;void delay10ms(unsigned q){unsigned i,j;while(q--){for(i=128;i>0;i--)for(j=1;j>0;j--);}}void delay(){unsigned i,j;for(i=128;i>0;i--)for(j=10;j>0;j--);}void int1_srv(void) interrupt 2{delay();if(LED_BIT==0){ while(LED_BIT==0);x++;if(x<=3){q=q/10;}else if(x>3&&x<=5){q=q*10;}else{x=2;q=q/10;}}}void main(){EX1=1;ET1=1;EA=1;P2=0X00;while(1){if(P2){ P2=P2<<1;delay10ms(q);}else{P2=0x01;delay10ms(q);}}}测试数码数码管#include "reg51.h"#include "absacc.h"#define zuoyi(x) x=x<<1sbit temp1=P2^0;sbit temp2=P2^1;sbit temp3=P2^2;sbit temp4=P2^3;void delay500ms(){unsigned int i,j;for(i=131;i>0;i--)for(j=1000;j>0;j--);}void main(){temp1=1;temp2=0;temp3=0;temp4=0;P1=0X00;while(1){while(temp1==1&&temp2==0&&temp3==0&&temp4==0) {if(P1==0){P1=0X01;delay500ms();}zuoyi(P1);delay500ms();if(P1==0){break;}}temp1=0;temp2=1;temp3=0;temp4=0;while(temp1==0&&temp2==1&&temp3==0&&temp4==0) {if(P1==0){P1=0X01;delay500ms(); }zuoyi(P1);delay500ms();if(P1==0){break;}}temp1=0;temp2=0;temp3=1;temp4=0;while(temp1==0&&temp2==0&&temp3==1&&temp4==0) {if(P1==0){P1=0X01;delay500ms();}zuoyi(P1);delay500ms();if(P1==0){break;}}temp1=0;temp2=0;temp3=0;temp4=1;while(temp1==0&&temp2==0&&temp3==0&&temp4==1) {if(P1==0){P1=0X01;delay500ms();}zuoyi(P1);delay500ms();if(P1==0){break;}}temp1=1;temp2=0;temp3=0;temp4=0;P1=0X00;}}定时器0#include "reg51.h"#include "absacc.h"void main(){unsigned char shuzi[]={0xc0,//1100 0000 ,00xf9,//1111 1001 ,10xa4,//1010 0100 ,20xb0,//1011 0000 ,30x99,//1001 1001 ,40x92,//1001 0010 ,50x82,//1000 0010 ,60xf8,//1111 1000 ,70x80,//1000 0000 ,80x90,//1001 0000 ,9} ;unsigned int cnt=0,i=0;TMOD =0X01; //16位定时器模式TH0 =(65535 - 10000)>>8; //取初值高八位TL0 =(65535 - 10000) &0XFF;//取初值第八位TR0 =1;//启动定时器0while(1){P2 =0x0F;for(cnt=0;cnt<100;cnt++){while(TF0 == 0);TF0 = 0;TH0 =(65535 - 10000)>>8; //取初值高八位TL0 =(65535 - 10000) &0XFF;//取初值第八TR0 =1;}}}#include "reg51.h"#include "absacc.h"unsigned int cnt=0;void jishi_srv(void) interrupt 1{TH0 = (65535 - 10000)>>8; //取初值高八位TL0 = (65535 - 10000) &0XFF;//取初值第八位cnt++;if(cnt>100){cnt = 0;P1 =P1<<1;P2 =P2<<1;if(P1==0){P1=0x01;}if(P2==0X10){P2 =0X01;}}}void main(){P1 = 0X01;P2 = 0X01;TMOD =0X01; //16位定时器模式TH0 = (65535 - 10000)>>8; //取初值高八位TL0 = (65535 - 10000) &0XFF;//取初值第八位ET0 =1;EA =1;TR0 = 1;while(1);}#include "reg51.h"#include "absacc.h"unsigned int speed=10;unsigned int dir = 0;unsigned int cnt = 0;sbit TEMP_BIT= P3^2;void delay10ms(void){ unsigned i,j;for(i=128;i>0;i--)for(j=10;j>0;j--);}void zhong_srv(void) interrupt 0{delay10ms();if(TEMP_BIT== 0){ while(TEMP_BIT== 0);dir++;if(dir<=10){speed--;}else if(dir>10&&dir<=20){speed++;}if(dir>20){dir =0;}}}void jishi_srv(void) interrupt 1{TH0 = (65535 - 10000)>>8; //取初值高八位TL0 = (65535 - 10000) &0XFF;//取初值第八位cnt++;if(cnt >= speed*10){cnt=0;P1 =P1<<1;if(P1==0){P1=0x01;}}}void main(){P1 = 0X01;TMOD =0X01; //16位定时器模式TH0 = (65535 - 10000)>>8; //取初值高八位TL0 = (65535 - 10000) &0XFF;//取初值第八位ET0 =1;EX0 = 1;EA =1;TR0 = 1;IT0 = 1;while(1);}矩阵键盘实验#include "reg51.h"#include "absacc.h"void main(void){while(1){unsigned char key_h,key_v,key_temp,key_val;P2=0X00;key_val =0;for(key_h=4;key_h<8;key_h++){P2 = (1<<key_h); //对应行拉高电平P3 |= (1<<1);P3 &= ~(1<<1);P3 &=~(1<<2);P2 |= 0X0F;key_temp =P2&0X0F;P3 |=(1<<2);if(key_temp)//有按键按下{for(key_v=0;key_v<4;key_v++){if(key_temp &(1<<key_v))//第key_v为一{key_val =(key_h -4)*4 +(key_v) +1;break;}}}if(key_val)break;}P0 =key_val;}}矩阵键盘显示程序#include "reg51.h"#include "absacc.h"unsigned int cnt=0;unsigned char key_h,key_v,key_temp,key_val,last_key_val; unsigned char msg_buf[10]={0,1,2,3,4,5,6,7,8,9}; unsigned char code shuzi[]={0xc0,//1100 0000 ,00xf9,//1111 1001 ,10xa4,//1010 0100 ,20xb0,//1011 0000 ,30x99,//1001 1001 ,40x92,//1001 0010 ,50x82,//1000 0010 ,60xf8,//1111 1000 ,70x80,//1000 0000 ,80x90,//1001 0000 ,9} ; //存储在FLASH 区中void jishi_srv(void) interrupt 1{P2=0X00;TH0 = (65535 - 4000)>>8; //取初值高八位TL0 = (65535 - 4000) &0XFF;//取初值第八位P1=P1^0X03;if(P1==0X01){P1|=(1<<7);P0 =shuzi[msg_buf[0]] ;P1&=~(1<<7);}else{P1|=(1<<7);P0 =shuzi[msg_buf[1]] ;P1&=~(1<<7);}key_val =0;for(key_h=4;key_h<8;key_h++){P2 = (1<<key_h); //对应行拉高电平P3 |= (1<<1);P3 &= ~(1<<1);P3 &=~(1<<2);P2 |= 0X0F;key_temp =P2&0X0F;P3 |=(1<<2);if(key_temp)//有按键按下{for(key_v=0;key_v<4;key_v++){if(key_temp &(1<<key_v))//第key_v为一{key_val =(key_h -4)*4 +(key_v) +1;break;}}}if(key_val)break;}if(last_key_val!=key_val){last_key_val = key_val;}else{if(last_key_val){msg_buf[0] = key_val %10;msg_buf[1] = (key_val /10)%10;}}}void main(){P1 = 0X01;TMOD =0X01; //16位定时器模式TH0 = (65535 - 4000)>>8; //取初值高八位TL0 = (65535 - 4000) &0XFF;//取初值第八位ET0 =1;EA =1;TR0 = 1;P1 =0x01;while(1);}。