微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 新人求大神进!程序烧入后数码管显示乱码怎么办。1分为了显眼

新人求大神进!程序烧入后数码管显示乱码怎么办。1分为了显眼

时间:10-02 整理:3721RD 点击:
   大神你们终于来了,请帮我看下程序,学着网上做了个温度报警器,可是程序烧进去后如图显示乱码,(本来该显示温度等)
确定只是程序的问题!要强的我想靠自己解决这个问题但是在找不到哪里出错,希望大神帮看下程序,谢谢啦

//数码管段选定义      0     1    2    3    4    5     6     7      8       9   
uchar code smg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
                       0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};     //断码
//数码管位选定义
uchar code smg_we[]={0x7f,0xbf,0xdf,0xef};
uchar dis_smg[8]  = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};   
sbit CS=P3^2;        //CS定义为P3口的第2位脚,连接ADC0832CS脚  PCB
sbit SCL=P3^3;        //SCL定义为P3口的第3位脚,连接ADC0832SCL脚
sbit DO=P3^4;        //DO定义为P3口的第4位脚,连接ADC0832DO脚

/***********************数码显示函数*****************************/
void display()
{
    uchar i;
    P1 = 0xff;             //消隐                           
    P2 = smg_we[i];              //位选
    P1 = dis_smg[i];         //段选      
    i ++;
    if(i >= 4)            //4位数码管显示
        i = 0;      
}

/*************定时器0初始化程序***************/
void time_init()      
{
    EA   = 1;           //开总中断
    TMOD = 0X01;      //定时器0、定时器1工作方式1
    ET0  = 1;          //开定时器0中断
    TR0  = 1;          //允许定时器0定时
}
/****************按键处理数码管显示函数***************/
void key_with()
{
    if(key_can == 4)      //紧急报警键  手动报警
    {
        if(menu_1 == 0)
            shoudong = 1;
    }
    if(key_can == 1)     //设置键
    {
        menu_1 ++;
        if(menu_1 >= 3)
        {
            menu_1 = 0;
        }
    }
    if(menu_1 == 0)
    {
        if((key_can == 2) || (key_can == 3))
            shoudong = 0;          //取消手动报警
    }
    if(menu_1 == 1)            //设置高温报警
    {
        if(key_can == 2)
        {
            s_temp ++ ;        //高温报警值加1
            if(s_temp > 99)
                s_temp = 99;
        }
        if(key_can == 3)
        {
            s_temp -- ;        //高温报警值减1
            if(s_temp <= 10)
                s_temp = 10 ;
        }
        dis_smg[0] = smg_du[s_temp % 10];               //取个位显示
        dis_smg[1] = smg_du[s_temp / 10 % 10];  //取十位显示
        dis_smg[2] = 0xbf;
        dis_smg[3] = smg_du[10];    //显示A
        write_eeprom();               //保存数据
    }   
    if(menu_1 == 2)            //设置烟物报警
    {
        if(key_can == 2)
        {
            s_dengji ++ ;      //烟物报警值加1
            if(s_dengji >= 9)
                s_dengji = 9;
        }
        if(key_can == 3)
        {
            s_dengji --;      //烟物报警值减1
            if(s_dengji <= 1)
                s_dengji = 1;
        }
        dis_smg[0] = smg_du[s_dengji % 10];               //取个位显示
        dis_smg[1] = 0xbf ;  
        dis_smg[2] = 0xbf;
        dis_smg[3] = smg_du[11];    //显示B
        write_eeprom();               //保存数据
    }   
}  
/***************主函数*****************/
void main()
{
    beep = 0;                    //开机蜂鸣器叫一声
    delay_1ms(200);
    P0 = P1 = P2 = P3 = 0xff;   //初始化IO口为高电平
    temperature = read_temp();  //读取温度值
    init_eeprom();  //开始初始化保存的数据
    delay_1ms(650);               
    temperature = read_temp();  //读取温度值
    time_init();                //初始化定时器
    while(1)
    {
        key();                    //独立按键程序
        if(key_can < 10)
        {
            key_with();            //按键按下要执行的程序
        }
        if(flag_300ms == 1)
        {        
            flag_300ms = 0;
            clock_h_l();
            temperature = read_temp();  //读取温度值
            dengji = ad0832read(1,0);   
            dengji = dengji * 10 / 250;
            if(menu_1 == 0)
            {
                if(temperature >= 99)
                    temperature = 99;
                dis_smg[3]=smg_du[dengji];        //显示烟物报警等级
                dis_smg[2]= 0xbf;                // -        
                dis_smg[1]=smg_du[temperature/10%10];    //十位
                dis_smg[0]=smg_du[temperature%10];        //个位    ADC0832为8位ADC,数值为0~255,我们将其分开放入l_tmpdate数组中显示
            }
        }
        delay_1ms(1);
    }
}
/*************定时器0中断服务程序***************/
void time0_int() interrupt 1
{   
    static uchar value;
    TH0 = 0xf8;
    TL0 = 0x30;     // 2ms
    value ++;     
    display();      //数码管显示函数
    if(value % 150 == 0)
    {
        flag_300ms = 1;       //300ms
        value = 0;
    }
}

烧入后显示错误


数码管是公阴还是公阳的啊,

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top