430单片机控制带字符的LCD12864显示四行静态的文字,求串口的电路图和程序

2024-12-03 19:53:03
推荐回答(1个)
回答1:

/************************************************************
我直接贴程序吧,
这是main.c文件
*************************************************************/
#include
#include "cryfucns.h"
const uchar h0[] = {"诚实以启人之信我"};
const uchar h1[] = {"乐善以使人之亲我"};
const uchar h2[] = {"虚心以听人之教我"};
const uchar h3[] = {"恭顺以取人之敬我"};
const uchar h4[] = {"自检以杜人之议我"};
const uchar h5[] = {"自反以杜人之罪我"};
const uchar h6[] = {"容忍以免人之欺我"};
const uchar h7[] = {"勤俭以补人之助我"};
const uchar h8[] = {"量力以济人之求我"};
const uchar h9[] = {"尽心以报人之任我"};
const uchar *ptr[10];
uchar d1=0,d2=1,d3=2,d4=3;
uchar tcnt=0;
/************************主函数*************************/
void main(void)
{
WDTCTL = WDT_ADLY_1000; // 定时时间1S
IE1 |= WDTIE;

//初始化指针数组
ptr[0] = h0;
ptr[1] = h1;
ptr[2] = h2;
ptr[3] = h3;
ptr[4] = h4;
ptr[5] = h5;
ptr[6] = h6;
ptr[7] = h7;
ptr[8] = h8;
ptr[9] = h9;

Ini_Lcd(); // 初始化液晶

_EINT();
LPM1;
}
/*******************************************
函数名称:watchdog_timer
功 能:看门狗中断服务函数
参 数:无
返回值 :无
********************************************/
#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer(void)
{
uchar tmp;

tcnt++;

if(tcnt == 0x02)
{
Disp_HZ(0x80,ptr[d1],8);
Disp_HZ(0x90,ptr[d2],8);
Disp_HZ(0x88,ptr[d3],8);
Disp_HZ(0x98,ptr[d4],8);

tmp = d4;
d4++;
if(d4 == 10)
{
d4 = 0;
}
d1 = d2;
d2 = d3;
d3 = tmp;
tcnt = 0;
}
}
/*****************************************
这是cryfucns.c文件
*******************************************/
#include
typedef unsigned int uint;
typedef unsigned char uchar;
#define BIT(x)(1 << (x))
void Send(uchar type,uchar transdata);
/**********液晶控制IO的宏定义*************/
#define cyCS 0 //P3.0,片选信号
#define cySID 1 //P3.1,串行数据
#define cyCLK 2 //P3.2,同步时钟
#define cyPORT P3OUT
#define cyDDR P3DIR
/*******************************************
函数名称:delay_Nus
功 能:延时N个us的时间
参 数:n--延时长度
返回值 :无
********************************************/
void delay_Nus(uint n)
{
uchar i;
for(i = n;i > 0;i--)
_NOP();
}
/*******************************************
函数名称:delay_1ms
功 能:延时约1ms的时间
参 数:无
返回值 :无
********************************************/
void delay_1ms(void)
{
uchar i;
for(i = 150;i > 0;i--) _NOP();
}
/*******************************************
函数名称:delay_Nms
功 能:延时N个ms的时间
参 数:无
返回值 :无
********************************************/
void delay_Nms(uint n)
{
uint i = 0;

for(i = n;i > 0;i--)
delay_1ms();
}
/*******************************************
函数名称:Ini_Lcd
功 能:初始化液晶模块
参 数:无
返回值 :无
********************************************/
void Ini_Lcd(void)
{
cyDDR |= BIT(cyCLK) + BIT(cySID) + BIT(cyCS); //相应的位端口设置为输出
delay_Nms(100); //延时等待液晶完成复位
Send(0,0x30); /*功能设置:一次送8位数据,基本指令集*/
delay_Nus(72);
Send(0,0x02); /*DDRAM地址归位*/
delay_Nus(72);
Send(0,0x0c); /*显示设定:开显示,不显示光标,不做当前显示位反白闪动*/
delay_Nus(72);
Send(0,0x01); /*清屏,将DDRAM的位址计数器调整为“00H”*/
delay_Nus(72);
Send(0,0x06); /*功能设置,点设定:显示字符/光标从左到右移位,DDRAM地址加1*/
delay_Nus(72);
}
/*******************************************
函数名称:Send
功 能:MCU向液晶模块发送1一个字节的数据
参 数:type--数据类型,0--控制命令,1--显示数据
transdata--发送的数据
返回值 :无
********************************************/
void Send(uchar type,uchar transdata)
{
uchar firstbyte = 0xf8;
uchar temp;
uchar i,j = 3;
if(type) firstbyte |= 0x02;
cyPORT |= BIT(cyCS);
cyPORT &= ~BIT(cyCLK);
while(j > 0)
{
if(j == 3) temp = firstbyte;
else if(j == 2) temp = transdata&0xf0;
else temp = (transdata << 4) & 0xf0;
for(i = 8;i > 0;i--)
{
if(temp & 0x80)cyPORT |= BIT(cySID);
elsecyPORT &= ~BIT(cySID);
cyPORT |= BIT(cyCLK);
temp <<= 1;
cyPORT &= ~BIT(cyCLK);
}
//三个字节之间一定要有足够的延时,否则易出现时序问题
if(j == 3) delay_Nus(600);
else delay_Nus(200);
j--;
}
cyPORT &= ~BIT(cySID);
cyPORT &= ~BIT(cyCS);
}
/*******************************************
函数名称:Clear_GDRAM
功 能:清除液晶GDRAM内部的随机数据
参 数:无
返回值 :无
********************************************/
void Clear_GDRAM(void)
{
uchar i,j,k;

Send(0,0x34); //打开扩展指令集
i = 0x80;
for(j = 0;j < 32;j++)
{
Send(0,i++);
Send(0,0x80);
for(k = 0;k < 16;k++)
{
Send(1,0x00);
}
}
i = 0x80;
for(j = 0;j < 32;j++)
{
Send(0,i++);
Send(0,0x88);
for(k = 0;k < 16;k++)
{
Send(1,0x00);
}
}
Send(0,0x30); //回到基本指令集
}
/*******************************************
函数名称:Disp_HZ
功 能:显示汉字程序
参 数:addr--显示位置的首地址
pt--指向显示数据的指针
num--显示数据的个数
返回值 :无
********************************************/
void Disp_HZ(uchar addr,const uchar * pt,uchar num)
{
uchar i;
Send(0,addr);
for(i = 0;i < (num*2);i++)
Send(1,*(pt++));
}
/*****************************************
这是cryfucns.h文件
*******************************************/
void Send(unsigned char type,unsigned char transdata);
void Ini_Lcd(void);
void Clear_GDRAM(void);
void Disp_HZ(unsigned char addr,const unsigned char * pt,unsigned char num);
void Draw_PM(const unsigned char *ptr);
void Draw_TX(unsigned char Yaddr,unsigned char Xaddr,const unsigned char * dp) ;
void Disp_SZ(unsigned char addr,unsigned char shuzi);