
先选好位选信号,可以控制P20、P21、P22、P23个数码管的位选信号,再选好段选信号(0点亮,1灭),即P0~P7这8个引脚控制数码管的段选信号,要数码管显示什么内容,就可以了。
数码管,是一种可以显示数字和其他信息的电子设备。玻璃管中包括一个金属丝网制成的阳极和多个阴极。大部分数码管阴极的形状为数字。管中充以低压气体,通常大部分为氖加上一些汞和/或氩。给某一个阴极充电,数码管就会发出颜色光,视乎管内的气体而定,一般都是橙色或绿色。
数码管的最常见形式有10个阴极,形状为数字0到9,某些数码管还有一个或两个小数点。然而也有其他类型的数码管显示字母、标记和符号。如一种“数码管”,其阴极为一个模板制成的面具,上面有数字形状的孔。
数码管按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND上。
首先你这个数码管是共阳的还是共阴的,led1~8是接138还是锁存器,如果是138的话请提供接ABC的输入IO,然后P0口按照编码表来赋值,对7来说共阳的话就是0xF8,共阴是0x07,一般是将编码声明为常量数组 code unsigned char[],以后用的时候取出对应的编码就可以了。下面是示例程序:
#include <reg51.h>#include <intrins.h>
#include<math.h>
unsigned char data dis_digit //dis_digit---位选通值, 传送到P2口用于选通当
//前数码管的数值, 如等于0xfe时,选通P2.0口数码管
unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0, // 0, 1, 2, 3
0x99,0x92,0x82,0xf8,0x80,0x90, 0xff}// 4, 5, 6, 7, 8, 9, off
unsigned char data dis_buf[8] // dis_buf --- 显于缓冲区基地址
unsigned char data dis_index // dis_index --- 显示索引, 用于标识当前显示的数码 //管和缓冲区的偏移量
Void delay(int t)
{
int i
while(t--) {
for(i=0i<120i++)
{}
}
}
Void main()
{
P0 = 0xff
P2 = 0xff
TMOD = 0x01 //定时器0工作于方式1
TH0 = 0x8C
TL0 = 0x8B
IE = 0x8A //开总中断和定时器1中断允许
dis_buf[0] = dis_code[0x1]
dis_buf[1] = dis_code[0x2]
dis_buf[2] = dis_code[0x3]
dis_buf[3] = dis_code[0x4]
dis_buf[4] = dis_code[0x5]
dis_buf[5] = dis_code[0x6]
dis_buf[6] = dis_code[0x7]
dis_buf[7] = dis_code[0x8]
dis_digit = 0xf9 //控制在数码管上显示的数字效果,按位
dis_index = 0
TR0 = 1
while(1)
}
Void timer0() interrupt 1
//定时器0中断服务程序, 用于数码管的动态扫描
//dis_index --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
//dis_digit --- 位选通值, 传送到P2口用于选通当前数码管的数值,
//如等于0xfe时, 选通 P2.0口数码管 dis_buf --- 显于缓冲区基地址
{
TH0 = 0x8C
TL0 = 0x8B
P2 = 0xff // 先关闭所有数码管
P0 = dis_buf[dis_index] // 显示代码传送到P0口
P2 = dis_digit
dis_digit = _crol_(dis_digit,2) // 位选通值左移, 下次中断时选通下一位数码管
delay(500)
dis_index++
dis_index &= 0x07 // 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)