例程如下
/*******************************************************
程序功能:数码管显示
开发环境:Keil3
硬件环境:CEPARK多功能底板,STC12C5A60S2,12M晶振
实验现象:在数码管上显示12345678
作者:youyou
时间:2012.11.30
*******************************************************/
#include "STC12C5A60S2.h"
sbit SEG_DS = P2^0;//74HC595芯片的数据引脚
sbit SEG_SHCP = P2^1;//74HC595芯片的控制引脚,上升沿移入数据
sbit SEG_STCP = P2^2;//74HC595芯片的控制引脚,上升沿更新数据
void DisplayOneCharOnAddr(unsigned char Data,unsigned char Addr);
unsigned char code Seg_Data[]={ //共阳数码管的编码,并将数据定义在CODE区
0xc0,/*0*/
0xF9,/*1*/
0xA4,/*2*/
0xB0,/*3*/
0x99,/*4*/
0x92,/*5*/
0x82,/*6*/
0xF8,/*7*/
0x80,/*8*/
0x90,/*9*/
0x88,/*A*/
0x83,/*b*/
0xC6,/*C*/
0xA1,/*d*/
0x86,/*E*/
0x8E,/*F*/
0xFF
};
unsigned char code Seg_Addr[]={
0x01,
0x02,
0x04,
0x08,
0x10,
0x20,
0x40,
0x80,
0xFF,//ALL ON
0x00 //OFF
};
void SEG_Send595OneByte(unsigned char ucData); //向74HC595写入一个8位的数据
void Delay_us(unsigned int uiUs);//us延时函数,12MHZ晶振有效
void Delay_ms(unsigned int uiMs);//ms延时函数,12MHZ晶振有效
void Delay(unsigned int m);
void main(void)
{
P1=0xFF;
while(1)
{
DisplayOneCharOnAddr(0,0);
DisplayOneCharOnAddr(16,9);//先关闭数码管,然后再显示下一位数码管
DisplayOneCharOnAddr(1,1);
DisplayOneCharOnAddr(16,9);
DisplayOneCharOnAddr(2,2);
DisplayOneCharOnAddr(16,9);
DisplayOneCharOnAddr(3,3);
DisplayOneCharOnAddr(16,9);
DisplayOneCharOnAddr(4,4);
DisplayOneCharOnAddr(16,9);
DisplayOneCharOnAddr(5,5);
DisplayOneCharOnAddr(16,9);
DisplayOneCharOnAddr(6,6);
DisplayOneCharOnAddr(16,9);
DisplayOneCharOnAddr(7,7);
DisplayOneCharOnAddr(16,9);
}
}
//向HC595发送一个字节
void SEG_Send595OneByte(unsigned char ucData)
{
unsigned char i;
for(i = 0;i < 8;i++) //8位数据依次写入,先写最低位
{
SEG_DS = (ucData & 0x80);//先读入高位 x&0x80;
SEG_SHCP = 0;
SEG_SHCP = 1;
SEG_SHCP = 0; //SHCP引脚的上升沿移入数据
ucData <<=1; //数据左移
}
}
//延时函数
void Delay(unsigned int m)
{
while(m--);
}
//在指定位置显示一个数据
void DisplayOneCharOnAddr(unsigned char Data,unsigned char Addr)
{
SEG_Send595OneByte(Seg_Addr[Addr]); //显示在哪一个数码管上
SEG_Send595OneByte( Seg_Data[Data]); //显示的数据
SEG_STCP = 0;
SEG_STCP = 1; //STCP引脚的上升沿更新数据
SEG_STCP = 0;
}
void Delay_ms(unsigned int uiMs)//ms延时函数
{
unsigned int i;
for(;uiMs > 0;uiMs--)
{
for(i = 1498;i > 0;i--);
}
}