数码管点亮与显示

本文详细介绍了共阳极数码管的点亮原理,包括位选和段选操作,以及如何通过HC138驱动和定时器实现连续显示。还提供了带有小数点功能的Seg_Display函数示例和定时器0初始化及中断服务函数的代码。
摘要由CSDN通过智能技术生成

数码管的点亮(SEG)

  1. 共阳极数码管(低电平点亮)的原理图

请添加图片描述

  • 段选:单个数码管内第几节灯珠点亮(a1~dp1)
  • 位选:第几个数码管亮(com1~7)
  1. 程序实例

    	P0=0xff;//PO清零
    		HC138(7);//
    		P2&=0x1f;//HC138
    	
    		P0=0x01;//先位选,0x01=0000,0001,选中com1
    		HC138(6);//打开对应的锁存器
    		P2&=0x1f;
    	
    		P0=0x90;//位选0x90=1001 0000这里的第一个一代表点不点亮,
    		HC138(7);//打开位选锁存器
    		P2&=0x1f;
    

     

数码管点亮函数(Seg_Display)

  • 由于直接操作io口点亮SEG的方式过于繁琐所以将SEG的点亮分装成Seg_Display函数
  • 程序实例
    unsigned char SEG_we[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
    unsigned char SEG_duan[11] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
    void SEG_Display(unsigned char we,duan)
    {
    		P0=0xff;//PO口全部置高电平.
    		HC138(7);//
    		P2&=0x1f;//HC138
    	
    		P0=SEG_we[we];//位选
    		HC138(6);
    		P2&=0x1f;
    	
    		P0=SEG_duan[duan];//段选
    		HC138(7);
    		P2&=0x1f;
    }
    

数码管点亮函数(带小数点)

  • 由于有时候需要显示小数点,一般的Seg_Display 却没有办法显示小数点,所以在Seg_Display中添加一个参数用来判断是否将小数点点亮
  • 程序实例
    unsigned char SEG_we[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//数码管12345678
    unsigned char SEG_duan[11] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
    //0123456789空
    
    void SEG_Display(unsigned char we,duan,dot)//在原来的位选和段选之上新加一个dot参数用来判断是否点亮小数点
    {
    	P0=0xff;//PO口全部置高电平.
    	HC138(7);//
    	P2&=0x1f;//HC138
    
    	P0=SEG_we[we];
    	HC138(6);
    	
    
    

通过计时器将数码管进行显示

  • 通过STC_ISP软件设定1ms的定时器
  • 在定时器的中断里调用Sge_Dispaly函数
  • 程序实例
    unsigned char Seg_buff[8] = {10,10,10,10,10,10,10,10};//初始数码管显示
    unsigned char Seg_Pos;//数码管扫描
    unsigned int  Seg_Slow_Down;
    unsigned char Seg_dot[8] = {0,1,0,1,0,0,0,0};//有1代表该位显示时会带小数点
    
    void Timer0Init(void)		//1毫秒@12.000MHz
    {
    	TMOD &= 0xF0;		//设置定时器模式
    	TMOD |= 0x01;		//设置定时器模式
    	TL0 = 0x18;		//设置定时初始值
    	TH0 = 0xFC;		//设置定时初始值
    	TF0 = 0;		//清除TF0标志
    	TR0 = 1;		//定时器0开始计时
    	ET0 = 1;        //定时器0中断打开    这两行在ISP软件不会自动生成,需要手动输入
    	EA = 1;         //总中断打开
    }
    
    void Timer0Server() interrupt 1
    {
     	TL0 = 0x18;		//设置定时初始值
    	TH0 = 0xFC;		//设置定时初始值   
    	//if(++Key_Slow_Down == 10) Key_Slow_Down = 0;//键盘减速专用
    	//if(++Seg_Slow_Down == 500) Seg_Slow_Down = 0;//数码管减速专用
    	if(++Seg_Pos == 8) Seg_Pos = 0;//数码管显示专用
    	SEG_Display(Seg_Pos,Seg_buff[Seg_Pos],Seg_dot[Seg_Pos]);
    	//数码管扫描函数自增,位选即使扫描函数(pos)的值,段选是buff数组内第pos加1的值,dot值的判断方式同段选
    
  • 30
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值