#include
#include
void LedScan();
/******************************
* 常量定义
*****************************/
#define OSC_FREQ 40000 /* OSC frequncy in 200Hz for 8.0Mhz*/
#define TIMER0_CNTR(OSC_FREQ/6)/*OSC/12/[10000h-CNT]=FREQ=100Hz*/
#define LED_DISP_RATIO3//Display time space ratio in 1/10
/*(the up-limit of LED_DISP_RATIO is 65535/TIMER0_CNTR,for 11.0592M,4M,1.709M are 7,19,46)*/
#define TIMER0_CNTSR(LED_DISP_RATIO*TIMER0_CNTR/30)
#defineTIMER0_CNTLRTIMER0_CNTR-(TIMER0_CNTSR*3)
#defineTIMER0_CNTS(65535-TIMER0_CNTSR)
#defineTIMER0_CNTL(65535-TIMER0_CNTLR)
/******************************
* 控制线定义
*****************************/
/*
#defineLedDispOffP0.0//LED segment clear control line(low active)置零后LED所有段都清除
#defineLedDispDataP0.1//LED shift out data单个LED要显示的数
#defineLedDispClkCsP0.2//LED chip select latch clock LED芯片选择
#defineLedDispClkDataP0.3//LED segment latch clockLED的数据位锁存时钟
*/
sbit LedDispOff = P0^0;
sbit LedDispData = P0^1;
sbit LedDispClkCs = P0^2;
sbit LedDispClkData = P0^3;
/*
#defineLedDispOffP00//LED segment clear control line(low active)置零后LED所有段都清除
#defineLedDispDataP01//LED shift out data单个LED要显示的数
#defineLedDispClkCsP02//LED chip select latch clock LED芯片选择
#defineLedDispClkDataP03//LED segment latch clockLED的数据位锁存时钟
*/
/******************************
* 变量定义
*****************************/
unsigned char CntScanLed=0;//current scaned LED No.(初始值为0)
unsigned char CntDispByte=0;//current scaned LED BYTE(当前数码管显示字节值)
/******************************
* 只要将LedSeg0-LedSeg5设置为特定的7段码,系统就会完成各LED显示的扫描
*****************************/
/*
unsigned char LedSeg0;//第一个LED段码
unsigned char LedSeg1;//第二个LED段码
unsigned char LedSeg2;//第三个LED段码(add a byte for LedScan match the last three LED)
unsigned char LedSeg3;//第四个LED段码
unsigned char LedSeg4;//第五个LED段码
unsigned char LedSeg5;//第六个LED段码
*/
unsigned char LedSeg[6]={0,0,0,0,0,0};//LED段码
//#define LedIndex(NO) (LedSeg##NO)
//#define KeyOn(key) (SwStatus[B##key] & A##key)
unsigned char Led_transfer_table[10]={0XC0,0XF9,0XA4,0XB0,0X99,
0X92,0X82,0XF8,0X80,0X90};
//0~9对应的数码管显示查找表
/******************************
* TIMER0 initialization
* Set the TIMER0 mode 0 and enable T0 INT
*****************************/
void TimerInit()
{
CKCON=0x00;//Clock Control Register(use 12T for Timer OSC source)
TMOD=0x20;/* 定时器0工作在方式0 */
TH0=TIMER0_CNTS>>8;/* 写入计数初值到TH0 */
TL0=TIMER0_CNTS&0x00ff;/* 写入计数初值到TL0 */
ET0=1;/* 定时器0中断允许*/
TF0=0;/* 定时器0中断标志位清0 */
TR0=1;/* 定时器0准备开始 */
EA=1;/* 全局中断允许 */
}
/******************************
* Timer0 中断服务程序
* 本程序主间隔为10ms,每一个10ms又分为三个子间隔,每一个子间隔完成
* 一个7段LED的数据输出,两个主间隔完成6个LED的数据输出。
*****************************/
void Timer0_Overflow() interrupt 1 using 0
{
TR0=0;
TH0=TIMER0_CNTS>>8;/* 写入计数初值到TH0 */
TL0=TIMER0_CNTS&0x00ff;/* 写入计数初值到TL0 */
LedDispOff=0;
LedScan();
TR0=1;
}
/******************************
* Scan the LED display
*Send the Display scan code to current LED and feed CntLedScan to next one
*****************************/
void LedScan()
{
unsigned char ucCounter=0;
LedDispOff=0;//关闭数码管的7段输出
LedDispData=0;
LedDispClkCs=1;
LedDispClkCs=0;
CntDispByte=Led_transfer_table[LedSeg[CntScanLed]];
LedDispOff=1;//启动数码管段输出
for(ucCounter=0;ucCounter<=7;ucCounter++)
{if(1==CntDispByte&(1<LedDispData=1;
else LedDispData=0;
LedDispClkData=1;
LedDispClkData=0;
}
CntScanLed++;
if(CntScanLed>5)
CntScanLed=0;
}
main()
{
int i;
TimerInit();
for(i=0;i<6;i++)
{LedSeg[i]=i;//初始化显示数据
}
while(1);
}