51单片机C语言程序(四)键盘 数码管 跑表程序

发布者:gamma13最新更新时间:2015-11-17 来源: eefocus关键字:51单片机  C语言程序  键盘  数码管 手机看文章 扫描二维码
随时随地手机看文章
程序一

数码管前三位显示一个跑表,
从000到999之间以1%秒的速度运行,
当按下一个独立键盘时跑表停止,
松开手后跑表继续运行(用定时器设计表)

#include
#include
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
sbit s2=P3^4;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x76,0x79,0x38,0x3f,0};
uchar flag,t0,ge,shi,bai;
uint shu;
void init();            
void display(uchar aa,uchar bb,uchar cc);
void delay(uint z)
{
 uint x,y;
 for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
void main()   
{
 init();
 while(1)
 {
  display(bai,shi,ge);
  if(s2==0)
  {
   delay(10);
   if(s2==0)
   {
    TR0=0;
    while(!s2)
     display(bai,shi,ge);
    TR0=1;
   }
   
 }
}

void init()       
{
 TMOD=0x01;
 TH0=(65536-10000)/256;
 TL0=(65536-10000)%256;
 EA=1;
 ET0=1;
 TR0=1;
}

void timer0() interrupt 1
{
 TH0=(65536-10000)/256;
 TL0=(65536-10000)%256;
 shu++;
 if(shu==1000)
  shu=0;
 bai=shu/100;
 shi=shu%100/10;
 ge=shu%10;
  
}


void display(uchar aa,uchar bb,uchar cc)
{
        dula=1;
  P0=table[aa];
  dula=0;
  P0=0xff;
  wela=1;
  P0=0xfe;
  wela=0;
  delay(1);

        dula=1;
  P0=table[bb];
  dula=0;
  P0=0xff;
  wela=1;
  P0=0xfd;
  wela=0;
  delay(1);

       dula=1;
  P0=table[cc];
  dula=0;
  P0=0xff;
  wela=1;
  P0=0xfb;
  wela=0;
  delay(1);
}

 

程序二

数码管前三位显示一个跑表,
从000到999之间以1%秒的速度运行,
当按下一个独立键盘时跑表停止,
松开手后跑表继续运行(用定时器设计表)

三个独立键盘实现按下第一个时计时停止,按下第二个
时计时结束,按下第三个是计数值清零从头开始

 

#include
#include
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
sbit s2=P3^4;
sbit s3=P3^5;
sbit s4=P3^6;
sbit s5=P3^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x76,0x79,0x38,0x3f,0};
uchar flag,t0,ge,shi,bai;
uint shu;
void init();            
void display(uchar aa,uchar bb,uchar cc);
void delay(uint z)
{
 uint x,y;
 for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
void main()   
{
 init();
 while(1)
 {
  display(bai,shi,ge);
  if(s2==0)
  {
   delay(10);
   if(s2==0)
   {
    TR0=0;
    while(!s2)
     display(bai,shi,ge);
    TR0=1;
   }
  }
  if(s3==0)
  {
   delay(10);
   if(s3==0)
   {
    while(!s2)
     display(bai,shi,ge);
    TR0=0;
   }
  }
  if(s4==0)
  {
   delay(10);
   if(s4==0)
   {
    while(!s2)
     display(bai,shi,ge);
    TR0=1;
   }
  }
  if(s5==0)
  {
   delay(10);
   if(s5==0)
   {
    while(!s2)
     display(bai,shi,ge);
    shu=0;
   }
   
 }
}

void init()       
{
 TMOD=0x01;
 TH0=(65536-10000)/256;
 TL0=(65536-10000)%256;
 EA=1;
 ET0=1;
 TR0=1;
}

void timer0() interrupt 1
{
 TH0=(65536-10000)/256;
 TL0=(65536-10000)%256;
 shu++;
 if(shu==1000)
  shu=0;
 bai=shu/100;
 shi=shu%100/10;
 ge=shu%10;
  
}

[page]
void display(uchar aa,uchar bb,uchar cc)
{
        dula=1;
  P0=table[aa];
  dula=0;
  P0=0xff;
  wela=1;
  P0=0xfe;
  wela=0;
  delay(1);

        dula=1;
  P0=table[bb];
  dula=0;
  P0=0xff;
  wela=1;
  P0=0xfd;
  wela=0;
  delay(1);

       dula=1;
  P0=table[cc];
  dula=0;
  P0=0xff;
  wela=1;
  P0=0xfb;
  wela=0;
  delay(1);
}

 

 

 

程序三

按下16个矩阵键盘依次在数码管上显示
1-16的平方。如按下第一个显示1,
第二个显示4---

 

#include
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
sbit key1=P3^4;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar temp;
uint num,num1;
void delay(uint z)
{
 uint x,y;
 for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
uint keyscan();
void display(uchar,uchar,uchar);
void main()
{
 dula=1;
 P0=0;
 dula=0;
 wela=1;
 P0=0xc0;
 wela=0;
 while(1)
 {
  num1=keyscan();
  display(num1/100,num1%100/10,num1%10);
 }
}
void display(uchar aa,uchar bb,uchar cc)
{
        dula=1;
  P0=table[aa];
  dula=0;
  P0=0xff;
  wela=1;
  P0=0xfe;
  wela=0;
  delay(1);

        dula=1;
  P0=table[bb];
  dula=0;
  P0=0xff;
  wela=1;
  P0=0xfd;
  wela=0;
  delay(1);

       dula=1;
  P0=table[cc];
  dula=0;
  P0=0xff;
  wela=1;
  P0=0xfb;
  wela=0;
  delay(1);
}
uint keyscan()
{
 P3=0xfe;
 temp=P3;
 temp=temp&0xf0;
 while(temp!=0xf0)
 {
  delay(5);
  temp=P3;
  temp=temp&0xf0;
  while(temp!=0xf0)
  {
   temp=P3;
  switch(temp)
  {
   case 0xee:num=1;
    break;
   case 0xde:num=4;
    break;
   case 0xbe:num=9;
    break;
   case 0x7e:num=16;
    break;
  }
  while(temp!=0xf0)
  {
   temp=P3;
   temp=temp&0xf0;
  }
  }
 }

 P3=0xfd;
 temp=P3;
 temp=temp&0xf0;
 while(temp!=0xf0)
 {
  delay(5);
  temp=P3;
  temp=temp&0xf0;
  while(temp!=0xf0)
  {
   temp=P3;
  switch(temp)
  {
   case 0xed:num=25;
    break;
   case 0xdd:num=36;
    break;
   case 0xbd:num=49;
    break;
   case 0x7d:num=64;
    break;
  }
  while(temp!=0xf0)
  {
   temp=P3;
   temp=temp&0xf0;
  }
  }
 }


 P3=0xfb;
 temp=P3;
 temp=temp&0xf0;
 while(temp!=0xf0)
 {
  delay(5);
  temp=P3;
  temp=temp&0xf0;
  while(temp!=0xf0)
  {
   temp=P3;
  switch(temp)
  {
   case 0xeb:num=81;
    break;
   case 0xdb:num=100;
    break;
   case 0xbb:num=121;
    break;
   case 0x7b:num=144;
    break;
  }
  while(temp!=0xf0)
  {
   temp=P3;
   temp=temp&0xf0;
  }
  }
 }


 P3=0xf7;
 temp=P3;
 temp=temp&0xf0;
 while(temp!=0xf0)
 {
  delay(5);
  temp=P3;
  temp=temp&0xf0;
  while(temp!=0xf0)
  {
   temp=P3;
  switch(temp)
  {
   case 0xe7:num=169;
    break;
   case 0xd7:num=196;
    break;
   case 0xb7:num=225;
    break;
   case 0x77:num=256;
    break;
  }
  while(temp!=0xf0)
  {
   temp=P3;
   temp=temp&0xf0;
  }
  }
 }
return num;
}

关键字:51单片机  C语言程序  键盘  数码管 引用地址:51单片机C语言程序(四)键盘 数码管 跑表程序

上一篇:51单片机 8255 18b20 数码管显示温度C程序
下一篇:51单片机C语言程序(五) 时钟程序(用定时器)

推荐阅读最新更新时间:2024-03-16 14:39

基于51单片机的手动数字时钟
具体实现功能 实现功能: (1)利用数码管显示时分秒,显示格式为“时-分-秒”; (2)利用6个按键控制时、分、秒; (3)设置秒复位按键,可实现秒钟复位。 单片机介绍 51单片是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C51为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。具有以下标准功能:8k字节Flash,512字节RAM,32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口。另外 STC8
[单片机]
基于<font color='red'>51单片机</font>的手动数字时钟
基于51单片机超声波避障+蓝牙遥控智能小车
单片机源程序如下: #include reg52.h #include intrins.h typedef unsigned char u8; typedef unsigned int u16; typedef unsigned long u32; sbit Sevro_moto_pwm = P2^6; //接舵机信号端输入PWM信号调节速度 sbit ECHO= P1^1; //超声波接口定义 sbit TRIG= P1^0; //超声波接口定义 sbit PWM1 = P2^5; //左电机高电平 sbit PWM2 = P2^
[单片机]
51单片机演奏乐曲的程序
sbit SPK = P1^7 ;指定扬声器接口 ORG 0000H LJMP START ORG 000BH LJMP T0_INT ORG 001BH LJMP T1_INT ;------------------------------------------------------------ B_ZQ_TAB: ;定时半周期初始值数据表(数据的意义可见前一篇博文) DW 63625, 63833, 64019, 64104, 64260, 64400, 64524 ;低音区:1 2 3 4 5 6 7 DW 64580,
[单片机]
单片机C语言程序设计:INT0 中断计数
/* 名称: INT0 中断计数 说明:每次按下计数键时触发 INT0 中断,中断程序累加计数, 计数值显示在 3 只数码管上,按下 清零键时数码管清零 */ #include #define uchar unsigned char #define uint unsigned int //0~9 的段码 uchar code DSY_CODE ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; // 计数值分解后各个待显示的数位 uchar DSY_Buffer ={0,0,0}; uchar Count=0; sb
[单片机]
单片机<font color='red'>C语言程序</font>设计:INT0 中断计数
51单片机的串口中断设置
首先,你要用软件允许中断, 即C语言中EA = 1; 允许总中断ES = 1; //允许串口中断汇编中可用 SETB EA ;允许总中断 SETB ES ;允许串口中断 当单片机接收到一帧数据后,RI会置1,向CPU申请中断,若之前有中断允许,则产生了中断,进入中断服务程序。 当然,单片机发送完一帧数据,TI也会置1,同样会产生中断! 一般我们在发送数据时要关中断,因为一般你不用在发送时不用处理数据; 接收数据时要开中断,以便你在中断服务程序中将接收到的数据进行存储并处理。 补充:其实,不管你有没有允许中断,上位机(此时即给单片机发送信息的机器)只要给单片机发送数据,单片机就会自动接收数据,并把它放在数据缓冲器S
[单片机]
基于51单片机的红外遥控器设计
引言 人们的生活已经全面迈入了信息化的时代,使用红外遥控的家电种类开始增多,在日常生活中利用红外遥控来控制红外控制的家电种类非常的多,普通的家电就有:电视、DVD机、空调等,这些都是需要红外遥控进行控制的,但一个家电只能由厂家的配置的遥控器进行控制,而且只有对应的红外遥控发出的红外编码才能控制相关的红外家电。 为了探究红外遥控的内在原理并延伸红外遥控技术,本文利用平时所学的单片机原理及应用、传感器技术与应用、模拟电子技术和数字电子技术基础等相关电子专业知识,设计了一款基于STC89C52RC单片机的红外遥控系统。该红外遥控系统能够学习并记忆市场上的家电红外遥控器红外编码信号,可以融合多种红外遥控于一体,从而满足对多种红外遥控设备
[单片机]
C-51单片机最简单静态数码管显示数字
单片机系统中常用的显示器有:发光二极管LED(Light Emitting Diode)显示器、液晶LCD(Liquid Crystal Display)显示器、CRT显示器等,其中七段数码管显示器是常用的显示器,常用来显示设备的运行状态, 可以显示各种数字和字符,分共阴极和共阳极两种,内部电路如图1所示。 让某一数码管显示某一数字只需要 P1=0X**; // ** 表示点亮的位置 P2=0X**; // ** 表示点亮的数字 直接上代码 #include reg51.h void main() { while(1) { P1=0Xfb; P2=0X5b; //共阴极 }
[单片机]
C-<font color='red'>51单片机</font>最简单静态<font color='red'>数码管</font>显示数字
51单片机红外遥控解码
红外遥控发射芯片采用PPM编码方式,当发射器按键按下后,将发射一组108ms的编码脉冲。遥控编码脉冲由前导码、8位用户码、8位用户码的反码、8位操作码以及8位操作码的反码组成。通过对用户码的检验,每个遥控器只能控制一个设备动作,这样可以有效地防止多个设备之间的干扰。编码后面还要有编码的反码,用来检验编码接收的正确性,防止误操作,增强系统的可靠性。前导码是一个遥控码的起始部分,由一个9ms的低电平(起始码)和一个4. 5ms的高电平(结果码)组成,作为接受数据的准备脉冲。以脉宽为0. 56ms、周期为1. 12ms的组合表示二进制的“0”;以脉宽为1. 68ms、周期为2. 24ms的组合表示二进制的“1”。如果按键按下超过108m
[工业控制]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved