188数码管驱动程序(简洁)
2021/10/11 17:44:51
本文主要是介绍188数码管驱动程序(简洁),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
以下是厂家提供的188数码管的电路原理图
在Excel上画出管脚与段码之间的关系,横向高电平,竖向低电平,例如,B3表示DIG3(个位)的B段,点亮的条件是:P2为高电平,P1为低电平。
数码管显示思路:188总共有16个段码,用u16 类型变量(display_sram)的16个bit表示16个段码的状态(1亮0灭)
在5ms的定时器中断,逐个IO口扫描,并且循环扫描,点亮段码.
1,Pin1=0;读取display_sram的bit15~bit12位,如图中的B3 D3 F3 G3,如果B3为1,则Pin2=1,点亮B3。
2,Pin2=0;读取display_sram的bit11~bit8位, 如图中的A3 B2 D2 E2,如果B2为1,则Pin3=1,点亮B2。
3,Pin3=0;读取display_sram的bit7~bit4位, 如图中的C3 A2 C2 F2,如果C3为1,则Pin1=1,点亮C3。
4,Pin4=0;读取display_sram的bit3~bit0位, 如图中的E3 C1 B1 G2,如果B1为1,则Pin3=1,点亮B1。
把段码,数字和display_sram对应起来,形成下列表格:
例如数码管的个位要显示数字 '0',需要点亮 DIG3的B D F A C E六段,即B3 D3 F3 A3 C3 E3为1,其他段码为0,对应的Hex值为0xE888
代码:
#define PIN1_IN() TRISA2=1;//把单片机IO口配置为输入模式 #define PIN2_IN() TRISA3=1; #define PIN3_IN() TRISA4=1; #define PIN4_IN() TRISA5=1; #define PIN5_IN() TRISB0=1; #define PIN1_L() TRISA2=0;PA2=0;//把单片机IO口配置为输出模式,输出低电平 #define PIN2_L() TRISA3=0;PA3=0; #define PIN3_L() TRISA4=0;PA4=0; #define PIN4_L() TRISA5=0;PA5=0; #define PIN5_L() TRISB0=0;PB0=0; #define PIN1_H() TRISA2=0;PA2=1;//把单片机IO口配置为输出模式,输出高电平 #define PIN2_H() TRISA3=0;PA3=1; #define PIN3_H() TRISA4=0;PA4=1; #define PIN4_H() TRISA5=0;PA5=1; #define PIN5_H() TRISB0=0;PB0=1; /************************************************************************************/ void LED_GPIO_Init(void)//初始化IO口 { WPUA2=0;//关闭IO口的上拉电阻 WPUA3=0; WPUA4=0; WPUA5=0; WPUB0=0; PIN1_IN();//把单片机IO口配置为输入模式 PIN2_IN(); PIN3_IN(); PIN4_IN(); PIN5_L(); } /********************************熄灭所有数码管***********************************/ void Set_AllPin_INPUT(void) { PIN1_IN(); PIN2_IN(); PIN3_IN(); PIN4_IN(); PIN5_IN(); } //在main函数中,改变下列三个变量可以改变数码管的显示内容,当前是显示124。 u8 bai=1,shi=2,ge=4;//百位,十位,个位, u16 display_sram=0; u16 Segment[3][11]={ {0x0000,0x0006,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000},//百位 {0x0770,0x0420,0x0741,0x0661,0x0431,0x0271,0x0371,0x0460,0x0771,0x0671,0x0000},//十位 {0xE888,0x8080,0xD808,0xD880,0xB080,0x7880,0x7888,0x8880,0xF888,0xF880,0x0000} //个位 }; void Display_Scan1(void) { PIN1_L();//拉低Pin1 if(display_sram&0x8000) PIN2_H(); if(display_sram&0x4000) PIN3_H(); if(display_sram&0x2000) PIN4_H(); if(display_sram&0x1000) PIN5_H(); } void Display_Scan2(void) { PIN2_L(); if(display_sram&0x0800) PIN1_H(); if(display_sram&0x0400) PIN3_H(); if(display_sram&0x0200) PIN4_H(); if(display_sram&0x0100) PIN5_H(); } void Display_Scan3(void) { PIN3_L(); if(display_sram&0x0080) PIN1_H(); if(display_sram&0x0040) PIN2_H(); if(display_sram&0x0020) PIN4_H(); if(display_sram&0x0010) PIN5_H(); } void Display_Scan4(void) { PIN4_L(); if(display_sram&0x0008) PIN1_H(); if(display_sram&0x0004) PIN2_H(); if(display_sram&0x0002) PIN3_H(); if(display_sram&0x0001) PIN5_H(); } /****************************显示函数***********************************/ //放在定时器中断函数,5ms运行一次,扫描一轮需要4*5ms=20ms, //也就是50Hz的刷新频率,如果感觉闪烁,可以4ms运行。 void Display_tube(void) { static u8 case_cnt;//逐行扫描 Set_AllPin_INPUT();//消影作用 display_sram=0; display_sram=Segment[0][bai] | Segment[1][shi] | Segment[2][ge];//显示百位,十位,个位 switch(case_cnt) { case 0x00:Display_Scan1();case_cnt++;break; case 0x01:Display_Scan2();case_cnt++;break; case 0x02:Display_Scan3();case_cnt++;break; case 0x03:Display_Scan4();case_cnt=0;break; default:case_cnt=0;break; } }
这篇关于188数码管驱动程序(简洁)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-25Java创意资料:新手入门的创意学习指南
- 2024-11-25JAVA对接阿里云智能语音服务资料详解:新手入门指南
- 2024-11-25Java对接阿里云智能语音服务资料详解
- 2024-11-25Java对接阿里云智能语音服务资料详解
- 2024-11-25JAVA副业资料:新手入门及初级提升指南
- 2024-11-25Java副业资料:入门到实践的全面指南
- 2024-11-25Springboot应用的多环境打包项目实战
- 2024-11-25SpringBoot应用的生产发布项目实战入门教程
- 2024-11-25Viite多环境配置项目实战:新手入门教程
- 2024-11-25Vite多环境配置项目实战入门教程