历史上的今天
今天是:2025年12月26日(星期五)
2022年12月26日 | 串行7段LED显示应用程序
2022-12-26 来源:zhihu
#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< 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); }
下一篇:RC500读卡单片机源程序
史海拾趣
|
【连载】【ALIENTEK MiniSTM32 开发板】STM32不完全手册--跑马灯实验(实验一) ALIENTEK开发板购买地址:http://shop62103354.taobao.com/ [ 本帖最后由 正点原子 于 2010-8-30 09:31 编辑 ]… 查看全部问答> |
|
这是好东西啊 真的 用的时候 才会知道其重要性 第一次驱动飞思卡尔四驱赛车时,用三极管搭成的H桥,屡用屡烧,起初根本就没有想到四驱赛车工作时的功率有多大, 因为之前的普通二驱车运行电流就几百毫安,用一个简单的H桥就能很好驱动。后来实在 ...… 查看全部问答> |
|
相信大家基本都做过串口通讯的问题了吧,恩,我也做过了,感觉也还可以。。 不过今天想通过串口发送文件(电脑—开发板—电脑) 刚开始我就写了一个几个汉字的文本文档,理所当然,也能接收到其中的汉字  ...… 查看全部问答> |
|
最近在用matlab调试dsp2812,但是使用一些函数的时候matlab经常返回错误信息,比如:OPEN does not support opening a text file; CREATEOBJ, which enables the Data Manipulation and Function Call features, has been removed.但是我在matlab的 ...… 查看全部问答> |




