给你一个例子供你参考下,我对STM8S稍微熟悉一点,我也是初学者。
/* MAIN.C file
*
* Copyright (c) 2002-2005 STMicroelectronics
*/
#include "lcd12864.h"
#include "stm8s207r.h"
#include "stm8s207rb.h"
#define sbi(io,bit)(io|=(1<<bit))//1
#define cbi(io,bit)(io&=~(1<<bit))//0
#define gbi(pin,bit)(pin&(1<<bit))//读
#define enableInterrupts() {_asm("rim\n");} /* enable interrupts 使能中断*/
#define disableInterrupts() {_asm("sim\n");} /* disable interrupts 不能中断*/
u8 year,month,day,hour,minute,seconds;//定义全局变量
void IO_Init(void)//定义IO口
{
sbi(PG_DDR,3);sbi(PG_CR1,3);cbi(PG_CR2,3);//RS
sbi(PG_DDR,4);sbi(PG_CR1,4);cbi(PG_CR2,4);//R/W
sbi(PI_DDR,0);sbi(PI_CR1,0);cbi(PI_CR2,0);//E
sbi(PG_DDR,5);sbi(PG_CR1,5);cbi(PG_CR2,5);//RST
}
void timer1_init(void)// 然后初始化定时器4
{
TIM1_IER = 0x00; // 禁止中断
TIM1_EGR = 0x01; // 允许产生更新事件
TIM1_PSCRH = 0x13; // 8M系统时钟经预分频f=fck/(PSCR+1)
TIM1_PSCRL = 0x88; // PSCR=0x1F3F,f=8M/(0x1F3F+1)=1000Hz,每个计数周期1ms
// 相当于计数器周期为100uS
// 设定重装载时的寄存器值
// 注意必须保证先写入高8位,再写入低8位
TIM1_ARRH = 0x09; // 设定重装载时的寄存器的高8位
TIM1_ARRL = 0xc4;
TIM1_CNTRH = 0; // 设定计数器的初值
TIM1_CNTRL = 0;
TIM1_IER = 0x01; // 允许更新中断
TIM1_CR1 = 0x01; // 计数器使能,开始计数
}
void CLK_Init(void)//时钟
{
CLK_SWCR|=0x02; //开启切换
CLK_ICKR|=0x01; //开启内部HSI
while(!(CLK_ICKR&0x02));//等待HSI准备就绪
CLK_SWR=0xe1; //设定HSI为主时钟源
while((CLK_SWCR & 0x01)==0x01);//等待切换完成
CLK_CKDIVR=0x00; //设置分频,此处为HSI不分频
CLK_SWCR&=(~0x02); //关闭切换
//CLK_ECKR |=0x01; //开启外部时钟
//while(!(CLK_ECKR&0x2)); //等待外部时钟
//CLK_CKDIVR=0x00;
//CLK_CKDIVR &= 0xF8; //CPU无分频 11.0592M
//CLK_CKDIVR = 0x01;
//CLK_SWR = 0xB4; //选择外部时钟
//while(!(CLK_SWCR&0x08));
//CLK_SWCR |=0x02; //使能外部时钟 ;
//CLK_PCKENR1=0x04; //enble UART1 and ADC clock
//CLK_PCKENR2=0x08;
}
void deal_time(void)
{
if(seconds>59)
{
seconds=0;minute++;
}
if(minute>59)
{
minute=0;hour++;
}
if(hour>23)
{
hour=0;day++;
}
if(day>29)
{
day=0;month++;
}
if(month>12)
{
month=0;year++;
}
}
void LCD_display_time(void)
{
LCD12864_SetPos(2,0);
LCD12864_WriteDate(year/10+0x30);
LCD12864_WriteDate(year%10+0x30);
LCD12864_DisplayString("年");
LCD12864_SetPos(2,2);
LCD12864_WriteDate(month/10+0x30);
LCD12864_WriteDate(month%10+0x30);
LCD12864_DisplayString("月");
LCD12864_SetPos(2,4);
LCD12864_WriteDate(day/10+0x30);
LCD12864_WriteDate(day%10+0x30);
LCD12864_DisplayString("日");
LCD12864_SetPos(3,0);
LCD12864_WriteDate(hour/10+0x30);
LCD12864_WriteDate(hour%10+0x30);
LCD12864_DisplayString("时");
LCD12864_SetPos(3,2);
LCD12864_WriteDate(minute/10+0x30);
LCD12864_WriteDate(minute%10+0x30);
LCD12864_DisplayString("分");
LCD12864_SetPos(3,4);
LCD12864_WriteDate(seconds/10+0x30);
LCD12864_WriteDate(seconds%10+0x30);
LCD12864_DisplayString("秒");
}
main()
{
CLK_Init();
IO_Init();
timer1_init();
LCD12864_Init();//初始化LCD
year=16;month=10;day=11;hour=12;minute=12;seconds=0;
_asm("rim\n");
while (1);
{
deal_time();
LCD_display_time();
}
}
希望例子能给你帮助。听说聪明的人能举一反三。
追问谢谢你的好意。