圣龙扬特-AVR电子

标题: STM8S的LCD1602驱动实验 [打印本页]

作者: 铜河    时间: 2013-2-28 20:20
标题: STM8S的LCD1602驱动实验
/**************************************
*                                        1602液晶8线驱动程序                                        *
*        功能描述:用STM8S105驱动1602液晶                *
*        程序设计:铜河                                                                                *
*        建立日期:2010年10月21日                                                *
*        版本信息:V1.0                                                                                        *
*        修改日期:2010年10月21日                                                *
**************************************/
/********************************
*                                        联接关系和说明                                *
*                STM8S105                LCD1602                说明        *
*                        PB0-7        ---                D0-D7                数据        *
*                        PC5                ---                RS                        控制        *
*                        PC6                ---                R/W                        读写        *
*                        PC7                ---                E                                时钟        *
********************************/
#include "STM8S105C_S.h"
#include "delay.h"

//LCD相关端口定义
#define LCD_CM        PC_ODR                                //液晶控制端接PB口
#define RS1602        5                                                         //RS接在PC5上
#define E1602                7                                                        //E接在PC7上
#define RW1602        6                                                        //R/W接在PC6上
#define CLR_RS        LCD_CM&=~(1<<RS1602)        //RS清0
#define SET_RS        LCD_CM|=1<<RS1602                        //RS置1
#define CLR_E                LCD_CM&=~(1<<E1602)                //E清0
#define SET_E                LCD_CM|=1<<E1602                        //E置1
#define CLR_RW        LCD_CM&=~(1<<RW1602)        //RS清0
#define SET_RW        LCD_CM|=1<<RW1602                        //RS置1

#define LCD_DA        PD_ODR                                //液晶数据接PD

/*************************************
*         LCD1602操作函数组                         *
*************************************/
//写数据到LCD的函数:入口data,需写入的显示数据
void lcd_da(unsigned char data)
{
        SET_RS;                                            //RS置高,写数据
        delay_ms(5);
        LCD_DA = data;                                //数据送端口
        SET_E;
        delay_ms(5);
        CLR_E;                                                //E下降沿写入数据
        delay_ms(5);                                //延时1MS
        CLR_RS;
}

//写指令到LCD的函数:入口data,需写入的控制指令
void lcd_comm(unsigned char data)
{
        CLR_RS;                                                 //RS清0,写指令
        delay_ms(5);                                //延时1MS
        LCD_DA = data;                                //指令送端口
        SET_E;
        delay_ms(5);
        CLR_E;                                                //E下降沿写入指令
        delay_ms(5);                                //延时1MS
}
   
//LCD1602初始化函数
void lcd_init(void)
{
        CLR_RW;
        delay_ms(50);
        lcd_comm(0x38);                                 //写指令:8位数据、2行显示、5*8点阵
        delay_ms(50);
        lcd_comm(0x06);                                 //写指令:自左向右显示
        delay_ms(50);
        lcd_comm(0x0C);                                 //写指令:显示开
        delay_ms(50);
        lcd_comm(0x14);                                 //写指令:移动
        delay_ms(50);
        lcd_comm(0x80);                                 //写指令:第1行地址
        delay_ms(50);               
        lcd_comm(0x01);                                 //写指令:CLS
}
       
//清屏指令函数
void cls(void)
{
        lcd_comm(0x01);
        delay_ms(50);
}

//定位指令函数
void locate(unsigned char a,unsigned char b)
{
        switch(a)
        {
                case 1:
                        lcd_comm(0x80+b-1);
                        break;
                case 2:
                        lcd_comm(0xC0+b-1);
                        break;
                default:break;
        }
        delay_ms(1);
}

/***********************************
*         显示一个字符串函数           *
* 入    口:1显示ID1,2显示ID2           *
***********************************/
void lcd(char *s)
{
        while(*s)
        {
                lcd_da(*s);
                s++;
        }
}
       
/***********************************
*       显示公司广告语函数                      *
***********************************/
void guanggao(void)
{
        cls();
        locate(1,2);                                  //写指令:第1行地址
        lcd("BAICAI");
        locate(2,2);                                  //写指令:第2行地址
        lcd("TONGHE");
}


/******************************
*                                端口初始化函数                                *
*        功能描述:端口输入输出配置        *
******************************/
void GPIO_Init(void)
{
        PA_DDR  = 0xFF;
        PA_CR1  = 0xFF;
        PA_CR2  = 0x00;
       
        PB_DDR  = 0xFF;
        PB_CR1  = 0xFF;
        PB_CR2  = 0x00;
       
        PC_DDR  = 0xFF;
        PC_CR1  = 0xFF;
        PC_CR2  = 0x00;
       
        PD_DDR  = 0xFF;
        PD_CR1  = 0xFF;
        PD_CR2  = 0x00;
       
        PE_DDR  = 0x07;
        PE_CR1  = 0x07;
        PE_CR2  = 0x00;
       
        PG_DDR  = 0x03;
        PG_CR1  = 0x03;
        PG_CR2  = 0x00;
}

/******************************
*                                时钟初始化函数                                *
*        功能描述:时钟配置                                        *
******************************/
void CLK_Init(void)
{
        CLK_CKDIVR &= ~0x10;

        CLK_CKDIVR |= 0x01;
}


void main(void)
{
        unsigned char i;
        GPIO_Init();
       
//        CLK_Init();
       
        lcd_init();
       
        delay_ms(100);
       
        guanggao();
        delay_ms(2000);

        while(1)
        {
                i ++;
                PD_ODR ^= 1<<3;
                delay_ms(1000);
               
                locate(1,2);
               
                if(i%2)
                {
                        lcd("ABCD1234abcdEFG");
                }
                else
                {
                        lcd("TEL:18602896205");
                }
        }
}


作者: 铜河    时间: 2013-2-28 20:21
延时函数:
/********************************
*                        延时函数                        *
* 文 件 名: delay.c                                *
* 日    期: 2010年01月21日                *
* 描    述: 延时函数                        *
* 作    者:铜河                                *
* 版        本: V1.0                                *
* 主控芯片:STM8S                                *
********************************/
#include "STM8S105C_S.h"

/********************************
* 函数名称: delay_us(uchar i)        *
* 函数功能:延时函数                        *
********************************/
void delay_us(unsigned char i)
        {
        while(i--)
                {
                _asm("nop");
                _asm("nop");
                }
        }
         
/********************************
* 函数名称: delay_ms(uint i)        *
* 函数功能:延时函数                        *
********************************/
void delay_ms(unsigned int i)
        {
        unsigned char a;
        for(;i;i--)
                {
                for(a=250;a;a--)
                        {;}
                }
        }
作者: 八斤    时间: 2013-2-28 23:05
铜爷, delay_ms(5) 好浪费时间哦
作者: ★一辉︿♂︿    时间: 2013-2-28 23:37
铜爷表示四川人最爱悠闲,时间大把
作者: 铜河    时间: 2013-3-1 09:47
★一辉︿♂︿ 发表于 2013-2-28 23:37
铜爷表示四川人最爱悠闲,时间大把

哈哈哈~~~~这不是实验么




欢迎光临 圣龙扬特-AVR电子 (http://avr.cnta.net/) Powered by Discuz! X2.5