佛大深夜学习 2023-01-31 16:08 采纳率: 60%
浏览 101
已结题

51单片机 数码管动态显示

img

说明:使用普中开发板进行数码管动态显示,显示“1234”
出现问题:第一位显示异常

代码:

#include <STC89C5xRC.H>
#include "stdio.h"
#define u8 unsigned char
#define u16 unsigned int

code unsigned char shownum[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};

u8 COD[8],PSI,COT[10];
u16 seg_delay;

void Timer0_Init(void);
void SEG_Proc();    
void main()
{
    Timer0_Init();
    while(1)
    {
        SEG_Proc();    
    }
}

/*********数码管*************/
/*
    将字符串转化成数码管代码
*/
void SEG_TSL(u8 *input,u8 *output)
{
    u8 i=0,j=0,k=0;
    u8 *s_temp=0;
    for(i=0;i<8;i++,j++)
    {
        switch(input[j])
        {
            case '0':output[i] = shownum[0];break;
            case '1':output[i] = shownum[1];break;
            case '2':output[i] = shownum[2];break;
            case '3':output[i] = shownum[3];break;
            case '4':output[i] = shownum[4];break;
            case '5':output[i] = shownum[5];break;
            case '6':output[i] = shownum[6];break;
            case '7':output[i] = shownum[7];break;
            case '8':output[i] = shownum[8];break;
            case '9':output[i] = shownum[9];break;
        }

        if(input[j+1] == '.')
        {
            output[i] |= 0x80;
        }
    }
}

/*
    数码管显示函数
    P22,P23,P24协助译码器控制位选,其中P22为最低位
*/
void SEG_Show(u8 COD,u8 PSI)
{
    //消影
    P0 = 0x00;
    //位选
    P2 =     P2 & 0xe3 | (PSI<<2);
    //段选
    P0 = COD;
}

/***************定时器***************************/
void Timer0_Init(void)        //1毫秒@12MHz
{
    TMOD &= 0xF0;            //设置定时器模式
    TMOD |= 0x01;            //设置定时器模式
    TL0 = 0x18;                //设置定时初始值
    TH0 = 0xFC;                //设置定时初始值
    TF0 = 0;                //清除TF0标志
    TR0 = 1;                //定时器0开始计时
    //开启中断
    EA = 1;
    ET0 = 1;
}

void Timer0_IT() interrupt 1
{
    TL0 = 0x18;                //设置定时初始值
    TH0 = 0xFC;                //设置定时初始值
    
    if(seg_delay++ == 500)seg_delay = 0;
    
    SEG_Show(COD[PSI],PSI);
    if(PSI++ == 8)PSI = 0;
}


/************************************************/
void SEG_Proc()
{
    if(seg_delay)return;
    seg_delay = 1;
    
    sprintf(COT,"%8u",1234);
    SEG_TSL(COT,COD);
}

  • 写回答

2条回答 默认 最新

  • 智者知已应修善业 2023-02-01 07:57
    关注

    从现象推导数码管的位没控制好,控制好的位不开启是不会有段显示的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 2月9日
  • 已采纳回答 2月1日
  • 创建了问题 1月31日

悬赏问题

  • ¥50 gki vendor hook
  • ¥15 centos7中sudo命令无法使用
  • ¥15 灰狼算法和蚁群算法如何结合
  • ¥15 这是一个利用ESP32自带按键和LED控制的录像代码,编译过程出现问题,请解决并且指出错误,指导如何处理 ,协助完成代码并上传代码
  • ¥20 stm32f103,hal库 hal_usart_receive函数接收不到数据。
  • ¥20 求结果和代码,sas利用OPTEX程序和D-efficiency生成正交集
  • ¥50 adb连接不到手机是怎么回事?
  • ¥20 抓取数据时发生错误: get_mooncake_data() missing 1 required positional argument: 'driver'的问题,怎么改出正确的爬虫代码?
  • ¥15 vs2022无法联网
  • ¥15 TCP的客户端和服务器的互联