|
用CD4094来驱动数码管可以解放更多的I/O口,同时也能提高数码管的驱动电流。只需要三个I/O就能驱动多位数码管。
我这里用的是四位数码管,里面包含了共阴极数码管的驱动和共阳极数码管的驱动,让初学者更容易上手。
下图所示的是共阴极的四位数码管
- #include<reg51.h>
- sbit KEY = P3^2; // 定义按键使用的 I/O 口 P3.2
- sbit STR4094=P1^0; //锁存器移位使能端,H 使能
- sbit D4094=P1^1; //串行数据输出端,H 使能
- sbit CLK4094=P1^2; //串行时钟输出端,H 使能输出状态使能端,H 使能
- //sbit E4094=P1^3; //输出状态使能端,H 使能,直接接高电平
- #define HOWMANY4094 2 //定义 4094 个数
- unsigned char bdata P4,P5;//定义模拟 I/O 口 P4, P5 口
- //unsigned char code TABLE[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF};
- unsigned char code TABLE[] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
- //数字显示编码表: 0 1 2 3 4 5 6 7 8 9 A b C d E F 空
- //当 P4 输出相应的数值时,数码管就会按照上面的数字进行显示。例如:P4=0xB0,数码管就显示"3"
- //以上编码可以使用附赠目录下的 数码管段位计算小程序计算。方便又快捷。
- void update4094()
- {
- unsigned char i,j,tt;
- STR4094=0;
- for (j=HOWMANY4094;j>0;j--)
- {
- tt=*(&P4+j-1);
- for(i=0;i<8;i++)
- {
- D4094=(tt&0x80)>0;//数据脚
- CLK4094=0;
- CLK4094=1;
- tt<<=1;
- }
- }
- STR4094=1;
- }
- void delay_ms(unsigned short ms)
- {
- unsigned short i;
- unsigned char j;
- for(i=0;i<ms;i++)
- {
- for(j=0;j<200;j++);
- for(j=0;j<102;j++);
- } //for(i=0;i<ms;i++)
- }
- /*
- void delay_us(unsigned short us)
- {
- while(us--);
- }
- */
- void disp(unsigned char *p) //数码管按位显示函数,
- {
- unsigned char i,x=1;
- for(i=0;i<4;i++)
- {
- P5=~x; //选择一位数码管
- P4=TABLE[p[i]]; //查表显示一个数字。
- update4094(); //显示数字。
- delay_ms(5);
- x<<=1; //数码管选择位左移 1 位
- }
- }
- //将一个短整型数,个,十,百,千位分别填入一个 4 位数组,用于数码管显示
- void deal_value(unsigned short input,unsigned char *p) //数据处理函数
- {
- //unsigned short kk;
- unsigned char ge,shi,bai,qian; //定义输入的整型变量的个,十,百,千位 数值
- qian= input%10000/1000;
- bai = input%1000/100;
- shi = input%100/10;
- ge = input%10;
-
- p[0]=qian; //千位
- p[1]=bai; //百位
- p[2]=shi; //十位
- p[3]=ge; //个位
- }
- void main(void)
- {
- unsigned short kk=0; //声明一个短整型变量,作为数码管显示的数字
- unsigned char dis_buff[4];
- unsigned char i;
- bit last_key,this_key;
- while(1)
- {
- if(++i>=50) //循环增加 50 次,大约 1 秒钟
- {
- i=0;
- kk++; //大约 1 秒钟时,显示值增加 1。
- if(kk>9999) kk=0;
- deal_value(kk,&dis_buff); //将 kk 值分解为个位,十位,百位,千位,装入缓冲区
- }
- disp(dis_buff); //用数码管显示 kk 每一个显示过程大概 20ms
- last_key=this_key;
- this_key=KEY;
- if((last_key==1)&&(this_key==0)) //如果按键被按下,从 0 开始重新显示
- {
- kk=0;
- deal_value(kk,&dis_buff); //将 kk 值分解为个位,十位,百位,千位,装入缓冲区
- }
- }
- }
复制代码
打开的keil的时候如果提示你sub4094.C什么什么的话请忽略,或是自己在重新建立一个工程,将我的程序复制进去。解释一下为什么会出现这个问题,是因为我的程序根目录下有一个sub4094.c的文件,但是主函数中没有调用,keil提示未启用,所以请个位放心。
写这个程序的时候本想是分段展开的,结果后来都汇总到一个.C里了,所以就多了那么一个文件。
|
评分
-
查看全部评分
|