/* 添加包含芯片的头文件 */
#include<iostm8l152k4.h>
unsigned char LCD_DisBuffer[4];//显示缓冲区
//码值表 /* 0 1 2 3 4 */
const unsigned short Data[16] = {0x3132, 0x2020, 0x3212, 0x3222, 0x2320,
/* 5 6 7 8 9 */
0x1322, 0x1332, 0x3020, 0x3332, 0x3322,
/* A b c d e f*/
0x3330, 0x0332, 0x1112, 0x2232, 0x1312, 0x1310};
//数值 BAGFCEDP 码值
//0 11011110 3132
//1 10001000 2020
//2 11100110 3212
//3 11101010 3222
//4 10111000 2320
//5 01111010 1322
//6 01111110 1332
//7 11001000 3020
//8 11111110 3332
//9 11111010 3322
//A 11111100 3330
//b 00111110 0332
//C 01010110 1112
//d 10101110 2232
//E 01110110 1312
//F 01110100 1310
unsigned char number1 , number2 , number3 , number4;
/*******************************************************************************
**函数名称:void InitLCD(void)
**功能描述:初始化LCD模块参数
**入口参数:无
**输出:无
*******************************************************************************/
void InitLCD(void)
{
CLK_PCKENR2_PCKEN22=1;
CLK_PCKENR2_bit.PCKEN23 = 1; //使能LCD时钟
//CLK_ECKR_bit.LSEON = 1; //开启LSE
//while(CLK_ECKR_bit.LSERDY == 0); //等待LSE准备就绪
CLK_CRTCR_bit.RTCSEL0 = 0; //选择内部低速时钟为RTC时钟源
CLK_CRTCR_bit.RTCSEL1 = 1;
CLK_CRTCR_bit.RTCSEL2 = 0;
CLK_CRTCR_bit.RTCSEL3 = 0;
CLK_CRTCR_bit.RTCDIV0 = 0; //RTC时钟源进行1分频
CLK_CRTCR_bit.RTCDIV1 = 0;
CLK_CRTCR_bit.RTCDIV2 = 0;
LCD_FRQ_bit.PS0 = 0; //设置LCD的时钟进行2的4次方分频 = 16分频
LCD_FRQ_bit.PS1 = 1;
LCD_FRQ_bit.PS2 = 0;
LCD_FRQ_bit.PS3 = 0;
LCD_FRQ_bit.DIV0 = 0; //设置LCD的刷屏频率为DIV + 16 = 0 +16 = 16分频的LCD时钟
LCD_FRQ_bit.DIV1 = 0;
LCD_FRQ_bit.DIV2 = 0;
LCD_FRQ_bit.DIV3 = 0;
LCD_CR1_bit.DUTY0 = 1; //设置DYTY = 3 LCD的输出占空比选择为1/4
LCD_CR1_bit.DUTY1 = 1;
LCD_CR1_bit.B2 = 0; //设置LCD的输出为1/3偏置选择
LCD_CR2_bit.VSEL = 0; //选择LCD的电源为内部集成电源
LCD_PM0 = 0x00; //设置LCD的SEG0 -SEG7禁止输出 STM8L152K4T6没有SEG0-SEG7的段控制
LCD_PM1 = 0xff; //设置LCD的SEG8-SEG15全球通输出
LCD_PM2 = 0x00; //以下SEG全禁止
LCD_PM3 = 0x00;
LCD_CR3_bit.DEAD0 = 0; //设置死区时间 : 设置LCD没有死区电压
LCD_CR3_bit.DEAD1 = 0;
LCD_CR3_bit.DEAD2 = 0;
LCD_CR2_bit.PON0 = 1; //PON = 1 设置液晶的脉冲持续时间为1个时钟周期
LCD_CR2_bit.PON1 = 0;
LCD_CR2_bit.PON2 = 0;
LCD_CR2_bit.HD = 1; //使能LCD高速控制
LCD_CR3_bit.LCDEN = 1; //使能LCD模块
}
/*******************************************************************************
**函数名称:void Display()
**功能描述:向LCD显示缓存输入要显示的数据
**入口参数:无
**输出:无
*******************************************************************************/
void Display()
{
//对显示缓冲区操作,要结合液晶数据手册进行数据调整给LCD缓存显示
LCD_DisBuffer[0]=(((Data[ number4] &0xf000)>>12)<<0)|(((Data[number3] &0xf000)>>12)<<2)|(((Data[number2] &0xf000)>>12)<<4)|(((Data[number1] &0xf000)>>12)<<6); //COM0,SEG15-SEG8
LCD_DisBuffer[1]=(((Data[ number4] &0x0f00)>>8)<<0)|(((Data[ number3] &0x0f00)>>8)<<2)|(((Data[ number2] &0x0f00)>>8)<<4)|(((Data[ number1] &0x0f00)>>8)<<6); //COM1
LCD_DisBuffer[2]=(((Data[ number4] &0x00f0)>>4)<<0)|(((Data[ number3] &0x00f0)>>4)<<2)|(((Data[ number2] &0x00f0)>>4)<<4)|(((Data[ number1] &0x00f0)>>4)<<6); //COM2
LCD_DisBuffer[3]=(((Data[ number4] &0x000f)>>0)<<0)|(((Data[ number3] &0x000f)>>0)<<2)|(((Data[ number2] &0x000f)>>0)<<4)|(((Data[ number1] &0x000f)>>0)<<6); //COM3
LCD_RAM1 = LCD_DisBuffer[0]; //SEG8-SEG15对应寄存器RAM1,COM0
LCD_RAM4 = LCD_DisBuffer[1]<<4; //COM1,SEG8-SEG11对应RAM4高四位
LCD_RAM5 = LCD_DisBuffer[1]>>4; //COM1,SEG12-SEG15对应RAM5低四位
LCD_RAM8 = LCD_DisBuffer[2]; //COM2,SEG8-SEG15对应RAM8
LCD_RAM11 = LCD_DisBuffer[3]<<4; //COM3,SEG8-SEG11对应RAM11高四位
LCD_RAM12 = LCD_DisBuffer[3]>>4; //COM3,SEG12-SEG15对应RAM12低四位
}
/*******************************************************************************
**函数名称:void Display_lcd_dot(unsigned char p)
**功能描述:在LCD里的4个小数点任意筢显示
**入口参数:P ;1代表双点显示,2代表2P显示,3代表3P显示,4代表4显示
**输出:无
*******************************************************************************/
void Display_lcd_dot(unsigned char p)
{
switch(p)
{
case 1:
LCD_RAM11 = (LCD_DisBuffer[3]<<4)|0x10; //1P,COM3,SEG8对应RAM的第5位,所以要与0X10相或
break;
case 2:
LCD_RAM11 = (LCD_DisBuffer[3]<<4)|0x40; //2P,COM3,SEG10对应RAM的第7位,所以要与0X40相或
break;
case 3:
LCD_RAM12 = LCD_DisBuffer[3]>>4|0x01; //3P
break;
case 4:
LCD_RAM12 = LCD_DisBuffer[3]>>4|0x04; //4P
break;
default:
break;
}
}
/*******************************************************************************
**函数名称:void delay(unsigned int ms) Name: void delay(unsigned int ms)
**功能描述:大概延时
**入口参数:unsigned int ms 输入大概延时数值
**输出:无
*******************************************************************************/
void delay(unsigned int ms)
{
unsigned int x , y;
for(x = ms; x > 0; x--) /* 通过一定周期循环进行延时*/
for(y = 1000 ; y > 0 ; y--);
}
/*******************************************************************************
**函数名称:void ClockSwitch_HSE()
**功能描述:将系统时钟切换到外部高速晶振时钟
**入口参数:无
**输出:无
*******************************************************************************/
void ClockSwitch_HSE()
{
//启用外部高速晶振且16分频,外部晶振1-16MHz
CLK_SWCR_bit.SWEN = 1; //使能开启切换
CLK_ECKR_bit.HSEON = 1; //开启HSE
while(CLK_ECKR_bit.HSERDY == 0); //等待HSE准备就绪
CLK_SWR = 0x04; //选择HSE为主时钟源
while(CLK_SWCR_bit.SWBSY == 1); //等待切换完成
CLK_CKDIVR_bit.CKM = 0; //1分频直接用外部16M晶振
//CKM = 0 系统1分频
//CKM = 1 系统2分频
//CKM = 2 系统4分频
//CKM = 3 系统8分频
//CKM = 4 系统16分频
//CKM = 5 系统32分频
//CKM = 6 系统64分频
//CKM = 7 系统128分频
CLK_SWCR_bit.SWEN = 0; //关闭切换
}
/* 主函数 */
void main()
{
char i , j;
//CLK_CKDIVR_bit.CKM = 0; //1分频直接用外部16M晶振
ClockSwitch_HSE(); //内部时钟为1分频 = 16Mhz
InitLCD(); //调用LCD初始化函数
while(1) //循环在LCD里显示0_F数字
{
for(i = 0; i< 16; i++)
{
number4= i; //加载要显示的数值
number3 = i;
number2 = i;
number1 = i;
Display();
j++; //循环显示4个点
if(j >= 5)
{
j = 1;
}
Display_lcd_dot(j); //小数点显示
delay(5000);
}
}
}