两个显示的硬件是连接在一起的接对吗?
程序改对吗?
- /*------------------------------------------------------------------*/
- /* --- STC MCU International Limited -------------------------------*/
- /* --- STC 1T Series MCU RC Demo -----------------------------------*/
- /* If you want to use the program or the program referenced in the */
- /* article, please specify in which data and procedures from STC */
- /*------------------------------------------------------------------*/
- /*********************************************************/
- #define MAIN_Fosc 11059200L //定义主时钟
- #include "..\..\STC8Hxxx.h"
- /************* 功能说明 *************
- 同时驱动8段16个共阴数码管和8段16个共阳数码管自动扫描显示.
- P4.0~P4.7: 接SEG0~SEG7, 这8根SEG线跟LED连接要串联限流电阻(建议300欧姆以上).
- P0.0~P0.3: 接SEG8~SEG11, 这4根SEG线跟LED连接要串联限流电阻(建议300欧姆以上).
- P3.4~P3.7: 接SEG12~SEG15,这4根SEG线跟LED连接要串联限流电阻(建议300欧姆以上).
- P2.0~P2.7: 接COM0~COM7
- P4.0 P4.1 P4.2 P4.3 P4.4 P4.5 P4.6 P4.7 P0.0 P0.1 P0.2 P0.3 P3.4 P3.5 P3.6 P3.7
- SEG0 SEG1 SEG2 SEG3 SEG4 SEG5 SEG6 SEG7 SEG8 SEG9 SEG10 SEG11 SEG12 SEG13 SEG14 SEG15
- A B C D E F G H A B C D E F G H
- P2.0-COM0
- P21.-COM1
- P22.-COM2
- P23.-COM3
- P24.-COM4
- P25.-COM5
- P26.-COM6
- P27.-COM7
- ******************************************/
- /************* 本地常量声明 **************/
- /************* 本地变量声明 **************/
- /************* 本地函数声明 **************/
- void delay_ms(u8 ms);
- /**************** 外部函数声明和外部变量声明 *****************/
- u8 code T_LED_CODE[]={ //标准字库
- //代码 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B 0x0C 0x0D 0x0E 0x0F
- //显示字符 0 1 2 3 4 5 6 7 8 9 A B C D E F
- 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
- //代码 0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1A 0x1B 0x1C 0x1D 0x1E 0x1F
- //显示字符 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 空
- 0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x00};
-
- //共阴数码管字库导入, i为LED位置0~15, dis为要显示的代码 0~9, A~F, 1.~9., 空
- void LoadLED_A(u8 i, u8 dis)
- {
- u8 xdata *px;
-
- px = &COM0_DCL + 15 - i; //PCB布局低位数码管在右边, 所以用(15-i)反一下
- *px = T_LED_CODE[dis & 0x0f];
- }
- //共阳数码管字库导入, i为LED位置0~15, dis为要显示的代码 0~9, A~F, 1.~9., 空
- void LoadLED_B(u8 i, u8 dis)
- {
- u8 xdata *px;
-
- px = &COM0_DAL + 15 - i; //PCB布局低位数码管在右边, 所以用(15-i)反一下
- *px = T_LED_CODE[dis & 0x0f];
- }
- /**********************************************/
- void main(void)
- {
- u8 i;
- P_SW2 |= 0x80; //允许访问XSFR(扩展特殊功能寄存器)
- // XOSCCR = 0xc0; //启动外部晶振
- // while (!(XOSCCR & 1)); //等待时钟稳定
- // CLKDIV = 0x00; //时钟不分频
- // CKSEL = 0x01; //选择外部晶振
- P2n_push_pull(0xff); //COM0~COM7线设置为推挽输出
- P4n_push_pull(0xff); //SEG0~SEG7(P4.0~P4.7)线设置为推挽输出
- P0n_push_pull(0x0f); //SEG8~SEG11(P0.0~P0.3)线设置为推挽输出
- P3n_push_pull(0xf0); //SEG12~SEG15(P3.4~P3.7)线设置为推挽输出
- P2DR = 0x00; //COM0~COM7线设置为强电流驱动
- P4DR = 0x00; //SEG0~SEG7线设置为强电流驱动
- P0DR = 0xf0; //SEG8~SEG11线设置为强电流驱动
- P3DR = 0x0f; //SEG12~SEG15线设置为强电流驱动
- COMEN = 0xff; //允许8个COM
- SEGENL = 0xff; //允许8个SEG 低字节
- SEGENH = 0xff; //允许8个SEG 高字节
- LEDCTRL = 0x80 + (2<<4) + 0; //B7=1: ON, B5 B4: 0共阴, 1共阳, 2共阴共阳, 3保留, B2 B1 B0: 0占空比100%, 1~7占空比7/8~1/8
- LEDCKS = 4; //数码管COM扫描显示的主频时钟数 = 160*9*LEDCKS, 每个COM显示时间=1440*LEDCKS/fosc(MHz) us, COM扫描频率=fosc/(1440*LEDCKS *COM数).
- //例如 fosc = 11.0592MHz, 共阴共阳一共16个COM, LEDCKS = 4, 则每个COM显示时间=1440*4/11.0592 = 521 us, COM扫描频率=11059200/(1440*4*16)=120Hz.
- //已知扫描时间t(us)计算 LEDCKS = t*fosc(MHz)/1440, 比如fosc = 24MHz, 要求1个COM扫描1ms, 则 LEDCKS = 1000*24/1440 = 16.7, 取整数17.
- for(i=0; i<16; i++) LoadLED_A(i,i); //共阴,显示0123456789ABCDEF
- for(i=0; i<16; i++) LoadLED_B(i,15-i); //共阳,显示FEDCBA9876543210
-
-
- while (1)
- {
- //刷新COM0_DCL~COM7_DCL, COM0_DCH~COM7_DCH,即可刷新共阴显示内容.
- //刷新COM0_DAL~COM0_DAL, COM0_DAH~COM0_DAH,即可刷新共阳显示内容.
-
- }
- }
- /**********************************************/
-
复制代码
|