按键控制数码管加减程序

合集下载

51单片机:中断实现按键按一下数码管从00加到99循环(C语言)

51单片机:中断实现按键按一下数码管从00加到99循环(C语言)

51单⽚机:中断实现按键按⼀下数码管从00加到99循环(C语⾔)51单⽚机:中断实现按键按⼀下数码管从00加到99循环(C语⾔)
题⽬要求:
在51单⽚机上通过C语⾔编写代码,使⽤中断,按键按⼀下数码管上⾯的数字从00开始加1,实现00——99的循环
准备⼯作:
keil建⽴⼯程
proteus仿真验证
代码如下:
/*
*功能:⽤中断实现开关每按⼀次,数码管数字加⼀,
*实现00-99的循环
*/
#include<reg52.h>
sbit SEG1 = P1^0;//定义显⽰⼗位数码管
sbit SEG2 = P2^0;//定义显⽰个位数码管
sbit key = P3^2;//定义按键
int sum =0;
int i,j;
unsigned char code DSY_CODE[]={0xC0,0xF9,0xA4,
0xB0,0x99,0x92,
0x82,0xF8,0x80,0x90};//共阳极数码管
void main()
{
IE =0x81;//使⽤外部中断0
IT0 =1;
while(1);
}
void EX0_INT(void) interrupt 0
{
sum++;
i = sum/10;//⼗位数字
j = sum%10;//个位数字
if(sum ==100)
{
sum =0;
}
P1 = DSY_CODE[i];//数码管显⽰⼗位数字
P2 = DSY_CODE[j];//数码管显⽰个位数字
}
(写的不是很规范,仅供参考)
仿真结果:。

实验一数码管按键控制

实验一数码管按键控制

课程名称: TAJYUAN UNn'ERSII\r OF TECHNOLOGY本科实验报告智能仪器实验项目: 按键控制数码管显示实验地点:____________________专业班级:_ 学号:学生姓名: ______________________________ 指导教师: _______________ 吕青2015年10月25日实验一按键控制数码管显示一、实验目的二、实验要求本实验要求设计四个按键,从而控制数码管的显示。

四个按键的具体功能为:第一个按键为复位功能、第二个按键为移位功能、第三个按键为加1功能、第四个按键为减1功能。

三、设计方案本实验中,数码管采用Proteus内部已经封装好的四位数码管显示器,该显示器输入端口由位信号和段信号组成。

该数码管内部采用共阳极接法。

除此之外,位信号可由端口直接给,不需要增加端口的驱动能力。

段信号由P0 口提供,位信号有P2 口的低四位提供。

P0 口接段信号时,需要加上拉电阻。

四、实验设计1、整体电路图整体电路图2、单片机选型U1_MTAL1• XTAL2RSTPSENALEEA1 £y £5_ 6P1J0 P11 P12 P13 FM* P15 P1.6 P17P3.0/RXD P3.1/TXD P382/IITno P3.3/IMT1 P3.4/TO P3.S/T1P3.6WRP3J/RD_!£作13伯15_1£17ATS9051"单片机选型本次实验选择的单片机为AT89C51型号,段信号由P0 口提供,位信号有P2 口的低四位提加由展LIET rojrAK I■烦%” FEW健F3AT1 F di! FDFB* H v* *3>A E *ZiMl- iS^E Hgll U#M ・AT89C51是一种带4K字节FLASH存储器的低电压、高性能CMOS 8位微处理器,俗称单片机。

AT89C51是一种带2K字节闪存可编程可擦除只读存储器的单片机。

数码管从0开始自动加1+按键调速

数码管从0开始自动加1+按键调速

