單片機IO口無序直驅LED數碼管程序分享.jpg (82.64 KB, 下載次數: 0)
下載附件
2025-1-18 15:08 上傳
- /**本程序用于測試分散I/O口驅動4位數碼管顯示**/
- #include <STC12C5A60S2.h>
- #include <intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- //----I/O口位功能定義-----------------------------------
- sbit da=P1^2;
- sbit db=P1^1;
- sbit dc=P0^1;
- sbit dd=P0^2;
- sbit de=P0^3;
- sbit df=P1^3;
- sbit dg=P1^4;
- sbit dp=P0^0;
- sbit w1=P0^4;
- sbit w2=P0^5;
- sbit w3=P0^6;
- sbit w4=P0^7;
- //不含小數點8段LED字形碼0-9+黑屏碼、共陽極驅動0亮1熄
- uchar duan_ma[11]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
- uchar wei_ma[4]= {0x07,0x0b,0x0d,0x0e}; //字位碼
- uchar date[4];//顯示數據暫存
- //====熄屏延時a*1ms延時函數===============================
- void delay_1ms (uchar a) //@12.000MHz
- {
- uchar i, j;
- while(a--)
- {
- _nop_();
- _nop_();
- i = 12;
- j = 168;
- do
- {
- while (--j);
- }
- while (--i);
- }
- }
- //====顯示顏色a*10us=====================================
- void delay_10us(uchar a) //@12.000MHz
- {
- uchar i;
- while(a--)
- {
- i = 27;
- while (--i);
- }
- }
- //=======================================================
- //將LED字形的8個筆段控制I/O引腳映射到變量的8個位上
- void segment_out(uchar dat)
- {
- da=(bit)(dat&0x01);
- db=(bit)(dat&0x02);
- dc=(bit)(dat&0x04);
- dd=(bit)(dat&0x08);
- de=(bit)(dat&0x10);
- df=(bit)(dat&0x20);
- dg=(bit)(dat&0x40);
- dp=(bit)(dat&0x80);
- }
- //=======================================================
- //將4個數位控制I/O引腳映射到變量的4個位上
- void position_out(uchar dat)
- {
- w1=(bit)(dat&0x08);
- w2=(bit)(dat&0x04);
- w3=(bit)(dat&0x02);
- w4=(bit)(dat&0x01);
- }
- //====數據拆分函數=======================================
- //提取出數據的千、百、十、個位的數值存入數組中
- void digits_obtain(uint dat)
- {
- date[0]=dat/1000;
- date[1]=dat%1000/100;
- date[2]=dat%100/10;
- date[3]=dat%10;
- }
- //====顯示輸出函數=======================================
- void display_out(uint dat)
- {
- uchar i;
- digits_obtain(dat); //拆分數據
- for(i=0; i<4; i++)
- {
- if(date[0]==0) //如果第一位為0則屏蔽掉
- {
- date[0]=10;
- }
- else
- {
- segment_out(duan_ma[date[i ]]); //發送段顯示碼
- position_out(wei_ma[i ]); //發送位顯示碼
- if(i==1) //點亮百位與十位中間的小數點、最大顯示數據為99.99
- {
- dp=0;
- }
- else
- {
- dp=1;
- }
- }
- //以下為消隱及顯示亮度調整部分
- delay_10us(20); //顯示時間、賦值變化可以改變顯示亮度
- segment_out(duan_ma[10]); //送黑屏碼
- delay_1ms(5); //熄屏時間
- }
- }
- //====主函數==============================================
- main()
- {
- P0M1=0x00;
- P0M0=0xff; //P0口的8個引腳設定為推挽輸出
- P1M1=0x00;
- P1M0=0x1e; //P1.1、P1.2、P1.3、P1.4設定為推挽輸出
- while(1)
- {
- display_out(1234);
- }
- }
復制代碼
|