- 阅读权限
- 150
- UID
- 7
- 帖子
- 140
- 精华
- 0
- 注册时间
- 2013-2-26
- 在线时间
- 20 小时
- UID
- 7
- 帖子
- 140
- 精华
- 0
- 注册时间
- 2013-2-26
- 在线时间
- 20 小时
|
/**************************************
* 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");
}
}
}
|
|