/**************************************************************河南工业大学电气工程学院测控1001刘欣如有错误欢迎致电hellohaut@共同学习共同进步***************************************************************//****************************************************************程序名称: 数字自动加1计数,数码管显示出来按键可以调节速度说明:使用本程序你必须把 SE5设置为ON(2-3)短接P11按键为停止计数按键 P10为速度减1档 P34为速度加1档P33为暂停或开始计数按键*****************************************************************//*头文件*/#include <reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned char#define ulong unsigned long int/*端口定义*/#define sled_dm_port P0 /*定义LED显示的段码数据脚*/#define sled_wm_port P2 /*定义LED显示的位码数据脚*/sbit P10 = P1^0; //p1.0脚定义为速度减1档sbit P11 = P1^1; //p1.1脚定义为停止键sbit P33 = P3^3; //p3.3脚定义为暂停及开始键sbit P34 = P3^4; //p3.4脚定义为速度加1档sbit P30 = P3^0; //系统运行状态提示/*定义数码管显示字符跟数字的对应数组关系*/uchar code mun_to_char[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};/* 0 1 2 3 4 5 6 7 8 9 a b c d e f *//*定义需要点亮的数码管*/uchar code sled_bit_table[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};uchar data sled_data[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; /*0-7号SLED 缓冲值*/uchar data led_lighten_bit=0 ; /*LED灯点亮标志位0-7*/uint system_count=0; //P30外接LED闪烁计数uint add_count = 0;ulong count=0; //数码管计数值uint speed=0; //计数速度uchar temp=0; //临时值uchar play=1; //计数开始 0暂停 1开始uchar add_bit = 0; //条件计数/*-----------------------------------------------显示部分程序,采用定时器0产生中断,1MS更新一次------------------------------------------------*/void SLED_Disp() interrupt 1 using 3{TH0 = (65536-1000)/256;TL0 = (65536-1000)/256;sled_wm_port = 0xff; /*关闭显示*/sled_dm_port = sled_data[led_lighten_bit]; /*输出段码数据到数码管*/sled_wm_port = sled_bit_table[led_lighten_bit]; /*输出位码数据到数码管*/ led_lighten_bit++;if(led_lighten_bit>=8) led_lighten_bit=0; /*8位数码管全动态输出*/system_count++;if(system_count>=500){P30=~P30;system_count = 0;}else if((system_count>=150)&&((P10==0)||(P11==0)||(P33==0)||(P34==0))){ //有按键按下快速闪烁P30 = ~P30;system_count = 0;}add_count++;if(add_count>=speed){add_count = 0;add_bit = 1;}}/*1MS为单位的延时程序*/void delay_1ms(uchar x){uchar j;while(x--){for(j=0;j<125;j++){;}}}void T0_valueSet() /*定义中断方式,中断时间*/{TMOD = 0x01; /*定时0,工作在方式1*/TH0 = (65536-1000)/256;TL0 = (65536-1000)/256;TR0 = 1; /*启动计数*/EA = 1; /*开总中断*/ET0 = 1; /*开定时器0中断*/return;}/*主程序*/void main(){uchar key_put_bit = 0; //按键按下,0为无按键按下,1为有按键按下T0_valueSet(); //打开显示while(1){//更新显示数据sled_data[0] = mun_to_char[count/10000000];sled_data[1] = mun_to_char[count%10000000/1000000];sled_data[2] = mun_to_char[count%1000000/100000];sled_data[3] = mun_to_char[count%100000/10000];sled_data[4] = mun_to_char[count%10000/1000];sled_data[5] = mun_to_char[count%1000/100];sled_data[6] = mun_to_char[count%100/10];sled_data[7] = mun_to_char[count%10];if((play==1)&&(add_bit==1)){ //计数加1count++;if(count>99999999) count=0; //计算超出范围,从0开始add_bit = 0;}if(((P10==0)||(P11==0)||(P33==0)||(P34==0))&&(key_put_bit==0)){ delay_1ms(2);key_put_bit = 1;if(P10==0){ //p1.0脚定义为速度减1档if((speed<=2000)) speed = speed+50;}else if(P11==0){ //p1.1脚定义为停止键count = 0; //计数清零play = 0; //置停止计数或暂停计数speed = 0; //速度归零}else if(P33==0){ //p3.3脚定义为暂停及开始键if(play==1){//暂停处理temp = speed;speed = 0;play = 0;}else if(play==0){//开始计数处理speed = temp;play = 1;}}else if(P34==0){ //p3.4脚定义为速度加1档if(speed>=50) speed = speed-50;}}if((P10!=0)&&(P11!=0)&&(P33!=0)&&(P34!=0)) key_put_bit = 0;} }。

51单片机数码管加减

51单片机数码管加减

实现的功能:按下key1键数字加1,按下key2键数字减1,按下key3键数字归零。

并且满足,在不松开按键时,数字会按一定时间间隔持续递增或递减。

数码管显示程序:void display(uchar shu){uchar bai,shi,ge;bai=shu/100;shi=shu/10%10;Ge=shu%10;P2=0x7f;P0=table[ge];delay(5);P2=0xbf;P0=table[shi];delay(5);P2=0xdf;P0=table[bai];delay(5);}这里是利用传送函数,在传送过程中我们传送的是一个值,这个值的百、十、个位,我们在子函数中进行分解。

再通过数组将段码、位码,传送到相应的I/O。

