日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【51单片机快速入门指南】2.2:任意位/任意长度数码管显示数字、小数

發布時間:2023/12/9 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【51单片机快速入门指南】2.2:任意位/任意长度数码管显示数字、小数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 源碼
    • Tube.c
    • Tube.h
    • main.c
  • 效果
    • 8位數碼管
      • 正整數
      • 負整數
      • 正小數
      • 負小數
    • 6位數碼管
      • 正整數
      • 負整數
      • 正小數
      • 負小數
    • 4位數碼管
      • 正整數
      • 負整數
      • 正小數
      • 負小數

普中51-單核-A2
STC89C52
Keil uVision V5.29.0.0
PK51 Prof.Developers Kit Version:9.60.0.0


源碼

移植時主要只修改Tube_Num數量、位選函數Tube_Choose()和單個數碼管寫入函數Singe_Tube_Write()即可。

數碼管基礎知識見【51單片機快速入門指南】2.1:數碼管顯示數字、小數 (科學計數法)
stdint.h內容見【51單片機快速入門指南】一、基礎知識和工程創建

Tube.c

#include <REGX52.H> #include "intrins.h" #include "stdint.h" #include "Tube.h"#define Tube_Port P0#define Tube_Num 8sbit Tube_A0 = P2^2; sbit Tube_A1 = P2^3; sbit Tube_A2 = P2^4;//位選 void Tube_Choose(uint8_t num) {Tube_A0 = (num & 1);Tube_A1 = (num & 2) >> 1;Tube_A2 = (num & 4) >> 2; }//顯示的延時 400us @11.0592MHz void LED_Tube_Delay() {unsigned char i;_nop_();i = 181;while (--i); }//單個數碼管寫入數據 void Singe_Tube_Write(uint8_t Data) {Tube_Port = Data; }code uint8_t Error_Codes[]= {Tube_Code_E,Tube_Code_r,Tube_Code_r,Tube_Code_o,Tube_Code_r };int32_t Pow10(int32_t Pow) {int32_t output = 1;while (Pow--)output *= 10;return output; }code uint8_t Tube_Codes_0ToF[] = {Tube_Code_0,Tube_Code_1,Tube_Code_2,Tube_Code_3,Tube_Code_4,Tube_Code_5,Tube_Code_6,Tube_Code_7,Tube_Code_8,Tube_Code_9,Tube_Code_A,Tube_Code_b,Tube_Code_C,Tube_Code_d,Tube_Code_E,Tube_Code_F };//顯示整數 void Display_Int(int32_t Num) {int8_t i = 0;uint8_t DisplayNum = 0;char Tube_Double_Buffer[Tube_Num] = {0};uint8_t Sign_Flag = 0;if(Num >= Pow10(Tube_Num) - 1 || Num <= -(Pow10(Tube_Num - 1) - 1)) {for(i = Tube_Num - 1; i >= 0; --i){Singe_Tube_Write(Tube_Code_NULL); //消隱Tube_Choose(i);if(Tube_Num - 1 - i < sizeof(Error_Codes))Singe_Tube_Write(Error_Codes[Tube_Num - 1 - i]); //顯示elseSinge_Tube_Write(Tube_Code_NULL);LED_Tube_Delay();}return;}else{if(Num < 0){Sign_Flag = 1;Num = -Num;}for(i = 0; i < Tube_Num; ++i){DisplayNum = Num % 10;if(Num == 0 && i != 0){if(Sign_Flag){Tube_Double_Buffer[i] = Tube_Code_Negative_Sign; //負號Sign_Flag = 0;}elseTube_Double_Buffer[i] = Tube_Code_NULL;}elseTube_Double_Buffer[i] = Tube_Codes_0ToF[DisplayNum];Num /= 10;}for(i = 0; i < Tube_Num; ++i){Singe_Tube_Write(Tube_Code_NULL); //消隱Tube_Choose(i);Singe_Tube_Write(Tube_Double_Buffer[i]); //顯示LED_Tube_Delay();}return;} }//顯示小數 void Display_Double(double Num) {int8_t i = 0;int8_t j = 0;uint8_t DisplayNum = 0;int32_t Int; int8_t Int_Flag;double Double;char Tube_Double_Buffer[Tube_Num] = {0};if(Num >= Pow10(Tube_Num) - 1 || Num <= -(Pow10(Tube_Num - 1) - 1)) {for(i = Tube_Num - 1; i >= 0; --i){Singe_Tube_Write(Tube_Code_NULL); //消隱Tube_Choose(i);if(Tube_Num - 1 - i < sizeof(Error_Codes))Singe_Tube_Write(Error_Codes[Tube_Num - 1 - i]); //顯示elseSinge_Tube_Write(Tube_Code_NULL);LED_Tube_Delay();}return;}else{if(Num < 0){Tube_Double_Buffer[Tube_Num - 1] = Tube_Code_Negative_Sign; //負號Num = -Num;}Int = (int32_t)Num;Double = Num - Int;for (j = 0; Int >= Pow10(j); ++j);for(i = Tube_Num - 1 - (Tube_Double_Buffer[Tube_Num - 1] == Tube_Code_Negative_Sign), Int_Flag = 1; i >= 0; --i){ if(Int_Flag)if(Int)for(; j; --j, --i){Tube_Double_Buffer[i] = Tube_Codes_0ToF[Int / Pow10(j - 1)];Int %= Pow10(j - 1);if (j == 1){--j;Tube_Double_Buffer[i--] |= Tube_Code_Dot;Int_Flag = 0;break;}}else{Tube_Double_Buffer[i--] = Tube_Codes_0ToF[0] | Tube_Code_Dot;Int_Flag = 0;}Double *= 10;Tube_Double_Buffer[i] = (uint8_t)(Double + (i == 0) * 0.5); //末位四舍五入Double -= (int)Tube_Double_Buffer[i];Tube_Double_Buffer[i] = Tube_Codes_0ToF[Tube_Double_Buffer[i]];}for(i = 0; i < Tube_Num; ++i){Singe_Tube_Write(Tube_Code_NULL); //消隱Tube_Choose(i);Singe_Tube_Write(Tube_Double_Buffer[i]); //顯示LED_Tube_Delay();}return;} }//顯示數字 void Display_Num(double Num) {if(Num == (int32_t)Num)Display_Int((int32_t)Num);elseDisplay_Double(Num);return; }

