27,374
社区成员
用stm8LC152开发板,驱动液晶显示时间,但是秒钟在正常走时,但是分钟却不进位,这是哪里设置不对??
/==================定义常数=====================//
#define a 0x01
#define b 0x02
#define c 0x04
#define d 0x08
#define e 0x10
#define f 0x20
#define g 0x40
#define m 0x80
const uint16_t NumberMap[10]=
{
a+b+c+d+e+f, // Display "0"
b+c, // Display "1"
a + b + m + g + e + d, // Displays "2"
a + b + m + g + c + d, // Displays "3"
f + g + m + b + c, // Displays "4"
a + f + g + m + c +d, // Displays "5"
a + f + e + d + c + g + m , // Displays "6"
a + b + c, // Displays "7"
a + b + c + d + e + f + g + m, // Displays "8"
a + b + c + d + f + g + m // Displays "9"
};
void system_init(void);
void GPIO_Init(void);
void LCD_Config(void);
void RTC_Config(void);
void ADC_Init(void);
void LCD_GLASS_Clear(void);
void LCD_GLASS_Confirm(void);
void LCD_DisplayNum(uint8_t WEI, uint8_t Num);
void Delay(u16 Second);
void system_init(void)
{
if(CLK_SCSR!=0x01)
{
CLK_SWCR |= 0x02;//使能自动时钟切换
CLK_SWR = 0x01; //HSI为主时钟源
while(!CLK_SWCR_SWIF);
//CLK_CKDIVR = 0x00;//CPU时钟0分频,系统时钟0分频
CLK_SWCR = 0;
}
CLK_CSSR = 0x01;//时钟安全监测使能
CLK_PCKENR2_PCKEN20 = 1; //打开ADC1时钟
CLK_PCKENR2_PCKEN22 = 1; //打开RTC时钟,LCD刷新频率与此有关
CLK_PCKENR2_PCKEN23 = 1; //打开LCD时钟,读写LCD寄存器用到此时钟
CLK_CRTCR = 0x10; //set RTC division favter[7:5] and clock source [4:1]
//CLK_CRTCR: Clock RTC register; 前3位为时钟分频值,后4位为时钟选择位,
//最后一位为系统忙标志位
//CLK_CRTCR_RTCSEL0=0;
//CLK_CRTCR_RTCSEL1=0;
//CLK_CRTCR_RTCSEL2=0;
//CLK_CRTCR_RTCSEL3=1;
//CLK_CRTCR_RTCDIV0=0;
//CLK_CRTCR_RTCDIV1=0;
//CLK_CRTCR_RTCDIV2=0;
//CLK_SWCR| = 0x02;
//CLK_SWR = 0xB4;
// while ((CLK_SWCR & 0x08) = = 0);
//CLK_SWCR=0;
//asm("rim");
}
void RTC_Config(void)
{
RTC_WPR = 0xCA; //disable write protection
RTC_WPR = 0x53;
RTC_ISR1_INIT = 1; //initialize
while(!RTC_ISR1_INITF);
//初始化时间与日期
RTC_TR1_ST=5; // second tens RTC_TR1 (second)
RTC_TR1_SU=5; // second units
RTC_TR2_MNT=4; // minute tens RTC_TR2 (minute)
RTC_TR2_MNU=2; // minute units
//RTC_TR3_PM=0; // AM/PM
RTC_TR3_HT=1; // Hour tens
RTC_TR3_HU=1; // hour units
RTC_DR1_DT=2; // date tens
RTC_DR1_DU=6; // date units
RTC_DR2_WDU=1; // week day units
RTC_DR2_MT=0; // month tens
RTC_DR2_MU=9; // month units
RTC_DR3_YT=1; // year tens
RTC_DR3_YU=6; // year units
RTC_CR1 |=0x40; // 24 hour
//RTC_CR1_BYPSHAD=1;
RTC_APRER=0x7F; //保持默认值0x7F,异步RTC寄存器
RTC_SPRERH=0x00;
RTC_SPRERL=0xFF; //保持默认值0xFF,同步RTC寄存器
//以上两个RTC时钟分频值保持默认
//最终提供给日历模块的时钟为32768Hz/((127+1)*(255+1))=1
RTC_ISR1_INIT=0; //退出初始化模式
RTC_WPR=0x55;//使能写保护
RTC_WPR=0x55;
}
void ADC_Init(void)
{
ADC1_TRIGR1_VREFINTON = 1; // enable internal reference voltage
ADC1_CR1_ADON = 1; // wakeup the ADC from power-down mode
ADC1_CR2_PRESC = 1; // devide the ADC clock Fre by 2;
ADC1_SQR1_DMAOFF = 1; // DMA diable for a single conversion
}
void GPIO_Init(void)
{
//**********Key 输入***************//
PB_DDR_DDR0 = 0; //B[0:4]端口为输入端口
PC_CR1_C10 = 1; //上拉输入
PC_CR2_C20 = 1; //中断禁止
PB_DDR_DDR1 = 0;
PC_CR1_C11 = 1;
PC_CR2_C21 = 1;
PB_DDR_DDR2 = 0;
PC_CR1_C12 = 1;
PC_CR2_C22 = 1;
PB_DDR_DDR3 = 0;
PC_CR1_C13 = 1;
PC_CR2_C23 = 1;
PB_DDR_DDR4 = 0;
PC_CR1_C14 = 1;
PC_CR2_C24 = 1;
//***********TEMP Con温度回路控制**********//
PB_DDR_DDR5 = 1; //PB5端口为输出
PB_CR1_C15 = 1; //推挽输出
PB_CR2_C25 = 0; //慢速输出 2MHz
//***********motor 输出*******************//
PA_DDR_DDR5 = 1; //PA5,6为输出端口
PA_CR1_C15 = 1; //推挽输出
PA_CR2_C25 = 1; //慢速输出 2MHz
PA_DDR_DDR6 = 1; //PB4,5为输出端口
PA_CR1_C16 = 1; //推挽输出
PA_CR2_C26 = 1; //慢速输出 2MHz
//**********LED 输出*******************//
PD_DDR_DDR1 = 1;
PD_CR1_C11 = 1;
PD_CR2_C21 = 1;
PD_DDR_DDR2 = 1;
PD_CR1_C12 = 1;
PD_CR2_C22 = 1;
PD_DDR_DDR3 = 1;
PD_CR1_C13 = 1;
PD_CR2_C23 = 1;
}
void LCD_Config(void)
{
LCD_FRQ = 0x0F; //Frequency selectrion register (PS and DIV)
LCD_CR1 = 0x06; // control register 1: set blink, blink frequency,
// duty ratio, bias.
LCD_CR2 = 0x04; // control register 2: set pulse on duation,
// high drive enable, contrast control
/*-----------Mask register----------------*/
LCD_PM0 = 0xFF; // Seg[7:0] enable
//LCD_PM1 = 0x00; // Seg[8:15] enable
LCD_PM2 = 0xFF; // Seg[16:23] enable
//LCD_PM3 = 0x00; // Seg[24:31] enable
LCD_CR3 = 0x40; // control register 3: set LCD enable, interrupt enable,
// frame flag, SOD flag, Dead time enable
}
//********************LCD 清零**********************************//
void LCD_GLASS_Clear(void)
{
LCD_RAM0 = 0x00;
LCD_RAM1 = 0x00;
LCD_RAM2 = 0x00;
LCD_RAM3 = 0x00;
LCD_RAM4 = 0x00;
LCD_RAM5 = 0x00;
LCD_RAM6 = 0x00;
LCD_RAM7 = 0x00;
LCD_RAM8 = 0x00;
LCD_RAM9 = 0x00;
LCD_RAM10 = 0x00;
LCD_RAM11 = 0x00;
LCD_RAM12 = 0x00;
LCD_RAM13 = 0x00;
}
void LCD_GLASS_Confirm(void)
{
LCD_RAM0 = 0xFF;
LCD_RAM1 = 0xFF;
LCD_RAM2 = 0xFF;
LCD_RAM3 = 0xFF;
LCD_RAM4 = 0xFF;
LCD_RAM5 = 0xFF;
LCD_RAM6 = 0xFF;
LCD_RAM7 = 0xFF;
LCD_RAM8 = 0xFF;
LCD_RAM9 = 0xFF;
LCD_RAM10 = 0xFF;
LCD_RAM11 = 0xFF;
LCD_RAM12 = 0xFF;
LCD_RAM13 = 0xFF;
}
void LCD_DisplayNum(uint8_t Wei, uint8_t Num)
{
uint8_t tmp=0;
tmp=NumberMap[Num];
switch(Wei)
{
case 4:
((tmp&a)==0)?(LCD_RAM6 &= (~0x04)):(LCD_RAM6 |= 0x04); //1A
((tmp&b)==0)?(LCD_RAM2 &= (~0x40)):(LCD_RAM2 |= 0x40); //1B
((tmp&c)==0)?(LCD_RAM3 &= (~0x20)):(LCD_RAM3 |= 0x20); //1C
((tmp&d)==0)?(LCD_RAM3 &= (~0x10)):(LCD_RAM3 |= 0x10); //1D
((tmp&e)==0)?(LCD_RAM0 &= (~0x01)):(LCD_RAM0 |= 0x01); //1E
((tmp&f)==0)?(LCD_RAM6 &= (~0x08)):(LCD_RAM6 |= 0x08); //1F
((tmp&g)==0)?(LCD_RAM2 &= (~0x80)):(LCD_RAM2 |= 0x80); //1G
((tmp&m)==0)?(LCD_RAM0 &= (~0x02)):(LCD_RAM0 |= 0x02); //1M
case 3:
((tmp&a)==0)?(LCD_RAM6 &= (~0x01)):(LCD_RAM6 |= 0x01); //2A
((tmp&b)==0)?(LCD_RAM2 &= (~0x10)):(LCD_RAM2 |= 0x10); //2B
((tmp&c)==0)?(LCD_RAM3 &= (~0x80)):(LCD_RAM3 |= 0x80); //2C
((tmp&d)==0)?(LCD_RAM3 &= (~0x40)):(LCD_RAM3 |= 0x40); //2D
((tmp&e)==0)?(LCD_RAM0 &= (~0x04)):(LCD_RAM0 |= 0x04); //2E
((tmp&f)==0)?(LCD_RAM6 &= (~0x02)):(LCD_RAM6 |= 0x02); //2F
((tmp&g)==0)?(LCD_RAM2 &= (~0x20)):(LCD_RAM2 |= 0x20); //2G
((tmp&m)==0)?(LCD_RAM0 &= (~0x08)):(LCD_RAM0 |= 0x08); //2M
LCD_RAM7 |= 0x08; //2colon
case 2:
((tmp&a)==0)?(LCD_RAM5&=~0x40):(LCD_RAM5 |=0x40) ;
((tmp&b)==0)?(LCD_RAM2&=~0x04):(LCD_RAM2 |=0x04) ;
((tmp&c)==0)?(LCD_RAM4&=~0x02):(LCD_RAM4 |=0x02) ;
((tmp&d)==0)?(LCD_RAM4&=~0x01):(LCD_RAM4 |=0x01) ;
((tmp&e)==0)?(LCD_RAM0&=~0x10):(LCD_RAM0 |=0x10) ;
((tmp&f)==0)?(LCD_RAM5&=~0x80):(LCD_RAM5 |=0x80) ;
((tmp&g)==0)?(LCD_RAM2&=~0x08):(LCD_RAM2 |=0x08) ;
((tmp&m)==0)?(LCD_RAM0&=~0x20):(LCD_RAM0 |=0x20) ;
case 1:
((tmp&a)==0)?(LCD_RAM5&=~0x10):(LCD_RAM5 |=0x10) ;
((tmp&b)==0)?(LCD_RAM2&=~0x01):(LCD_RAM2 |=0x01) ;
((tmp&c)==0)?(LCD_RAM4&=~0x08):(LCD_RAM4 |=0x08) ;
((tmp&d)==0)?(LCD_RAM4&=~0x04):(LCD_RAM4 |=0x04) ;
((tmp&e)==0)?(LCD_RAM0&=~0x40):(LCD_RAM0 |=0x40) ;
((tmp&f)==0)?(LCD_RAM5&=~0x20):(LCD_RAM5 |=0x20) ;
((tmp&g)==0)?(LCD_RAM2&=~0x02):(LCD_RAM2 |=0x02) ;
((tmp&m)==0)?(LCD_RAM0&=~0x80):(LCD_RAM0 |=0x80) ;
break;
default:break;
}
}
void Delay(u16 Second)
{
u8 i,j;
while(Second--)
{
for(i=0;i<50;i++)
for(j=0;j<50;j++);
}
}
void main(void)
{
u8 H_shi=0,H_ge=0,M_shi=0,M_ge=0,S_shi=0,S_ge=0;
system_init();
GPIO_Init();
LCD_Config();
RTC_Config();
LCD_GLASS_Clear();
LCD_GLASS_Confirm();
Delay(50);
LCD_GLASS_Clear();
LCD_GLASS_Confirm();
Delay(50);
LCD_GLASS_Clear();
LCD_DisplayNum(4,1);
LCD_DisplayNum(3,5);
LCD_DisplayNum(2,6);
LCD_DisplayNum(1,8);
Delay(50);
LED2 = 0;
LED3 = 1;
MOTOR1 = 1;
MOTOR2 = 0;
LCD_GLASS_Clear();
//asm("rim");
while(1)
{
LED3 = 1;
while(!RTC_ISR1_RSF);
S_ge = (u32)RTC_TR1_SU;
S_shi = (u32)RTC_TR1_ST;
M_ge = (u32)RTC_TR2_MNU;
M_shi = (u32)RTC_TR2_MNT;
H_ge = (u32)RTC_TR3_HU;
H_shi = (u32)RTC_TR3_HT;
RTC_ISR1_RSF=0;
LCD_DisplayNum(4,M_shi);
LCD_DisplayNum(3,M_ge);
LCD_DisplayNum(2,S_shi);
LCD_DisplayNum(1,S_ge);
Delay(5);
LED3 = 0;
Delay(5);
}
}
解决了吗,我也出现这个问题