钻石会员
主题
回帖0
积分11988
阅读权限50
注册时间2011-1-9
最后登录1970-1-1
在线时间 小时
|
原来程序是基于rtx51系统的电压电流表程序,怕你看不懂简化一下给改成main形式的了。
电路是用stc12c5a60s2进行12次动态扫描驱动数码管。x和y为数码管段选,aa-hh位选。共阴管,改成共阳也不难。
要是用stc15系列单片机也随意,代码一点不用变就能直接换成15的。
推荐你直接玩15系列的,性价比高。程序串口下载,单片机自带可编程晶振,速度快,xram大,内部外设多,40脚的高端片子价格才6元左右......
缓冲数组buff内前12个数据对应数码管显示内容,13号数据觉得前六个数码管的小数点位置,14号决定后6个。
#include <reg52.h>
sfr P4=0xc0;
sfr P0M0=0x94;
sfr P1M0=0x92;
sfr P2M0=0x96;
sfr P4M0=0xb4;
sfr P4SW=0xbb;
sbit x1=P1^0;
sbit x2=P0^0;
sbit x3=P2^7;
sbit x4=P2^5;
sbit x5=P2^4;
sbit x6=P2^0;
sbit y1=P0^1;
sbit y2=P0^2;
sbit y3=P2^6;
sbit y4=P2^3;
sbit y5=P2^2;
sbit y6=P2^1;
sbit aa=P4^4;
sbit bb=P4^6;////
sbit cc=P0^6;
sbit dd=P0^4;
sbit ee=P0^3;
sbit ff=P4^5;
sbit gg=P0^7;
sbit hh=P0^5;
sbit SCL=P3^7;
sbit SDA=P3^6;
code unsigned char duanxuan[15]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x98,0xff,0xbf,0xb9,0x88,0xc1
};//0,1,2,3,4,5,6,7,8,9, ,-,-1,A,U
char buff[14]={10,10,10,10,10,10,10,10,10,10,10,10,6,6};
void duan(char st)
{
switch(st)
{case 0:x1=0;y6=1; break;
case 1:x2=0;x1=1; break;
case 2:x3=0;x2=1; break;
case 3:x4=0;x3=1; break;
case 4:x5=0;x4=1; break;
case 5:x6=0;x5=1; break;
case 6:y1=0;x6=1; break;
case 7:y2=0;y1=1; break;
case 8:y3=0;y2=1; break;
case 9:y4=0;y3=1; break;
case 10:y5=0;y4=1; break;
case 11:y6=0;y5=1; break;
default:x1=1;x2=0;x3=0;x4=0;x5=0;x6=0; y1=1;y2=0;y3=0;y4=0;y5=0;y6=0;
}
}
void dis(unsigned char in)
{
in=0xff-in;
hh=in/128;
gg=in%128/64;
ff=in%64/32;
ee=in%32/16;
dd=in%16/8;
cc=in%8/4;
bb=in%4/2;
aa=in%2;
}
void p_init(void)
{
P4SW=0x70;
P2M0=0xff;
P1M0=0x01;
P0M0=0xff;
P4M0=0xff;
}
void main()
{char dis_l=0;
p_init();
while (1) {
dis(0xff);
duan(dis_l);
if(dis_l<6)
{if(dis_l==buff[12])
dis(duanxuan[buff[dis_l]]-0x80);
else
dis(duanxuan[buff[dis_l]]);
}
else
{if(dis_l-6==buff[13])
dis(duanxuan[buff[dis_l]]-0x80);
else
dis(duanxuan[buff[dis_l]]);
}
dis_l++;
dis_l%=12;
}
}
|
|