此外还要注意的一点是:这里是动态扫描,不能忘了原理,是一位一位的显示,只是太快了,看不出来,所以在每一个数码管亮之间一定要有10毫秒的延时!!!键盘子程序:void keyscan(){P1=0xff; // P1口赋初值,key_code=P1;//将P1口的状态赋予一个变量,便于以后的检测。

if(key_code!=0xff)//如果条件满足说明有按键被按下。

{for(i=0;i<30;i++)display(shu);//这小段子程序有两个作用:1、不断的扫描显示子程序。

这样就会避免一种现象:按键被按下时,所有的数码管会闪烁,加了这小段程序后给人的感觉是各个数码管是独立的,互不影响,它加他的,我前面几位该不变就不变。

2、还起到延时作用。

switch(key_code)//利用switch可以是程序事半功倍,又好读,应该借鉴。

{case 0xfe://注意格式的书写if(shu<255)shu++;break;//不要忘了case 0xfd:if(shu>0)shu--;break;case 0xfb:shu=0;}key_code=0xff;//这句程序得格外注意,容易丢,为下一次判断Key_code做准备。

数码管显示的按键调整

数码管显示的按键调整

班级学号姓名数码管显示的按键调整实验项目:一、实验目的:(1)掌握数码管的显示工作原理。

(2)掌握I/O口的使用。

(3)掌握数码管动态显示及程序设计方法。

二、实验内容:编程实现如下功能的倒计时秒表。

(1)数码管的初始显示为0;且当显示的数值小于10时,十位位置的数码管不显示。

(2)每按Key1(P1.0)键一次,数码管的显示值加1,并按照0→1→2→3…→20→0次序循环变化;每按Key2(P1.1)键一次,数码管显示值减1,按照20→19→18→17…→0→20次序循环变化;三、实验说明及实验电路图四、实验程序及分析#include<reg51.h>#define uchar unsigned char#define uint unsigned int#define smgdat P0 //数码管数据端sbit s1 = P2^1 ; //两位数码管控制端 s1 s2sbit s2 = P2^2 ;sbit key1 = P1^0 ; //按键端口key1 + key2 -sbit key2 = P1^1 ;uchar code tem_CA[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90} ; //共阳数码管0~9uchar sec5ms, sec1s, mark_0,count,flag=1;int num=0 ;//--------------------------------void Timer0_Init(void) //定时器初始化{TMOD = 0X01 ;TH0=(65536-5000)/256 ;TL0=(65536-5000)%256 ;EA=1 ;ET0=1 ;TR0=1 ;}void Timer0(void) interrupt 1 //定时器0进中断{TH0 = (65536-5000)/256 ;TL0 = (65536-5000)%256 ;sec5ms = 1 ; //标记count++ ;if(count==200){count=0; sec1s=1 ;if( sec1s==1 ){sec1s = 0 ;if(flag==1) {num++ ; }if( num==21 ) {num = 0 ; }}}}/*函数功能:延时1ms(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒 */ //-------------------------------------------------- void delay1ms(){uchar i, j ;for( i=0 ; i<10 ; i++)for( j=0 ; j<33 ; j++) ;}/*函数功能:延时n毫秒*///------------------------------void delaynms(uchar n){uchar i ;for( i=0; i<n; i++){ delay1ms() ;}}//---------------------------void lwsmg_display() //定义两位数码管{s1 = 0; s2 = 0 ;mark_0 = ~mark_0 ; //标记if(mark_0==0) //动态显示{if(num<10){s1 = 1; s2 = 0 ;smgdat = 0xFF ;}else{s1 = 1; s2 = 0 ;smgdat = tem_CA[num/10]; //十位}}else{s1 = 0 ; s2 = 1 ;smgdat = tem_CA[num%10] ; //个位}}//------------------------------------------------- void read_anjian(){if( key1==0 ){delaynms(8) ;if( key1==0 ){if(flag==1) {flag=0;}num++ ;if( num==21 ) { num=0 ;}}while(!key1) ;delaynms(7) ;while(!key1) ;}if(key2==0){delaynms(8);if(key2==0){ if(flag==1) {flag=0;}num--;if(num<0) { num=20;}}while(!key2);delaynms(7);while(!key2);}}//------------------------------void main(){Timer0_Init() ; //while(1){if( sec5ms==1 ) //5ms 数码管显示一次{sec5ms=0 ;lwsmg_display() ;read_anjian();}}}实验原理:电路中K1~K2 是按键。

按键调节数码管的显示数字(百、十、个可单独调节)

按键调节数码管的显示数字(百、十、个可单独调节)
void main()
{ init();
nuቤተ መጻሕፍቲ ባይዱ=521;
while(1)
{ keyscan();
if(i>=20)
{ i=0;
num--;
}
display(num);
}
}
void init() //定时器初始化
{ TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
bai=num/100;
shi=num%100/10;
ge=num%10;
dula=1;
P0=table[bai];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(2);
dula=1;
P0=table[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uchar x);
void init();
void keyscan();
void display(uint num);
void delay(uchar x);
/
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6; //数码管段选
sbit wela=P2^7; //数码管位选

利用按键操作数码管显示

利用按键操作数码管显示

利用按键操作数码管显示数码管是一种常见的显示设备,它由许多小型LED灯组成,可以通过按键操作实现不同数字的显示。

下面是一个利用按键操作数码管显示数字的示例程序:```c#include <Wire.h>#include <Adafruit_GFX.h>#include <Adafruit_LEDBackpack.h>#define BUTTON_PIN 2Adafruit_7segment display = Adafruit_7segment(;void setupinMode(BUTTON_PIN, INPUT_PULLUP);display.begin(0x70);display.setBrightness(15);void loostatic int number = 0;static int prevButtonState = HIGH;int buttonState = digitalRead(BUTTON_PIN);if (buttonState != prevButtonState && buttonState == LOW)number++;if (number > 9)number = 0;}display.writeDigitNum(0, number, false);display.writeDisplay(;}prevButtonState = buttonState;```这个程序使用`Adafruit_7segment`库来控制数码管显示。

首先,需要在Arduino IDE中安装`Adafruit_GFX`和`Adafruit_LEDBackpack`库。

然后,将数码管的SDA引脚连接到Arduino的A4引脚,SCL引脚连接到A5引脚,还需要将按键连接到2号引脚。

在程序的`setup(`函数中,初始化数码管显示,并设置亮度为最大。

按键加减计数(数码管显示,中断方式)

按键加减计数(数码管显示,中断方式)

按键加减计数(数码管显⽰,中断⽅式)按键加减计数(数码管显⽰,中断⽅式)(合肥⼯⼤周宁)课程设计对象A08电⽓⼯程及⾃动化本科班,共38+39⼈。

⼀.课程设计的任务和⽬的本课程设计要求学⽣在1.5周内编程设计⼀个单⽚机应⽤系统,完成设计报告。

通过设计实践,使学⽣掌握单⽚机的应⽤特点、编程⽅法,学会单⽚机实际应⽤系统的设计开发过程及设计报告的规范书写,为毕业设计打下良好的基础。

⼆.课程设计内容及要求(⼀)、课程设计题⽬可从如下⽅⾯参考选择(⾃⼰出题的必须经⽼师批准):1.单⽚机在计时控制⽅⾯的应⽤设计。

如:时钟、频率计、彩灯、交通灯2.单⽚机在计数控制⽅⾯的应⽤设计。

如:计数器、计分器、抢答器、报警器3.单⽚机在运算控制⽅⾯的应⽤设计。

如:密码锁、计算器、乒乓球游戏机4.单⽚机在波形发⽣⽅⾯的应⽤设计。

如:电⼦琴、⾳乐盒、调光LED灯5.单⽚机在通讯技术⽅⾯的应⽤设计。

如:双机通讯、PC可控单⽚机系统、对话机器⼈6.单⽚机A/D转换技术⽅⾯的应⽤设计。

如:电压表、温度计、照度计(⼆)、具体要求:1.完成控制程序的编制,能演⽰系统功能。

2.完成设计并上交纸质设计报告1份。

3.系统功能要求及设计报告格式范⽂见附件1、附件2。

三.时间与学时安排1.课程设计时间在本学期第16-17周(共1.5周)。

2.总体教学时间安排:课程设计成绩按学⽣设计报告按五级评分制综合评定。

六.评分标准1.设计报告:按版⾯格式、⽂字语法、观点正确性、图表规范性等综合评分。

机电⼯程学院电⽓系胡佳⽂2010年12⽉12⽇附件1:单⽚机原理与应⽤课程设计功能要求1.单⽚机在计时控制⽅⾯应⽤的设计功能要求:(1)时钟能计时,可校准时间,⾄少有⼀种附带功能(如秒表、定时器或闹钟功能);(2)频率计能测试并显⽰1HZ—10KHZ频率、5V的⽅波,可附带⽅波发⽣器功能;(3)彩灯要求控制16个LED有两种以上闪烁⽅式;(4)交通灯要求模拟控制⼗字路⼝交通信号,有倒计时显⽰。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档