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

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日

悬赏问题

  • ¥15 vscode问题请教
  • ¥50 切换TabTip键盘的输入法
  • ¥15 可否在不同线程中调用封装数据库操作的类
  • ¥15 微带串馈天线阵列每个阵元宽度计算
  • ¥15 keil的map文件中Image component sizes各项意思
  • ¥20 求个正点原子stm32f407开发版的贪吃蛇游戏
  • ¥15 划分vlan后,链路不通了?
  • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据
  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 Centos / PETGEM