#include <reg52.h>
typedef signed char int8; // 8位有符号整型数
typedef signed int int16; //16位有符号整型数
typedef signed long int32; //32位有符号整型数
typedef unsigned char uint8; // 8位无符号整型数
typedef unsigned int uint16; //16位无符号整型数
typedef unsigned long uint32; //32位无符号整型数
#define LCD1602_DB P0 //1602液晶数据端口
sbit LCD1602_RS = P1^0; //1602液晶指令/数据选择引脚
sbit LCD1602_RW = P1^1; //1602液晶读写引脚
sbit LCD1602_E = P1^5; //1602液晶使能引脚
#define LCD12864_DB LCD1602_DB
#define LCD12864_RS LCD1602_RS
#define LCD12864_RW LCD1602_RW
#define LCD12864_E LCD1602_E
bit flag500ms = 0; //500ms定时标志
unsigned char T0RH = 0; //T0重载值的高字节
unsigned char T0RL = 0; //T0重载值的低字节
//待显示的第一行字符串
unsigned char code str1[] = "Kingst Studio";
//待显示的第二行字符串,需保持与第一行字符串等长,较短的行可用空格补齐
unsigned char code str2[] = "Let's move...";
void ConfigTimer0(unsigned int ms);
//void LcdShowString(uint8 x, uint8 y, uint8 *str);
void InitLcd12864();
//void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
void LcdShowStr(unsigned char x, unsigned char y,
unsigned char *str, unsigned char len);
void main()
{
/*
unsigned char str[] = "Kingst Studio";
InitLcd12864();
LcdShowStr(16, 32, "金沙滩工作室");
LcdShowStr(0, 48, " www.kingst.org ");
while(1);
*/
unsigned char i = 0;
unsigned char index = 0;
unsigned char pdata bufMove1[16 + sizeof(str1) + 16];
unsigned char pdata bufMove2[16 + sizeof(str2) + 16];
EA = 1; //开总中断
ConfigTimer0(10); //配置T0定时10ms
InitLcd12864(); //初始化液晶
for(i=0; i<16; i++)
{
bufMove1[i] = ' ';
bufMove2[i] = ' ';
}
for(i=0; i<(sizeof(str1)-1); i++)
{
bufMove1[16 + i] = str1[i];
bufMove2[16 + i] = str2[i];
}
for(i=(16 + sizeof(str1)-1); i<sizeof(bufMove1); i++)
{
bufMove1[i] = ' ';
bufMove2[i] = ' ';
}
while (1)
{
if (flag500ms) //每500ms移动一次屏幕
{
flag500ms = 0;
LcdShowStr(0, 48, bufMove1 + index, 16);
LcdShowStr(0, 32, bufMove2 + index, 16);
index++;
if(index >= (16 + sizeof(str1)-1))
{
index = 0;
}
}
}
}
/* 配置并启动T0,ms-T0定时时间 */
void ConfigTimer0(unsigned int ms)
{
unsigned long tmp; //临时变量
tmp = 11059200 / 12; //定时器计数频率
tmp = (tmp * ms) / 1000; //计算所需的计数值
tmp = 65536 - tmp; //计算定时器重载值
tmp = tmp + 12; //补偿中断响应延时造成的误差
T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节
T0RL = (unsigned char)tmp;
TMOD &= 0xF0; //清零T0的控制位
TMOD |= 0x01; //配置T0为模式1
TH0 = T0RH; //加载T0重载值
TL0 = T0RL;
ET0 = 1; //使能T0中断
TR0 = 1; //启动T0
}
/* 等待液晶准备好 */
void LcdWaitReady()
{
uint8 sta;
LCD12864_DB = 0xFF;
LCD12864_RS = 0;
LCD12864_RW = 1;
do {
LCD12864_E = 1;
sta = LCD12864_DB;
LCD12864_E = 0;
} while (sta & 0x80); //bit7等于1表示液晶正忙,重复检测直到其等于0为止
}
/* 向液晶写入一字节命令,cmd-待写入命令值 */
void LcdWriteCmd(uint8 cmd)
{
LcdWaitReady();
LCD12864_RS = 0;
LCD12864_RW = 0;
LCD12864_DB = cmd;
LCD12864_E = 1;
LCD12864_E = 0;
}
void LcdWriteDat(uint8 dat)
{
LcdWaitReady();
LCD12864_RS = 1;
LCD12864_RW = 0;
LCD12864_DB = dat;
LCD12864_E = 1;
LCD12864_E = 0;
}
/*
void LcdShowString(uint8 x, uint8 y, uint8 *str)
{
uint8 addr;
//由输入的显示坐标计算DDRAM的地址
x >>= 4;
y >>= 4;
if (y >= 2)
{
y -= 2;
x += 8;
}
addr = y*16 + x;
//由起始DDRAM地址连续写入字符串
LcdWriteCmd(0x30); //启动DDRAM操作
LcdWriteCmd(0x80|addr);
while (*str != '\0')
{
LcdWriteDat(*str);
str++;
}
}
*/
void LcdSetCursor(unsigned char x, unsigned char y)
{
uint8 addr;
//由输入的显示坐标计算DDRAM的地址
x >>= 4;
y >>= 4;
if (y >= 2)
{
y -= 2;
x += 8;
}
addr = y*16 + x;
//由起始DDRAM地址连续写入字符串
LcdWriteCmd(0x30); //启动DDRAM操作
LcdWriteCmd(0x80|addr);
}
void LcdShowStr(unsigned char x, unsigned char y,
unsigned char *str, unsigned char len)
{
LcdSetCursor(x, y); //设置起始地址
while (len--) //连续写入len个字符数据
{
LcdWriteDat(*str++); //先取str指向的数据,然后str自加1
}
}
void InitLcd12864()
{
uint8 x, y;
//字符模式初始化
LcdWriteCmd(0x30); //基本指令集
LcdWriteCmd(0x01); //清零字符显示
LcdWriteCmd(0x02); //地址归位
LcdWriteCmd(0x0C); //开显示
//图形模式初始化
LcdWriteCmd(0x34); //启动扩展指令,关闭图形显示
for (y=0; y<32; y++) //清零图形显示缓冲区
{
LcdWriteCmd(0x80|y);
LcdWriteCmd(0x80|0);
for (x=0; x<32; x++)
{
LcdWriteDat(0x00);
}
}
LcdWriteCmd(0x36); //开启图形模式显示
}
/* T0中断服务函数,定时500ms */
void InterruptTimer0() interrupt 1
{
static unsigned char tmr500ms = 0;
TH0 = T0RH; //重新加载重载值
TL0 = T0RL;
tmr500ms++;
if (tmr500ms >= 50)
{
tmr500ms = 0;
flag500ms = 1;
}
}
金沙滩单片机LCD12864左右移动
最新推荐文章于 2024-01-18 13:43:53 发布