📄 text1.c
字号:
#include <REG938.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define _Nop() _nop_()
#define GENERATE_STOP 0x54 /* 置位 STO, 复位 STA 、 SI */
#define RELEASE_BUS_ACK 0x44 /* 复位 STO,STA,SI 并置位 AA (ack) */
#define RELEASE_BUS_NOACK 0x40 /* 复位 STO,STA,SI 并置位 AA (noack) */
#define RELEASE_BUS_STA 0x64 /* 起动总线/重新起动总线, 置位 STA */
//定义变量
sbit rt12864_sid = P1^1; //数据
sbit rt12864_clk = P1^0; //时钟
extern uchar byte[20];
//void display(uchar *put);
bit RcvByte(uchar *c);
void rt12864_initialization(void);
void dally_timer1(uint data ms);
void rt12864_write1(uchar data TMP1);
void rt12864_write(uchar data LCD_COMMAND,uchar data LCD_TMP);
void rt12864_initialization(void);
void lcd12232_zfc(uchar row,uchar tier,uchar *puts);
void rt12864_clear(void);
uchar code AC_TABLE[]={ 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, //第一行汉字位置
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, //第二行汉字位置
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f, //第三行汉字位置
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f}; //第四行汉字位置
uchar code lcd_tab[16]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,
0x41,0x42,0x43,0x44,0x45,0x46};
/********************************************************************
使用定时器1延时n毫秒
********************************************************************/
void dally_timer1(uint data ms)
{
uint i;
TR1=1;//启动定时器T1
for(i=ms*25;i>0;i--)
{
while(TF1==0)
{
_Nop();
};
TF1=0;//清除T1溢出标志TF1
}
TR1=0;//关闭定时器T1
}
/****************************************************************************
* 名称:rt12864_write()
* 功能:LCD读写子程序。
* 入口参数:LCD_COMMAND, LCD_DATA
* 出口参数:无
****************************************************************************/
/**------------------------------------------------------------------------**/
void rt12864_write1(uchar data TMP1)
{
uchar data i,TMP;
for(i=8;i>0;i--)
{
TMP=(TMP1&(0x01<<(i-1)))>>(i-1);//取数据第7-0位
if(TMP==0)
{
rt12864_sid = 0; //第i位为0,lcd数据为0
}
if(TMP==1)
{
rt12864_sid = 1; //第i位为1,lcd数据为1
}
rt12864_clk = 0; //lcd时钟产生一个上升沿
_Nop();
_Nop();
rt12864_clk = 1;
}
}
/**-----------------------------------------------------------------------**/
void rt12864_write(uchar data LCD_COMMAND,uchar data LCD_TMP)
{
uchar data TMP1;
TMP1=LCD_COMMAND; //发送lcd指令
rt12864_write1(TMP1);
TMP1=LCD_TMP&0xF0; //发送lcd指令或数据高4位
rt12864_write1(TMP1);
TMP1=(LCD_TMP&0x0F)<<4; //发送lcd指令或数据低4位
rt12864_write1(TMP1);
}
/****************************************************************************
* 名称:LCDInit()
* 功能:LCD初始化子程序。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void rt12864_initialization(void)
{
rt12864_write(0xf8,0x01); //清屏命令
dally_timer1(40);
rt12864_write(0xf8,0x30); //基本指令集
dally_timer1(40);
rt12864_write(0xf8,0x02); //游标归零命令
dally_timer1(40);
rt12864_write(0xf8,0x04); //
dally_timer1(40);
rt12864_write(0xf8,0x0c); //
dally_timer1(40);
rt12864_write(0xf8,0x01); //
dally_timer1(40);
rt12864_write(0xf8,0x80); //
dally_timer1(40);
}
void lcd12232_zfc(uchar row,uchar tier,uchar *puts)
{
uchar data tmp;
tmp = AC_TABLE[8*row+tier];
rt12864_write(0xf8,tmp);
while(*puts != '\0') //等待传送结束
{
rt12864_write(0xfa,*puts); //
puts++;
}
}
/***************************************************************
* 接收字节函数
* 功能:读取总线传来的字节数据并发送应答位,正常接收返回1。
* 入口参数:c 此时读入的数据变量的地址
* 出口参数:接收到总线结束信号或重新启动总线信号时返回0
***************************************************************/
bit RcvByte(uchar *c)
{
I2CON = RELEASE_BUS_ACK; /* 清除标志位 */
while( SI==0 ); /* 放开总线,等待接收 */
if(I2STAT==0xA0) /* 接收到停止位或重新启动位 */
{
I2CON = RELEASE_BUS_ACK; /* 先放开总线,再返回0 */
return(0);
}
*c = I2DAT; /* 取数据 */
return(1);
}
void intermit ()interrupt 7
{
uchar byte[10]="";
bit tmp;
do
{
tmp=RcvByte(byte);
}while(!tmp);
lcd12232_zfc(0,0,byte);
I2CON=I2CON&0xF8;//清除中断标志
return;
}
void main()
{
uchar byte1[]="扬州电力设备修造";
P0M1=0x00;
P0M2=0x00;
P1M1=0x0C;//P1.2,P1.3配置为开漏,其他为双向I/O口
P1M2=0x0C;
P3M1=0x00;
P3M2=0x00;
P0=0xff;
P1=0xff;
P3=0xff;
SP=0x7F;
TMOD=0x20;//T1工作方式2
TAMOD=0x00;
TL1=0x6C;//装入T1初值
TH1=0x6C;
I2CON=0x44;//从接收器模式初始化
I2STAT=0;
I2ADR=0x70;//从机地址为70h
I2SCLH=0x0E;//数据波特率为123Kbit/s
I2SCLL=0x0E;
rt12864_initialization();
dally_timer1(40);
IEN0=0x80;//开总中断
IEN1=0x01;//开I2C中断
while(1)
{
lcd12232_zfc(1,0,byte1);
dally_timer1(40);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -