基于STC12C5A56S2单片机和12864字符液晶,串口程序
其实对于用过74HC595(移位寄存器)的朋友,串口方式操作12864是很容易的,这个程序已在硬件上调试通过了,显示很稳定! 同时在此感谢亲爱的,一直陪着我,默默支持我
#include< STC_NEW_8051.H>
#define uint8 unsigned char
#define uint16 unsigned int
sbit SCLK = P0^7; //时钟
sbit SID = P0^6; //串行数据
sbit CS = P0^5; //串行片选信号
sbit CS1 = P4^6; //PSB并串行接口选择,H——并行,L——串行
/***************************************/
/*函数名:Delay */
/*功能:延时 */
/*参数:us---延时的微秒数 */
/* ms---延时的毫秒数 */
/*返回值:无 */
/***************************************/
void Delayus(uint8 us)
{
uint8 i;
for(i = 0;i <= us*3; i ++);
}
void Delayms(uint8 ms)
{
uint16 i,j;
for(i = 0;i < 2629; i++)
for(j = 0;j < ms; j++);
}
/****************************************/
/*函数名:Lcd_w_bit */
/*功能:向lcd发送一个字节数据 */
/*参数:byte———要发送的数据 */
/*返回值:无 */
/****************************************/
void Lcd_w_bit(uint8 byte)
{
uint8 i;
for(i = 0;i < 8;i ++) //循环8次发送一个字节
{
SID = byte&0x80; //取byte最高位
SCLK = 1;
Delayus(1); //等待端口变化
SCLK = 0; //下降沿读入数据
byte = byte<<1; //byte左移一位
}
}
/****************************************/
/*函数名:Lcd_w_char() */
/*功能:发送指令/数据 */
/*参数:Nf--1,0标志位,Data--发送的数据 */
/*返回值:无 */
/****************************************/
void Lcd_w_char(uint8 Nf, uint8 Data)
{
uint8 Init_char,Hdata,Ldata; //定义起始选择信号,数据/指令的高和低4位
if(Nf == 0) //Nf=0,则写入的是控制指令
{
Init_char = 0xf8; //A=0,MCU->LCD;B=0,控制指令;C=0
}
else //Nf=1,则写入的是显示数据
{
Init_char = 0xfa; //A=0,MCU->LCD;B=1,显示数据;C=0
}
Hdata = Data&0xf0; //取Data高四位
Ldata = (Data<<4)&0xf0; //取Data低四位
CS = 0;
Delayus(4);
CS = 1;
Delayus(4);
Lcd_w_bit(Init_char); //写入起始选择信号
Delayus(5);
Lcd_w_bit(Hdata); //写入Data高四位
Delayus(5);
Lcd_w_bit(Ldata); //写入Data低四位
Delayus(5);
CS = 0;
}
/****************************************/
/*函数名:Lcd_w_word() */
/*功能:发送字符串 */
/*参数:str--要写入显示的字符串 */
/*返回值:无 */
/****************************************/
void Lcd_w_word(uint8 *str)
{
while(*str!='\0')
{
Lcd_w_char(1,*str++);
}
*str = 0;
}
/****************************************/
/*函数名:Lcd_init */
/*功能:lcd初始化 */
/*参数:无 */
/*返回值:无 */
/****************************************/
void Lcd_init()
{
Delayms(50); //启动等待LCD进入工作模式
CS1 = 0; //串行工作模式
CS = 1; //片选
Lcd_w_char(0,0x01); //清屏
Delayms(1);
Lcd_w_char(0,0x06); //DDRAM地址计数器(AC)归零
Delayms(2);
Lcd_w_char(0,0x30); //8 位界面,基本指令集,绘图显示关
Delayms(1);
Lcd_w_char(0,0x0c); //显示打开,光标关,反白关
Delayms(5);
}
/***************************************/
/*函数名:MCU_init */
/*功能:MCU初始化 */
/*参数:无 */
/*返回值:无 */
/***************************************/
void Mcu_init()
{
P0M1 = 0x00;
P0M0 = 0x00;
P4M1 = 0x00;
P4M0 = 0X00;
}
/***************************************/
/*函数名:main函数 */
/*功能:main */
/*参数:无 */
/*返回值:无 */
/***************************************/
void main(void)
{
Mcu_init();
Lcd_init();
while(1)
{
Lcd_w_char(0,0x80);
Lcd_w_word("Fo");
Delayms(600);
Lcd_w_char(0,0x81);
Lcd_w_word("re");
Delayms(600);
Lcd_w_char(0,0x82);
Lcd_w_word("ve");
Delayms(600);
Lcd_w_char(0,0x83);
Lcd_w_word("r ");
Delayms(600);
Lcd_w_char(0,0x84);
Lcd_w_word("lo");
Delayms(600);
Lcd_w_char(0,0x85);
Lcd_w_word("ve");
Delayms(600);
Lcd_w_char(0,0x86);
Lcd_w_word("亲");
Delayms(600);
Lcd_w_char(0,0x90);
Lcd_w_word("亲");
Delayms(600);
Lcd_w_char(0,0x91);
Lcd_w_word(",");
Delayms(600);
Lcd_w_char(0,0x92);
Lcd_w_word("谢");
Delayms(600);
Lcd_w_char(0,0x93);
Lcd_w_word("谢");
Delayms(600);
Lcd_w_char(0,0x94);
Lcd_w_word("你");
Delayms(600);
Lcd_w_char(0,0x95);
Lcd_w_word("陪");
Delayms(600);
Lcd_w_char(0,0x96);
Lcd_w_word("在");
Delayms(600);
Lcd_w_char(0,0x97);
Lcd_w_word("我");
Delayms(600);
Lcd_w_char(0,0x88);
Lcd_w_word("身");
Delayms(600);
Lcd_w_char(0,0x89);
Lcd_w_word("边");
Delayms(600);
Lcd_w_char(0,0x8a);
Lcd_w_word(",");
Delayms(600);
Lcd_w_char(0,0x8b);
Lcd_w_word("愿");
Delayms(600);
Lcd_w_char(0,0x8c);
Lcd_w_word("我");
Delayms(600);
Lcd_w_char(0,0x8d);
Lcd_w_word("们");
Delayms(600);
Lcd_w_char(0,0x8e);
Lcd_w_word("就");
Delayms(600);
Lcd_w_char(0,0x8f);
Lcd_w_word("这");
Delayms(600);
Lcd_w_char(0,0x98);
Lcd_w_word("样");
Delayms(600);
Lcd_w_char(0,0x99);
Lcd_w_word("幸");
Delayms(600);
Lcd_w_char(0,0x9a);
Lcd_w_word("福");
Delayms(600);
Lcd_w_char(0,0x9b);
Lcd_w_word("的");
Delayms(600);
Lcd_w_char(0,0x9c);
Lcd_w_word("到");
Delayms(600);
Lcd_w_char(0,0x9d);
Lcd_w_word("永");
Delayms(600);
Lcd_w_char(0,0x9e);
Lcd_w_word("远");
Delayms(600);
Lcd_w_char(0,0x9f);
Lcd_w_word("!");
Delayms(600);
}
}