Tube.h

#ifndef TUBE_H_ #define TUBE_H_#define Tube_Code_NULL 0x00#define Tube_Code_0 0x3f #define Tube_Code_1 0x06 #define Tube_Code_2 0x5b #define Tube_Code_3 0x4f #define Tube_Code_4 0x66 #define Tube_Code_5 0x6d #define Tube_Code_6 0x7d #define Tube_Code_7 0x07 #define Tube_Code_8 0x7f #define Tube_Code_9 0x6f#define Tube_Code_A 0x77 #define Tube_Code_b 0x7c #define Tube_Code_C 0x39 #define Tube_Code_c 0x58 #define Tube_Code_d 0x5e #define Tube_Code_E 0x79 #define Tube_Code_F 0x71 #define Tube_Code_G 0x3d #define Tube_Code_H 0x76 #define Tube_Code_I 0x30 #define Tube_Code_i 0x10 #define Tube_Code_J 0x0e #define Tube_Code_K 0x7a #define Tube_Code_L 0x38 #define Tube_Code_M 0x55 #define Tube_Code_n 0x54 #define Tube_Code_o 0x5c #define Tube_Code_P 0x73 #define Tube_Code_q 0x67 #define Tube_Code_r 0x50 #define Tube_Code_S 0x64 #define Tube_Code_t 0x78 #define Tube_Code_U 0x3e #define Tube_Code_u 0x1c #define Tube_Code_v 0x62 #define Tube_Code_W 0x6a #define Tube_Code_X 0x36 #define Tube_Code_y 0x6e #define Tube_Code_Z 0x49#define Tube_Code_Dot 0x80 #define Tube_Code_Negative_Sign 0x40void Display_Int(int32_t Num); void Display_Double(double Num); void Display_Num(double Num);#endif

main.c

#include <REGX52.H> #include "intrins.h" #include "stdint.h" #include "Tube.h"void main(void) { while(1){Display_Num(-235);} }

效果

8位數碼管


#define Tube_Port P0#define Tube_Num 8sbit Tube_A0 = P2^2; sbit Tube_A1 = P2^3; sbit Tube_A2 = P2^4;//位選 void Tube_Choose(uint8_t num) {Tube_A0 = (num & 1);Tube_A1 = (num & 2) >> 1;Tube_A2 = (num & 4) >> 2; }//顯示的延時 400us @11.0592MHz void LED_Tube_Delay() {unsigned char i;_nop_();i = 181;while (--i); }//單個數碼管寫入數據 void Singe_Tube_Write(uint8_t Data) {Tube_Port = Data; }

正整數

while(1) {Display_Num(23333); }

負整數

while(1) {Display_Num(-123456); }

正小數

while(1) {Display_Num(1.23456); }

負小數

while(1) {Display_Num(-45.678987); }

6位數碼管


#define Tube_Port P0#define Tube_Num 6sbit SEG_DLE = P2^6; sbit SEG_WLE = P2^7;//位選 void Tube_Choose(uint8_t num) {SEG_DLE = 0;SEG_WLE = 1;Tube_Port = ~(0x20 >> num);SEG_WLE = 0; }//顯示的延時 400us @11.0592MHz void LED_Tube_Delay() {unsigned char i;_nop_();i = 181;while (--i); }void Singe_Tube_Write(uint8_t Data) {SEG_DLE = 1;SEG_WLE = 0;Tube_Port = Data;SEG_DLE = 0; }

正整數

while(1) {Display_Num(23333); }

負整數

while(1) {Display_Num(-12); }

正小數

while(1) {Display_Num(1.23456); }

負小數

while(1) {Display_Num(-45.678987); }

4位數碼管

#define Tube_Port P0#define Tube_Num 4sbit Tube_Y0 = P1^0; sbit Tube_Y1 = P1^1; sbit Tube_Y2 = P1^2; sbit Tube_Y3 = P1^3;//位選 void Tube_Choose(uint8_t num) {switch(num){case 0:Tube_Y0 = 1;Tube_Y1 = 0;Tube_Y2 = 0;Tube_Y3 = 0;break;case 1:Tube_Y0 = 0;Tube_Y1 = 1;Tube_Y2 = 0;Tube_Y3 = 0;break;case 2:Tube_Y0 = 0;Tube_Y1 = 0;Tube_Y2 = 1;Tube_Y3 = 0;break;case 3:Tube_Y0 = 0;Tube_Y1 = 0;Tube_Y2 = 0;Tube_Y3 = 1;break;} }//顯示的延時 1ms @12MHz void LED_Tube_Delay() {unsigned char i, j;i = 2;j = 239;do{while (--j);} while (--i); }void Singe_Tube_Write(uint8_t Data) {Tube_Port = Data; }

正整數

while(1) {Display_Num(233); }

負整數

while(1) {Display_Num(-12); }

正小數

while(1) {Display_Num(1.23456); }

負小數

while(1) {Display_Num(-45.678987); }

總結

以上是生活随笔為你收集整理的【51单片机快速入门指南】2.2:任意位/任意长度数码管显示数字、小数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。