键盘输入的数字在串口调试助手显示,然后再到数码管(C语音版本)

//按下哪一个键就在数码管上显示数字,并且传送到串口调试助手上
#include <reg52.h>
#include "uart.h"
typedef unsigned char uint8;
typedef unsigned int  uint16;

uint8 number[]={0x0c0,0x0F9,0x0A4,0x0B0,
    0x99,0x92,0x82,0xF8,
    0x80,0x90,0x88,0x83,
    0xC6,0xA1,0x86,0x8E};
uint16 n,num=0;
void UART_init()
{

 TMOD = 0x20;   //0010 0000   说明在定时器1的工作方式2下工作
 TH1  = 0xFD;
 TL1  = 0xFD;

 TR1  = 1;    //定时器1运行控制位=1,说明开始计时
 SCON = 0x50;   //0101 0000   前两位说明在串口工作方式1  第三位SM2在方式1设置为0  第四位REN=1允许串口接收
}

 

void delay()
{
  n=1000;
  while(n--);
}

 

 


main()
{
 P0 = 0xFF;  // led初始化
 
 ENLED1 = 0;
 ENLED2 = 1; //3/8译码器使能

 ADDR2 = 0;
 ADDR1 = 0;
 ADDR0 = 0; //选中第一个数码管


    UART_init();

 while (1)
 {
  keyOut1 = 0;
  keyOut2 = 1;
  keyOut3 = 1;
  keyOut4 = 1;
  if(keyIn1 == 0)
  {
   delay();
   if(keyIn1 == 0)
      P0 =number[0];
      SBUF=0;
  }
  if(keyIn2 == 0)
  {
   delay();
   if(keyIn2 == 0)
      P0 =number[1];
      SBUF=1;
  }
  if(keyIn3 == 0)
  {
   delay();
   if(keyIn3 == 0)
       P0 =number[2];
    SBUF=2;
  } 
  if(keyIn4 == 0)
  {
   delay();
   if(keyIn4 == 0)
      P0 =number[3];
      SBUF=3;
  }
  while((keyIn1 == 0)||(keyIn2 == 0)||
        (keyIn3 == 0)||(keyIn4 == 0));
  
  keyOut1 = 1;
  keyOut2 = 0;
  keyOut3 = 1;
  keyOut4 = 1;
  if(keyIn1 == 0)
  {
   delay();
   if(keyIn1 == 0)
      P0 =number[4];
      SBUF=4;
  }
  if(keyIn2 == 0)
  {
   delay();
   if(keyIn2 == 0)
      P0 =number[5];
      SBUF=5;
  }
  if(keyIn3 == 0)
  {
   delay();
   if(keyIn3 == 0)
       P0 =number[6];
    SBUF=6;
  } 
  if(keyIn4 == 0)
  {
   delay();
   if(keyIn4 == 0)
      P0 =number[7];
      SBUF=7;
  }
  while((keyIn1 == 0)||(keyIn2 == 0)||
        (keyIn3 == 0)||(keyIn4 == 0));

  keyOut1 = 1;
  keyOut2 = 1;
  keyOut3 = 0;
  keyOut4 = 1;
  if(keyIn1 == 0)
  {
   delay();
   if(keyIn1 == 0)
      P0 =number[8];
      SBUF=8;
  }
  if(keyIn2 == 0)
  {
   delay();
   if(keyIn2 == 0)
      P0 =number[9];
      SBUF=9;
  }
  if(keyIn3 == 0)
  {
   delay();
   if(keyIn3 == 0)
      P0 =number[10];
      SBUF=10;
  } 
  if(keyIn4 == 0)
  {
   delay();
   if(keyIn4 == 0)
      P0 =number[11];
      SBUF=11;
  }
  while((keyIn1 == 0)||(keyIn2 == 0)||
        (keyIn3 == 0)||(keyIn4 == 0));

  keyOut1 = 1;
  keyOut2 = 1;
  keyOut3 = 1;
  keyOut4 = 0;
  if(keyIn1 == 0)
  {
   delay();
   if(keyIn1 == 0)
       P0 =number[12];
    SBUF=12;

  }
  if(keyIn2 == 0)
  {
   delay();
   if(keyIn2 == 0)
      P0 =number[13];
      SBUF=13;
  }
  if(keyIn3 == 0)
  {
   delay();
   if(keyIn3 == 0)
       P0 =number[14];
    SBUF=14;
  } 
  if(keyIn4 == 0)
  {
   delay();
   if(keyIn4 == 0)
       P0 =number[15];
    SBUF=15;
  }
  
    while((keyIn1 == 0)||(keyIn2 == 0)||
        (keyIn3 == 0)||(keyIn4 == 0));
  
 }
}

 

我用到的是直接法,大家还可以试试扫描法

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,以下是一个简单的C51通过串口调试助手控制数码管显示数字和蜂鸣器的完整代码: ``` #include <reg52.h> #include <stdio.h> sbit buzzer = P1^0; // 蜂鸣器连接的引脚 /* 数码管连接的引脚 a f b g e c d dp */ sbit seg_a = P0^0; sbit seg_b = P0^1; sbit seg_c = P0^2; sbit seg_d = P0^3; sbit seg_e = P0^4; sbit seg_f = P0^5; sbit seg_g = P0^6; sbit seg_dp = P0^7; unsigned char code SEG_TAB[] = { // 数码管段码表 0xc0, // '0' 0xf9, // '1' 0xa4, // '2' 0xb0, // '3' 0x99, // '4' 0x92, // '5' 0x82, // '6' 0xf8, // '7' 0x80, // '8' 0x90 // '9' }; void initUART() { TMOD = 0x20; // 设置定时器1为模式2 TH1 = 0xfd; // 波特率设置为9600 TL1 = 0xfd; TR1 = 1; // 启动定时器1 SCON = 0x50; // 串口工作在模式1 ES = 1; // 开启串口中断 EA = 1; // 开启总中断 } void UART_ISR() interrupt 4 { if (RI) { // 判断是否接收到数据 RI = 0; // 清除接收中断标志位 unsigned char data = SBUF; // 读取接收到的数据 if (data >= '0' && data <= '9') { // 如果接收到的数据为数字字符 P2 = SEG_TAB[data - '0']; // 在数码管显示对应数字 } if (data == 'B' || data == 'b') { // 如果接收到的数据为'B'或'b' buzzer = 1; // 打开蜂鸣器 } if (data == 'C' || data == 'c') { // 如果接收到的数据为'C'或'c' buzzer = 0; // 关闭蜂鸣器 } } } void main() { initUART(); // 初始化串口模块 P0 = 0xff; // 关闭数码管 while (1) {} } ``` 在这个示例代码中,我们使用了定时器1来控制串口的波特率,使用了中断来处理串口数据的接收。当接收到的数据为数字字符时,我们会在数码管显示对应的数字;当接收到的数据为'B'或'b'时,我们会打开蜂鸣器;当接收到的数据为'C'或'c'时,我们会关闭蜂鸣器。在程序的主循环中,我们只是一直等待串口数据的接收,因此程序不会退出。 请注意,这个示例代码只是一个非常简单的示例,实际的应用程序可能需要更完善的错误检测和容错机制。同时,硬件的具体实现也会对代码产生影响,因此在实际应用中可能需要根据具体硬件进行一些调整。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值