|
單片機(jī)IO口無(wú)序直驅(qū)LED數(shù)碼管程序分享.jpg (82.64 KB, 下載次數(shù): 0)
下載附件
2025-1-18 15:08 上傳
- /**本程序用于測(cè)試分散I/O口驅(qū)動(dòng)4位數(shù)碼管顯示**/
- #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;
- //不含小數(shù)點(diǎn)8段LED字形碼0-9+黑屏碼、共陽(yáng)極驅(qū)動(dòng)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];//顯示數(shù)據(jù)暫存
- //====熄屏延時(shí)a*1ms延時(shí)函數(shù)===============================
- 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個(gè)筆段控制I/O引腳映射到變量的8個(gè)位上
- 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個(gè)數(shù)位控制I/O引腳映射到變量的4個(gè)位上
- void position_out(uchar dat)
- {
- w1=(bit)(dat&0x08);
- w2=(bit)(dat&0x04);
- w3=(bit)(dat&0x02);
- w4=(bit)(dat&0x01);
- }
- //====數(shù)據(jù)拆分函數(shù)=======================================
- //提取出數(shù)據(jù)的千、百、十、個(gè)位的數(shù)值存入數(shù)組中
- void digits_obtain(uint dat)
- {
- date[0]=dat/1000;
- date[1]=dat%1000/100;
- date[2]=dat%100/10;
- date[3]=dat%10;
- }
- //====顯示輸出函數(shù)=======================================
- void display_out(uint dat)
- {
- uchar i;
- digits_obtain(dat); //拆分?jǐn)?shù)據(jù)
- for(i=0; i<4; i++)
- {
- if(date[0]==0) //如果第一位為0則屏蔽掉
- {
- date[0]=10;
- }
- else
- {
- segment_out(duan_ma[date[i ]]); //發(fā)送段顯示碼
- position_out(wei_ma[i ]); //發(fā)送位顯示碼
- if(i==1) //點(diǎn)亮百位與十位中間的小數(shù)點(diǎn)、最大顯示數(shù)據(jù)為99.99
- {
- dp=0;
- }
- else
- {
- dp=1;
- }
- }
- //以下為消隱及顯示亮度調(diào)整部分
- delay_10us(20); //顯示時(shí)間、賦值變化可以改變顯示亮度
- segment_out(duan_ma[10]); //送黑屏碼
- delay_1ms(5); //熄屏?xí)r間
- }
- }
- //====主函數(shù)==============================================
- main()
- {
- P0M1=0x00;
- P0M0=0xff; //P0口的8個(gè)引腳設(shè)定為推挽輸出
- P1M1=0x00;
- P1M0=0x1e; //P1.1、P1.2、P1.3、P1.4設(shè)定為推挽輸出
- while(1)
- {
- display_out(1234);
- }
- }
復(fù)制代碼
|
|