登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 独立自己写程序发现错误

[复制链接]
发表于 2018-2-24 20:57:03 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 单片机
学习安排: 不要超过1小时
开始时间: 2018-02-24
结束时间: 2018-02-24
好久没有学习了,自己独立写了可以独立移植的数码管程序
#include<stc12c5a60s2.h>
sbit ADDR0 = P2^0;
sbit ADDR1 = P2^1;
sbit ADDR2 = P2^2;
sbit ENLED = P1^1;
unsigned char T0RH = 0;  //T0重载值的高字节
unsigned char T0RL = 0;  //T0重载值的低字节
unsigned char code LedChar[] = { //共阳极数码管显示字符转换表
        0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,   
        0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};

unsigned char LedBuff[6] = { //数码管显示缓冲区,初值 0xFF 确保启动时都不亮
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF       
};   
        unsigned int  cnt = 0;  //记录 T0 中断次数     
    unsigned char flag1s = 0;  //1 秒定时标志
    unsigned int c = 0;        //定义循环变量 C,用于软件延时
        unsigned char cnt1 = 0; //定义计数变量 cnt1,用于移位控制
void LedScan();
void ConTimer0(unsigned int ms);
void main()
{   
        unsigned long sec = 0;  //记录经过的秒数
       
    EA = 1;           //使能总中断,启动。
        ENLED = 0;        //74CH245数码管导通
    ConTimer0(1);

       
        while (1)   
{     

          if (flag1s == 1)        //判断 1 秒定时标志        
         {     
                  
                   flag1s = 0;       //1 秒定时标志清零
                   sec++;            //计数值自加 1
                  
                           //以下代码将 sec 按十进制位从低到高依次提取并转为数码管显示字符               
                           LedBuff[0] = LedChar[sec%10];               
                           LedBuff[1] = LedChar[sec/10%10];               
                           LedBuff[2] = LedChar[sec/100%10];              
                           LedBuff[3] = LedChar[sec/1000%10];               
                       LedBuff[4] = LedChar[sec/10000%10];            
                       LedBuff[5] = LedChar[sec/100000%10];            
          }
  }



}
       

/* 配置并启动T0,ms-T0定时时间 */
void ConTimer0(unsigned int ms)
{
    unsigned long tmp;  //临时变量

    tmp = 32000000/12;      //定时器计数频率          ,,,设为1T可以不除12
    tmp = (tmp * ms) / 1000;  //计算所需的计数值
    tmp = 65536 - tmp;        //计算定时器重载值
    tmp = tmp + 18;           //补偿中断响应延时造成的误差
    T0RH = (unsigned char)(tmp>>8);  //定时器重载值拆分为高低字节
    T0RL = (unsigned char)tmp;
        AUXR=0x00;      
    TMOD &= 0xF0;   //清零T0的控制位
    TMOD |= 0x01;   //配置T0为模式1
    TH0 = T0RH;     //加载T0重载值
    TL0 = T0RL;
    ET0 = 1;        //使能T0中断
    TR0 = 1;        //启动T0
}



void InterruptTimer0() interrupt 1
        {     
                TH0 = T0RH;     //加载T0重载值
        TL0 = T0RL;
                cnt++;        //中断次数计数值加 1     
                if (cnt >= 1000)  //中断 1000 次即 1 秒   
                {
                                cnt = 0;       //清零计数值以重新开始下 1 秒计时         
                                flag1s = 1;    //设置 1 秒定时标志为 1  
            }
                      
                   LedScan();//以数码管动态扫描刷新
           }
       
//数码管动态扫描
void LedScan()
{
    static unsigned char i = 0;  

    P0 = 0xFF;             //用于消隐
    P2 = (P2 & 0xF8) | i;
    P0 = LedBuff[i];     
    if (i < 5)         
        i++;
    else
        i = 0;
}

但是数码管是靠左显示的,想了好久还是不可以靠右显示,,,求大佬帮忙
小白
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表