本帖最后由 chun1234 于 2024-7-26 08:06 编辑
学习冲哥的《STC32G单片机视频教程》 第九课 数码管的静态使用
一、认识数码管: 按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管,尾缀A表示共阳,K表示共阴。 二、控制原理: STC32G开发板使用的是共阳型四位数码管。若以一位的7段数码管为例,一位的数码管加上小数点一共是8个需要控制的发光管,分别是a、b、c、d、e、f、g、dp,由8个引脚分别控制他们的亮灭,也就是说一个引脚控制一个发光管,那么这就是段选。发光的二极管是有两端的,那么这8个发光的二极管有一个公共端,这样就可以控制一位数码管整体,这就是段选。
由一位数码管延伸到四位数码管时,如图所示,每一个发光管都有相应的引脚控制,每一位的数码管都有自己的公共端,通过公共端来控制哪一位的数码管亮或者是灭,这就是位选。
图9-1
单片机的P6.0~P6.6引脚分别接到数码管的a~g引脚,就可以通过控制P6各引脚电平的高低来控制数码管七段LED的亮灭;单片机的P7.0~P7.7分别通过8支PNP型三极管,驱动8个数码管的公共端com0~com7,也就是位选端,来控制8位数码管的亮灭。
三、数码管实现0-9的显示 1.用数组定义0-9的内码 2.尝试用延时实现0-9的循环显示 3.用按键控制数字的加或者减。
#include "COMM/stc.h" //调用头文件 #include "COMM/usb.h" #define KEY1 P32 //定义一个按键 引脚选择P32 #define KEY2 P33 //定义一个按键 引脚选择P33 #define BEEP P54 //定义一个按键 引脚选择P54 #define MAIN_Fosc 24000000UL //定义主时钟 char *USER_DEVICEDESC = NULL; char *USER_PRODUCTDESC = NULL; char *USER_STCISPCMD = "@STCISP#"; u8 SEG_Tab[10] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 }; //0-9 /* 数组内16进制与2进制与实际显示数字对照: 0xc0 1100 0000 ---> 0 0xf9 1111 1001 ---> 1 0xa4 1010 0100 ---> 2 0xb0 1011 0000 ---> 3 0x99 1001 1001 ---> 4 0x92 1001 0010 ---> 5 0x82 1000 0010 ---> 6 0xf8 1111 1000 ---> 7 0x80 1000 0000 ---> 8 0x90 1001 0000 ---> 9 */ void sys_init(); //函数声明 void delay_ms(u16 ms); //unsigned int void main() //程序开始运行的入口 { u8 num = 0; sys_init(); //USB功能+IO口初始化 usb_init(); //usb库初始化 EA = 1; //CPU开放中断,打开总中断。 while(1) //死循环 { if( DeviceState != DEVSTATE_CONFIGURED ) continue; if( bUsbOutReady ) { usb_OUT_done(); } P70 = 0; //开启数码管 //------P32按下一次,数码管显示数字加1;P33按下一次,数码管数字减1 ----- P6 = SEG_Tab[num]; //这个数码管输出段码 if( KEY1 ==0 ) { delay_ms(10); if( KEY1 ==0 ) { BEEP = 0; delay_ms(10); BEEP = 1; while( KEY1 ==0 ); if( num<9 ) { num++; } } } if( KEY2 ==0 ) { delay_ms(10); if( KEY2 ==0 ) { BEEP = 0; delay_ms(10); BEEP = 1; while( KEY2 ==0 ); if( num>0 ) num--; } } } } void sys_init() //函数定义 { WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快 EAXFR = 1; //扩展寄存器(XFR)访问使能 CKCON = 0; //提高访问XRAM速度 P0M1 = 0x00; P0M0 = 0x00; //设置为准双向口 P1M1 = 0x00; P1M0 = 0x00; //设置为准双向口 P2M1 = 0x00; P2M0 = 0x00; //设置为准双向口 P3M1 = 0x00; P3M0 = 0x00; //设置为准双向口 P4M1 = 0x00; P4M0 = 0x00; //设置为准双向口 P5M1 = 0x00; P5M0 = 0x00; //设置为准双向口 P6M1 = 0x00; P6M0 = 0x00; //设置为准双向口 P7M1 = 0x00; P7M0 = 0x00; //设置为准双向口 P3M0 = 0x00; P3M1 = 0x00; P3M0 &= ~0x03; P3M1 |= 0x03; //设置USB使用的时钟源 IRC48MCR = 0x80; //使能内部48M高速IRC while (!(IRC48MCR & 0x01)); //等待时钟稳定 USBCLK = 0x00; //使用CDC功能需要使用这两行,HID功能禁用这两行。 USBCON = 0x90; } void delay_ms(u16 ms) //unsigned int { u16 i; do { i = MAIN_Fosc/6000; while(--i); }while(--ms); }
|