- /***********74HC595动态扫描6位数码管************/
- //MCU:AT89S52RC
- //晶振:11.0592M.
- //采用6位数码管
- /***************************************************/
- #include<reg51.h>
- #include <INTRINS.H>
- #define uint unsigned int
- #define uchar unsigned char
- #define nop() _nop_();_nop_();
- sbit CLK=P2^0; //74HC595的11引脚
- sbit DAT=P2^1; //74HC595的14引脚
- sbit RCLK=P2^2; //74HC595的12引脚
- sbit CS1=P2^3; //数码管段位COM1(公共端)即数码管的1脚
- sbit CS2=P2^4; //数码管段位COM2(公共端)即数码管的2脚
- sbit CS3=P2^5; //数码管段位COM3(公共端)即数码管的3脚
- sbit CS4=P2^6; //数码管段位COM4(公共端)即数码管的4脚
- sbit CS5=P2^7; //数码管段位COM5(公共端)即数码管的5脚
- sbit CS6=P0^7; //数码管段位COM6(公共端)即数码管的6脚
- //本程序支持6位共阳和共阴数码管(包插六位时钟)可根据你的数码管是共阴还是共阳,开启下面匹配的tab[]
- // 0 1 2 3 4 5 6 7 8 9 A B C D E F 全亮 全灭
- //uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00,0xff}; //共阳数码管 不显示0xff 全亮0x00 只显示点0x7f
- uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0xff,0x00}; //共阴数码管 不显示0x00 全亮0xff 只显示点0x80
- uchar t;
- uchar count = 0;
- /* //延时函数
- void delay(uchar z)
- {
- uchar x,y;
- for(x=z;x>0;x--)
- for(y=120;y>0;y--);
- }
- */
- //写数码管函数
- void write595(unsigned char word,uchar k1)
- {
- uchar num,c; //变量
- if(k1==1){ //如果k1的值为1,则点亮时钟数码管的:点(如果是普通的四位数码管,则点亮第二位的小数点)
- num=tab[word]|0x80; //关键就在|0x80
- } else {
- num=tab[word];
- }
- //循环8个LED
- for(c=0;c<8;c++)
- {
- CLK=0;
- DAT=num&0x80;
- num=num<<1;
- CLK=1;
- }
- RCLK=0;
- //nop();
- //nop();
- RCLK=1;
- }
- void select1(void)
- { //第一位数码管
- CS1=0;CS2=1;CS3=1;CS4=1;CS5=1;CS6=1;
- }
- void select2(void)
- { //第二位数码管
- CS1=1;CS2=0;CS3=1;CS4=1;CS5=1;CS6=1;
- }
- void select3(void)
- { //第三位数码管
- CS1=1;CS2=1;CS3=0;CS4=1;CS5=1;CS6=1;
- }
- void select4(void)
- { //第四位数码管
- CS1=1;CS2=1;CS3=1;CS4=0;CS5=1;CS6=1;
- }
- void select5(void)
- { //第五位数码管
- CS1=1;CS2=1;CS3=1;CS4=1;CS5=0;CS6=1;
- }
- void select6(void)
- { //第六位数码管
- CS1=1;CS2=1;CS3=1;CS4=1;CS5=1;CS6=0;
- }
- void init() //启动定时器
- {
- TMOD=0X01;
- TH0=(65535-46080)/256;
- TL0=(65535-46080)%256;
- ET0=1;
- EA=1;
- TR0=1;
- }
- void T0_time() interrupt 1 //定时器
- {
- if (count == 20) {
- t++;
- count = 0;
- } else {
- ++count;
- }
- }
- int main(void) //主程序
- {
- uchar i;
- init(); //启动定时器
- while(1)
- { //无限循环
- if(t>5) {t=0;} //当t>5,则初始为0
- write595(2,0); //要写的值
- select1(); //显示第一位数码管
- for(i=0;i<10;i++) _nop_();
- write595(3,1); //要写的值
- select2(); //显示第二位数码管
- for(i=0;i<10;i++) _nop_();
- write595(5,0); //要写的值
- select3(); //显示第三位数码管
- for(i=0;i<10;i++) _nop_();
- write595(6,1); //要写的值
- select4(); //显示第四位数码管
- for(i=0;i<10;i++) _nop_();
- write595(5,0); //要写的值
- select5(); //显示第五位数码管
- for(i=0;i<10;i++) _nop_();
- write595(t,0); //要写的值
- select6(); //显示第六位数码管
- for(i=0;i<10;i++) _nop_();
- }
- }
复制代码 |