圣龙扬特-AVR电子

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1820|回复: 4
打印 上一主题 下一主题

STM8S的LCD1602驱动实验

[复制链接]

26

主题

1

好友

3446

积分

超级版主

Rank: 8Rank: 8

UID
7
帖子
140
精华
0
注册时间
2013-2-26
在线时间
20 小时

突出贡献

跳转到指定楼层
楼主
发表于 2013-2-28 20:20:25 |只看该作者 |倒序浏览
/**************************************
*                                        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");
                }
        }
}

回复

使用道具 举报

26

主题

1

好友

3446

积分

超级版主

Rank: 8Rank: 8

UID
7
帖子
140
精华
0
注册时间
2013-2-26
在线时间
20 小时

突出贡献

沙发
发表于 2013-2-28 20:21:04 |只看该作者
延时函数:
/********************************
*                        延时函数                        *
* 文 件 名: 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--)
                        {;}
                }
        }
回复

使用道具 举报

6

主题

1

好友

3385

积分

超级版主

Rank: 8Rank: 8

UID
10
帖子
48
精华
1
注册时间
2013-2-26
在线时间
27 小时
板凳
发表于 2013-2-28 23:05:22 |只看该作者
铜爷, delay_ms(5) 好浪费时间哦
天之道,利而不害;圣人之道,为而不争
回复

使用道具 举报

0

主题

0

好友

569

积分

高级会员

Rank: 4

UID
35
帖子
14
精华
0
注册时间
2013-2-27
在线时间
6 小时
地板
发表于 2013-2-28 23:37:06 |只看该作者
铜爷表示四川人最爱悠闲,时间大把
回复

使用道具 举报

26

主题

1

好友

3446

积分

超级版主

Rank: 8Rank: 8

UID
7
帖子
140
精华
0
注册时间
2013-2-26
在线时间
20 小时

突出贡献

5#
发表于 2013-3-1 09:47:29 |只看该作者
★一辉︿♂︿ 发表于 2013-2-28 23:37
铜爷表示四川人最爱悠闲,时间大把

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

Archiver|手机版|圣龙扬特-AVR电子 ( 鲁ICP备05022832号 )

GMT+8, 2024-6-26 16:37 , Processed in 0.212725 second(s), 18 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部