- /**本程序用于测试分散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);
- }
- }
复制代码
|