中微单片机IO口复用方式控制LED数码管
CMS8H1213 CMS8H121X是中微半导体基于RISC内核推出的高精度测量SoC, 应用于人体秤、厨房秤、气泵等高精度测量领域。主频8MHz/16MHz;工作电压2.0V至4.5V;提供8KB ROM,344B RAM ,128B EEPROM ;内置24位高精度Sigma-Delta ADC,支持1路差分输入,增益可选2 、4 、12 、16 、48、64 、128 、384 ,输出速率可选:10Hz~10.4KHz;有效分辨率最高可达20.0位,带内短开关和系统斩波开关,PGA直通SAR ADC,集成温度传感器;内置多通道12-bit SAR ADC;支持硬件LED驱动,最多支持8COM x 8 SEG ; 支持1个UART; 支持2路定时器; 可工作在-40℃至85℃;提供SOP16、SSOP24的封装
为了节省IO资源,我们采用7个IO控制40段数码。数码管采用单个0603贴片LED组成。
原理图:
![RB6 用的是RA7](https://i-blog.csdnimg.cn/direct/efcafd3e19014de7bebbf01a085a0f27.png#pic_center)
const uint8_t SegTab[]={
1,2,3,4,5,6,
0,2,3,4,5,6,
0,1,3,4,5,6,
0,1,2,4,5,6,
0,
1,
2,
3,
5,
6,
0,
1,
2,
3,
4,
6,
0,
1,
2,
3,
4,
5
};
const uint8_t SEG_DIGIT_VALUE[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
uint8_t DisBuf[5]={0};
uint8_t SegBuf[6]={0};
volatile uint8_t Dig_Cnt;
volatile uint8_t Hpin,Lpin;
volatile uint8_t RegCnt=0;
void Init_Timer0(TIMER0_MODE_E mode, T0CKL_SINGAL_TREND_E trend, TMR0_PRE_DIV preDiv)
{
if(mode == MODE_T0CKL_PIN)
{
TRISA2 = 1;
}
OPTION_REG &= 0x00;
T0CS = mode;
T0SE = trend;
PSA = 0;
OPTION_REG |= preDiv;
T0IF = 0;
T0IE = 1;
}
void Init_System(void)
{
GIE = 1;
PEIE = 1;
OSCCON |= 0x70;
}
void GPIO_Init(void)
{
PORTA = 0x7F;
TRISA = 0x7f;
WPUA = 0x7F;
PAPI = 0x2f;
PORTB = 0x7F;
TRISB = 0x00;
PBPI = 0x55;
SEGENB = 0xff;
COMENB = 0xff;
PORTC = 0;
TRISC = 0x00;
IOCA = 0X01;
RACIF = 0;
RACIE = 1;
}
void main(void)
{
u32 temp32;
GPIO_Init();
Init_System();
DataIni();
Init_Timer0(MODE_FsysDIV4, T0CKL_LowToHigh,TMR0_PRE_DIV4);
while(1)
{
SwapBuf();
}
void SwapBuf(void)
{
u8 i,j;
u8 da,n,m;
n=0;
do
{
j = n /6;
da = 0;
for(i=0;i<6;i++)
{
m = n >> 3;
if(DisBuf[m] & (1 << (n % 8)))
da |= (1 << SegTab[ j* 6 + i]);
n++;
}
SegBuf[j] = da;
}while(n<42);
}
void interrupt ISR()
{
if(T0IF)
{
Lpin = SegBuf[Hpin];
PORTB = 0xff;
TRISA7 = 1;
TRISB = 0xff;
RA7 = 1;
if(Hpin == 6 )
{ TRISA7 = 0;
RA7 = 0;
}
else
{
PORTB = ~(1<<Hpin);
}
if(Lpin & 0x40)
{ RA7 = 1;
TRISA7 = 0;
}
TRISB = ~((1<<Hpin) | Lpin);
Hpin++;
if(Hpin > 6 )
{
Hpin = 0;
}
T0IF = 0;
}
}