数码管的点亮(SEG)
- 共阳极数码管(低电平点亮)的原理图
- 段选:单个数码管内第几节灯珠点亮(a1~dp1)
- 位选:第几个数码管亮(com1~7)
-
程序实例
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值的判断方式同段选