📄 uart.c
字号:
/* | Description */
/*-------------------------------------------------------------------------*/
/*This is The Tms320lf2407A C source Program including SCI OCTO. 20, 2004 | Created by liyp
Copyright 2004-- liyp ltd cmp. All rights reserved.
/*-------------------------------------------------------------------------*/
#include "lf2407regs.h"//系统头文件
#include "stdlib.h"
unsigned char a,receive[2],i,j;
unsigned char lcd_data[64];
int pData[4];
#define MS_TIME_LOOP 0x0385
void initsys()//ok
{
asm(" setc SXM ");
asm(" clrc OVM ");
asm(" CLRC CNF ");
asm(" setc INTM ");
*SCSR1=0x83FE; //设定系统工作频率
*WDCR =0x0e8;
*IMR =0x0010; //使能中断INT5
*IFR =0xffff;
// *MCRA =0x33;
*MCRA=0x0003; /*IOPA2~7,IOPB配置为一般I/O功能*/
*PADATDIR=0x0F700;/*IOPA3配置为输入方式,其余配置为输出方式.*/
*PBDATDIR=0x0FFFF;/*IOPB配置为输出方式*/
}
void inline disable(){
asm(" setc INTM ");
}
void inline enable(){
asm(" clrc INTM ");
}
void interrupt nothing()
{
return;
}
/*延时子程序*/
void Delay(int count)
{
int ii;
int jj;
for (ii=0;ii<=50;ii++)
{
jj=count;
while(jj > 0)
jj--;
}
}
/*发送数据子程序*/
void SendData()
{
Delay(50);/*等待数据稳定*//*本句必须有*/
*PADATDIR=(*PADATDIR | 0x0010);/*发送请求*/
loop:
/*检测BUSY位是否为1,即数据是否处理完*/
if(!(*PADATDIR & 0x0008))
goto loop;
*PADATDIR=(*PADATDIR & 0x0FFEF);/*撤消请求*/
Delay(50);/*等待模块内部处理完成*/
/*本句也必须有,否则虽然能够正常显示汉字,但会不时的有闪烁*/
}
/*液晶复位清屏子程序*/
void ResetLCD(void)
{
*PBDATDIR=0x0FFF4;
SendData(); /*以上两句为清屏,向数据口送清屏指令#F4H*/
}
/*汉字显示*/
void hanzi(int comd,int x,int y,int QQ,int WW)
{
pData[0]=comd;
pData[1]=x;
pData[2]=y;
pData[3]=(QQ-0x0A0)|0x0FF00;
pData[4]=(WW-0x0A0)|0x0FF00;
for(i=0;i<=4;i++)
{
*PBDATDIR=pData[i];
SendData();
/* Delay(10); /*必须延时,才能正常显示*/
}
}
//固定界面显示
void hanzi1()
{
int comd;int adres_x;int adres_y;unsigned char_qu;unsigned char_wei;
unsigned i;
unsigned j;
unsigned m;
strcpy(lcd_data," 闻亭科技 串口调试实验 汉字显示 ");
comd=0x0fff0;
for(i=0;i<4;i++)
{ for(j=2;j<10;j++)
{ adres_x=j;
adres_y=i;
char_qu=lcd_data[i*16+(j-2)*2]-0x0a0;
char_wei=lcd_data[i*16+(j-2)*2+1]-0x0a0;
pData[0]=comd;
pData[1]=adres_x|0x0ff00;
pData[2]=adres_y|0x0ff00;
pData[3]=char_qu|0x0ff00;
pData[4]=char_wei|0x0ff00;
for(m=0;m<5;m++)
{*PBDATDIR=pData[m];SendData();}
}
}
}
unsigned int wait_ms( volatile unsigned int delay_val )
{
unsigned int i;
unsigned int ms_ctr;
for ( i = 0; i < delay_val; i++ )
{
ms_ctr = MS_TIME_LOOP;
while ( ms_ctr )
{
ms_ctr--;
}
}
return( delay_val );
}
void uartrec() //232口接收子程序
{
if(a>2) a=0;
receive[a++]=*SCIRXBUF;
*IFR=0X0010;
enable();
}
void uartsent(unsigned char sci_dat) //232口发送程序
{
unsigned int var[7];
*SCITXBUF=sci_dat;
*IFR=0x0010;
enable();
}
void sciinit() //232初始化,波特率为9600kb/s,8个数据位,1停止位,无校验
{
*SCICCR=0x07;
*SCICTL1=0x13;
*SCICTL2=0x3;
*SCIHBAUD=0x01;
*SCILBAUD=0x85; //THE SYSTEM BAUD IS 30MHZ, COMMUNICATION BAUD IS 9600KBIT/S
*SCICTL1=0x33;
*SCIPRI=0x60;
*MCRA=0x3;
*PADATDIR=0X0f700;
*IMR=0x10;
enable();
}
void main()
{
int a1,a2;
disable();
initsys();
sciinit();
enable();
ResetLCD();//清屏
ResetLCD();
ResetLCD();
Delay(100);
hanzi1();
Delay(100);
do{
a1=receive[0];
a2=receive[1];
// Delay(50);
hanzi(0x0FFF0,0x0FF08,0X0FF03,a1,a2);//汉字显示
// Delay(50);
for(i=0;i<9;i++) //延时50ms,发送0到9
{
uartsent(i);
wait_ms(1000);
}
} while(1);
}
void interrupt uart() //232接收中断
{
switch (*PIVR)
{
case 6:uartrec();
default:break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -