求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
要资料
 
追随技术信仰

随时听讲座
每天看新闻
 
 
单片机教程
第一章 单片机入门
1.单片机简介
2.开发板选择
3.前期准备
第二章 LED及入门
1.初识原理图
2.程序点灯
3.实际LED硬件连接
4.点亮LED
5.闪烁的LED
6.软件调试查看运行时间
7.延时1秒
8.函数封装
9.函数传参调用
10.流水灯
11.数组与移位
第三章 蜂鸣器
1.蜂鸣器原理
2.无源蜂鸣器鸣叫
3.无源蜂鸣器题目
4.无源蜂鸣器+LED
第四章 数码管
1.数码管原理
2.数组&数码管
3.数码管&LED
4.多个数码管显示
5.同时显示不同的数字
6.高位不显示0
7.数码管小数点
8.分钟秒表
第五章 独立按键
1.按键入门
2.按键&蜂鸣器&数码管
3.按键猜想
4.按键用法
5.按键模式
6.不支持连按
7.静态变量
8.支持连按与全局变量
9.再次优化不支持连按的代码
10.流水灯的优化解说
11. 代码对比
12.双模式函数封装
13.第一阶段综合例程(上)
14.第一阶段综合例程(下)
15.第一阶段的总结
第六章 多文件编程
1.多文件编写
2.模块初始化
3.数码管显示函数
4.多文件编程首次测试
5.带返回值的函数
6.新按键程序
7.最终按键程序
8.最终的function文件
第七章 外部中断
1.寄存器
2.中断函数
3.进一步理解中断函数
4.中断的实验现象
5.外部中断测脉冲个数
第八章 定时器
1.定时器概念
2.定时器工作模式
3.定时时长的做法
4.定时器简单运用
5.定时器工作模式2
6.定时器中断函数的使用
7.定时器初始化新写法
8.隐形漏洞
9.代码参考
10.微调定时精确时间
11.单独文件封装
12.输入捕获
13.数据类型强制转换
14.定时器&数码管扫描显示
15.呼吸灯
第九章 舵机与超声波模块
1.舵机入门
2.舵机与按键
3.超声波模块
第十章 串口通信
1.串口通信入门
2.简洁式串口通信
3.详细理解ASCII码
4.串口printf系列函数
第十一章 1602液晶屏
1.液晶屏代码讲解
2.指向数组的指针
3.液晶屏代码单独文件
4.各功能代码的运用
第十二章 IIC通信
1.IIC入门代码讲解
2.EEPROM简单使用
3.IIC&EEPROM合成文件
第十三章 红外遥控与温度传感器
1.红外遥控
2.代码文件和测试
3.温度传感器代码解析Ⅰ
4.温度传感器代码解析Ⅱ
5.温度传感器代码独立文件
第十四章 AD与DA
1.AD与DA合成文件
第十五章 混合例程
1.电位器控制舵机
2.遥控器控制舵机
3.温度传感器与串口
4.模拟倒车雷达报警
5.再次熟悉串口
6.串口&液晶屏Ⅰ
7.串口&液晶屏Ⅱ
8.串口&液晶屏Ⅲ
9.串口&EEPROM
10.实践操作
11.结束语
 

 
目录
高位不显示0
来源:C语言网    作者:继承叔    编辑:Alice(火龙果软件)
442 次浏览
1次  

在上一讲代码基础上,根据常识,变量没有到达10时,数码管1和数码管2应该是不需要点亮的,也就是高位不显示0。

1.代码参考

笔者参考了宋老师的代码,他的做法就是额外开辟出一个数组用来做缓存,P0去取这个数组里的值即可,初始化的时候如下

unsigned char LedBuff[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};

然后各块内存用来存放对应的数码管显示的状态值,比如像上一讲的代码,我们这样存放好:

LedBuff[0]= LedChar[Second%10];

LedBuff[1]= LedChar[(Second/10)%10];

LedBuff[2]= LedChar[(Second/100)%10];

到时赋给P0的值就是LedBuff[0],LedBuff[1],LedBuff[2]。像一开始LedBuff[1]和LedBuff[2]的值都是0xFF, Second没到10时,

不执行“LedBuff[1]= LedChar[(Second/10)%10]; ”,即使数码管1已在允许被点亮状态,

但是由于“P0= LedBuff[1];(也就是P0= 0xFF;)”导致所有段的灯都无法点亮也就不显示内容了。

当然用额外的数组存放数码管状态值还有另一个好处,当我们学到后面的计分功能要这样显示时

中间要显示非数字或字母时,给LedBuff[2]和LedBuff[3]提前赋值0xBF只点亮一段灯就在中间显示一杠了。

现在我们实现上一讲的功能但高位不显示0。

2.代码实现

#include <reg52.h> 
sbit ADDR2 = P1^2;
sbit ADDR1 = P1^1;
sbit ADDR0 = P1^0;
sbit ENLED = P1^4;
sbit ADDR3 = P1^3;
 
unsigned char code LedChar[16]={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};//数码管显示缓存区
 
void main()
{  
    unsigned int i=0,x;
    unsigned char Second=0;//定义一个一秒之后自增1的变量
    ADDR3 = 1;//使能三八译码器
    ENLED = 0;// 
   
    while(1)
    {   
        LedBuff[0]=LedChar[Second%10];   
        if(Second>=10)LedBuff[1]= LedChar[(Second/10)%10];  //Second没到达10之前不更新LedBuff[1]的初始值
        if(Second>=100)LedBuff[2]= LedChar[(Second/100)%10];//Second没到达100之前不更新LedBuff[2]的初始值
        if(Second==0){ LedBuff[1]=0xFF;LedBuff[2]=0XFF; }   //Second到达255之后再加1就溢出变为0了,这时候要再次熄灭这两个数码管
        for(x=0;x<32765;x++)//循环持续一定的时间
        
            P0=0xFF;//端口状态全部熄灭数码管里的LED达到刷新作用
            switch(i)
            {
                case 0:
                ADDR2 = 0;ADDR1 = 0;ADDR0 = 0;P0=LedBuff[0];i++;break;
       
                case 1:
                ADDR2 = 0;ADDR1 = 0;ADDR0 = 1;P0=LedBuff[1];i++;break;     
       
                case 2:
                ADDR2 = 0;ADDR1 = 1;ADDR0 = 0;P0=LedBuff[2];i=0;break;  
            }  
        
        Second++;//持续一定的时间之后变量自加1 
    }
}

 

笔者在修改for循环的x值时,软件调试发现无法使Second准确地间隔1秒后自加,这里大家不用太纠结Second能否均匀的1秒后自加1,而是学会了本节想表达的知识点,后面我们也不会用到for循环来实现让三八译码器间隔导通不同的三极管了,到时学会定时器知识内容即可完美实现这方面的功能,笔者也是考虑到大家刚入门需要多点基础的例程代码来熟悉单片机编程,所以才不会跨度太大地教大家新知识。


您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码: 验证码,看不清楚?请点击刷新验证码 必填



442 次浏览
1次