原创 PIC 学习

2009-6-22 09:42 2405 6 6 分类: MCU/ 嵌入式

             资料:  这是我改写的程序源码,可是研究了几天,不过写的话几个小时。rar


         应用背景:   我的预期任务:用PIC与一个温度控制仪,可以图形化显示的界面,可以存储一些数据。    


       为了完成任务,我看了一本液晶的书,最近我改写了一个C51上的程序,用于驱动T6963控制的LCD,控制方式为间接的。我想打算移植到PIC16F上, 不过有点小问题。


       展望:有人感兴趣,可以和我一起做,我的联系方式:QQ524782116。   谢谢,希望有你的参与。


 



#define ulong unsigned long
#define uint  unsigned int
#define uchar unsigned char


//#include "absacc.h"//////设定显示地址函数 //



#include "reg52.h"


#include<yj.h>
 


 


//uchar readstata;  //间接方式;
//#define Com_add XBYTE[0x0100] //数据口 //  p2.6//  ce  and   dat/com
//#define Dat_add XBYTE[0x0000] //数据口 //  p2.6//



// T6963C 命令定义
#define LC_CUR_POS 0x21 // 光标位置设置
#define LC_CGR_POS 0x22 // CGRAM 偏置地址设置
#define LC_ADD_POS 0x24 // 地址指针位置



#define LC_TXT_STP 0x40 // 文本区首址
#define LC_TXT_WID 0x41 // 文本区宽度
#define LC_GRH_STP 0x42 // 图形区首址
#define LC_GRH_WID 0x43 // 图形区宽度


#define LC_MOD_OR 0x80 // 显示方式逻辑或
#define LC_MOD_XOR 0x81 // 显示方式逻辑异或
#define LC_MOD_AND 0x82 // 显示方式逻辑与
#define LC_MOD_TCH 0x83 // 显示方式文本特征
#define LC_DIS_SW 0x90 // 显示开关D0=1/0:光标闪烁启用/禁用
// D1=1/0:光标显示启用/禁用
// D2=1/0:文本显示启用/禁用
// D3=1/0:图形显示启用/禁用
#define LC_CUR_SHP 0xA0 // 光标形状选择0xA0-0xA7表示光标占的行数


#define LC_AUT_WR 0xB0 // 自动写设置



#define LC_AUT_RD 0xB1 // 自动读设置
#define LC_AUT_OVR 0xB2 // 自动读/写结束


#define LC_INC_WR 0xC0 // 数据一次写地址加1
#define LC_INC_RD 0xC1 // 数据一次读地址加1
#define LC_DEC_WR 0xC2 // 数据一次写地址减1
#define LC_DEC_RD 0xC3 // 数据一次读地址减1
#define LC_NOC_WR 0xC4 // 数据一次写地址不变
#define LC_NOC_RD 0xC5 // 数据一次读地址不变
#define LC_SCN_RD 0xE0 // 屏读
#define LC_SCN_CP 0xE8 // 屏拷贝
#define LC_BIT_OP 0xF0 // 位操作


 


#define STX 0x02
#define ETX 0x03
#define EOT 0x04
#define ENQ 0x05
#define BS 0x08
#define CR 0x0D
#define LF 0x0A
#define DLE 0x10
#define ETB 0x17
#define SPACE 0x20
#define COMMA 0x2C


#define TRUE 1
#define FALSE 0


#define HIGH 1
#define LOW 0



void delay(uint m)
{


   uint i,j;


  for(i=0;i<m;i++)
  {
   for (j=0;j<m;j++);
   }
}


void main(void) // 测试用
{
 



    LCMInit();



/*
  while(1)
  
   {



                              }


                      }



*/


  while(1)
  {


 delay(10);



     cls(0);      //清屏
//      DisplayBMP(&nBitmapDot);
   delay(10);
   cls(0);
/*


      showhzline(0,3,"创  实验室"); 
   showhzline(0,5,"新");
   showhzline(1,3,"波形发生器"); 
   showhzline(3,0,"菜单"); 
  
 
   delay(10);
   cls(0);
   showhzline(0,0,"频率");
 
      ShowSine();
   delay(10);
      cls(0);      //清屏
      showascii86(2,0,"1234567890ABCDEFGHIJKLMNOP");  
      showascii58(0,0,"abcdefghijklmnopABCDEFGHIJKLMNOP"); 
      showascii58(2,1,"1234567890");
      showascii58(3,2,"~!@#$%^&*()_+");
                                              */
 
      delay(10);


   cls(0);      //清屏        
  // showascii58(0,0,"f=100Hz");showhzline(0,5,"占空比");showascii58(0,11,":0.34"); 
      fangbo(0,60,0.34);
   delay(10);
   cls(0);
  // showhzline(0,0,"三角波"); showascii58(0,7,"f=100Hz");
    triangle();
   delay(10); 
   delay(10);


   /**/
  }
}


 


 


 


 


 


包含的文件:


       
//**************非总线方式************//
//RT6963基于C8051F020,外部晶振11059200Hz



//#include <zm.h>
//#include <xuexiao.h>
//#include <hz.h>



#include <math.h>


           #include <string.h>//


#define ulong unsigned long
#define uint unsigned int
#define uchar unsigned char
#define LC_CUR_POS 0x21 // 光标位置设置
#define LC_CGR_POS 0x22 // CGRAM偏置地址设置
#define LC_ADD_POS 0x24 // 地址指针位置
#define LC_TXT_STP 0x40 // 文本区首址
#define LC_TXT_WID 0x41 // 文本区宽度



#define LC_GRH_STP 0x42 // 图形区首址
#define LC_GRH_WID 0x43 // 图形区宽度
#define LC_MOD_OR 0x80  // 显示方式:逻辑“或”
#define LC_MOD_XOR 0x81 // 显示方式:逻辑“异或”
#define LC_MOD_AND 0x82 // 显示方式:逻辑“与”
#define LC_MOD_TCH 0x83 // 显示方式:文本特征



#define LC_DIS_SW 0x90  // 显示开关:D0=1/0:光标闪烁启用/禁用;
                                   // D1=1/0:光标显示启用/禁用;
                                  // D2=1/0:文本显示启用/禁用;
                                  // D3=1/0:图形显示启用/禁用;
#define LC_CUR_SHP 0xA0 // 光标形状选择:0xA0-0xA7 表示光标占的行数
#define LC_AUT_WR 0xB0  // 自动写设置
#define LC_AUT_RD 0xB1  // 自动读设置
#define LC_AUT_OVR 0xB2 // 自动读/写结束
#define LC_INC_WR 0xC0  // 数据一次写,地址加1
#define LC_INC_RD 0xC1  // 数据一次读,地址加1
#define LC_DEC_WR 0xC2  // 数据一次写,地址减1
#define LC_DEC_RD 0xC3  // 数据一次读,地址减1
#define LC_NOC_WR 0xC4  // 数据一次写,地址不变
#define LC_NOC_RD 0xC5  // 数据一次读,地址不变
#define LC_SCN_RD 0xE0  // 屏读
#define LC_SCN_CP 0xE8  // 屏拷贝
#define LC_BIT_OP 0xF0  // 位操作:D0-D2:定义D0-D7 位;D3:1 置位;0:清除
#define RowCharNum 8
#define ColCharNum 16 


 


/***********************************************************************8*****************
引脚定义
*******************************************************************************************
#define dataport P3    //P3为数据口


sbit rst="P2"^4;    //液晶复位低电平有效



sbit cd="P2"^6;     //高电平:命令  低电平:数据
sbit ce="P2"^5;     //片选使能


sbit wr="P0"^7;     //写使能
sbit rd="P0"^6;     //读使能


                                             */



#define dataport P1    //P3为数据口


sbit rst="P3"^1;    //液晶复位低电平有效


 


sbit cd="P3"^2;     //高电平:命令  低电平:数据


sbit rd="P3"^3;     //读使能
sbit wr="P3"^4;     //写使能
sbit ce="P3"^5;     //片选使能//



 


 



//////////////////////////////////////////////////////////////////////////////////////////////
void Del(unsigned int) ;    //延时程序,高速单片机必需



uchar CurCol,CurRow;
uchar uCol,uRow;//
uchar a,b;//文本指针
//******************************************************************************************
//检查数据,命令读写是否准备好
//*******************************************************************************************


 


 


/*************************************************************************************
File Name: CheckStatus
Function: 查忙,判断数据指令是否可读写 
Author:
Date:
Explain
*******************************************************************************/
void CheckStatus(void)
{


 


  uchar dat;


      do{
   cd="1";
   Del(1);  //此延时相当重要
   ce="0";
   dataport="0xff";
   wr="1";
      rd="0";    
   Del(1); 
      rd="1";
      Del(1);                                     //此延时相当重要


 



        dat="dataport";
        dat="0x03"&dat;//STA0,STA1是否准备好
        }      while(dat!=0x03);



}
/**********************************************************
//*函数名称: WriteData()                     
//*入口参数: 要写入的数据
//*出口参数: 无
//*功能说明: 向t6963写入数据
**********************************************************/
void WriteData(uchar dat)
{
 CheckStatus();


 ce=0;cd=0;Del(1); wr="0"; dataport="dat";Del(1);wr=1;  
}
/**********************************************************
//*函数名称: WriteCmd()                     
//*入口参数: 要写入的命令
//*出口参数: 无
//*功能说明: 向t6963写入命令
**********************************************************/
void WriteCmd(uchar dat)
{
 CheckStatus();


    ce = 0;cd = 1;
 Del(2);
 
 wr = 0;Del(1);dataport = dat;Del(1); wr =1; 
}



void WriteOneData(uchar commd,uchar dat)
{
    WriteData(dat);
    WriteCmd(commd);
}
void WriteTwoData(uchar commd,uchar dat1,uchar dat2)
{
    WriteData(dat1);
    WriteData(dat2);
    WriteCmd(commd);
}


void CheckAutoWrite(void)
{


uchar dat;
    do{
        dataport="0xff";
        cd="1";
  ce=0;
        rd="0";
  Del(4);
  dat=dataport;
        rd="1";
        dat="0x08"&dat;//STA3是否准备好


 


        }while(dat==0x00);
}



void Del(unsigned int j)
{
 while(j--);
}



//设定显示地址函数
void LocateXY(uchar x,uchar y)
{
     uint  temp;
     temp= 128/8*y + x;
     WriteTwoData(0x24,temp&0xff,temp/256);
}


//显示一副图片函数
void DisplayBMP(uchar *puts)
{
     uchar i,j;
     uint  X="0";
     LocateXY(0,0);
     WriteCmd(0xB0);                  //进入自动写
     for(i=0;i<64;i++)
     {
           for(j=0;j<16;j++)
           {
                 CheckStatus();
                 WriteData(~puts[i*16+j]);
           }
     }


     WriteCmd(0xB2);                  //退出自动写
}


 


 


void showhz(uchar row,uchar col,uchar *p)
{
unsigned char i;
unsigned int StartAddr; 



while(col>14)
 {
        col="col-16";
        row="row"+1;
      }


 if (col<0) col="0";
 if (row>3)  return;



 StartAddr=(row<<8)+col; //定位起始行(括号中相当于lin*ColumnChar*16)
    for(i=0;i<16;i++)
 {
     WriteTwoData(0x24,(unsigned char)(StartAddr),(unsigned char)(StartAddr>>8));
  Del(2);  
  WriteOneData(0xc0,*p++);
  Del(2); 
  WriteOneData(0xc4,*p++);
  Del(2); 
     StartAddr="StartAddr" + ColCharNum;


 }


 }
/*********************************************************************************
//功能说明:显示8*16ASCII码
//入口参数:行,列地址,显示的字符串
//
*****************************************************************************************


 void showascii86(uchar row,uchar col,uchar puts[])
 {
   uchar i,j,len;
 uchar dat,byte;
 unsigned int StartAddr;



    len = strlen (puts);


 


    for(j=0;j<len;j++)
 {
      byte = puts[j];
   while(col>15)
   {
  col=col-16;
  row=row+1;
    }
   if (row>3) return;
     StartAddr=(row<<8)+col;
   for (i=0;i<16;i++)
    {
     dat="ASCII86"[(byte-32)*16+i];
     WriteTwoData(0x24,(uchar)(StartAddr),(uchar)(StartAddr>>8));
     WriteOneData(0xc4,dat);
     StartAddr="StartAddr"+ColCharNum;
        }
  col+=1;
  }
 
 
 }
                    */


/*********************************************************************************
//功能说明:显示5*8ASCII码
//入口参数:行,列地址,显示的字符串
//
*****************************************************************************************
 void showascii58(uchar row,uchar col,uchar puts[])
{
  uchar i,j,len;
 uchar dat,byte;
 unsigned int StartAddr;
    len = strlen (puts);
    for(j=0;j<len;j++)
 {
      byte = puts[j];
   while(col>15)
   {
  col=col-16;
  row=row+1;
    }
   if (row>7) return;
     StartAddr=(row<<7)+col;
   for (i=0;i<8;i++)
    {
     dat="ASCII58"[(byte-32)*8+i];
     WriteTwoData(0x24,(uchar)(StartAddr),(uchar)(StartAddr>>8));
     WriteOneData(0xc4,dat);
     StartAddr="StartAddr"+ColCharNum;
        }
   col+=1;
  }
}
                    */


void point(unsigned char bitdata)

 if(bitdata==0)
  bitdata=0xf0+(0x7-(uCol & 0x7));
 else
  bitdata=0xf8+(0x7-(uCol & 0x7));
 WriteCmd(bitdata);
}


void pointxy(uchar x,uchar y,uchar k)     
{
 uchar dat;
 uint pos;
 pos=x/8+y*16;
 WriteTwoData(0x24,pos&0xff,(pos>>8));
 dat=x-x/8*8;
    if (k==0) dat="0xf8"+(0x07-(dat&0x07));
 else dat="0xf0"+(0x07-(dat&0x07));
    WriteCmd(dat);
}


void ShowSine()
{
 uchar hz[]={0,1,2,3,4,5}; //汉字索引
 uchar x,y;
 float xf,yf;
 for (xf=0;xf<6.28;xf+=0.02)
 {
  yf=sin(xf);
  x=xf*20;
  y=yf*32+32;
  pointxy(x,y,0);
 }
}



void cls(uchar dat)
{
 uint i;
 WriteTwoData(LC_ADD_POS,0x00,0x00);  // 置地址指针
 WriteCmd(LC_AUT_WR);


                 // 自动写
 for(i=0;i<16*64;i++)
 {
  WriteData(dat);                  // 写数据
 }
 WriteCmd(LC_AUT_OVR);                // 自动写结束
 WriteTwoData(LC_ADD_POS,0x00,0x00);  // 重置地址指针
 CurRow = 0;                          // 置地址指针存储变量
 CurCol = 0;
}
/*******************************************************************************************************
//函数名:LCMInit
//功能说明:初始化液晶
*********************************************************************************************************/
void LCMInit(void)
{   
 rst=0;
    Del(5);
 rst=1;
 ce =0;
    Del(50);



 WriteTwoData(LC_GRH_STP,0x00,0x00);    // 图形显示区首地址
 WriteTwoData(LC_GRH_WID,0x10,0x00);    // 图形显示区宽度


 WriteCmd(0xA7);                        // 光标形状
 WriteCmd(0x80);                        // 显示方式设置
 WriteCmd(0x98);                        // 显示开关设置
 cls(0x00);
}


 


/**********************************
//= 函数原型: void line( unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, bit Mode)
//= 功    能: 划线函数
//= 参    数: 坐标1,坐标2,显示点或清除点
//= 返 回 值: 无
/**********************************/


void line( unsigned char x1,unsigned char y1, unsigned char x2,unsigned char y2,  bit Mode)
{
    unsigned char x,y;
    float k,b;
    if( abs(y1-y2) <= abs(x1-x2) ) // |k|<=1
    {
        k=((float)y2-y1) / ((float)x2-x1) ;
        b="y1-k"*x1;
        if( x1 <= x2 )
        {
            for(x=x1;x<=x2;x++)
            {
                y=(uchar)(k*x+b);
                pointxy(x, y, Mode);
            }
        }
        else
        {
            for(x=x2;x<=x1;x++)
            {
                y=(uchar)(k*x+b);
                pointxy(x, y, Mode);
            }
        }
    }
    else // abs(y1-y2) > abs(x1-x2) |K|>1
    {
        k=((float)x2-x1) / ((float)y2-y1) ;
        b="x1-k"*y1;
        if( y1 <= y2 )
        {
            for(y=y1;y<=y2;y++)
            {
                x=(uchar)(k*y+b);
                pointxy( x , y,Mode );
            }
        }
        else
        {
            for(y=y2;y<=y1;y++)
            {
                x=(uchar)(k*y+b);
                pointxy( x , y,Mode );
            }
        }
    }
}
/********************************************************************************************
//函数名:triangle
//功能说明:画三角波
//无出入口参数
*********************************************************************************************/
void triangle(void)
{
  line(0,60,25,35,0);
  line(25,35,50,60,0);
  line(50,60,75,35,0);
  line(75,35,100,60,0);
  line(100,60,125,35,0);
}
/*******************************************************************************************
//函数名称;fangbo
//入口参数:图形起始坐标 x,y,占空比z
//
//
//
*********************************************************************************************/
void fangbo(uchar x,uchar y,float z)
{
 uchar i,n;
 float j,k;
 j=20*z/(1-z);
 k=127/(j+20);
 for(n=0;n<k-1;n++)
 {
   for(i=0;i<20;i++)   //横轴
   {
    pointxy(x++,y,0);
    }
   for(i=0;i<35;i++)   //纵轴
    {pointxy(x,y--,0);}
   for(i=0;i<j;i++)
   {       //横轴
    pointxy(x++,y,0);
   }
   for(i=0;i<35;i++)
    {pointxy(x,y++,0);}    //纵轴
 }
}



/**************************************************************************************************
//函数名:showhzline
//入口参数:坐标行,列,要显示的汉字字符串
**********************************************************************************************
 void showhzline(uchar row,uchar col,signed char puts[])
{
  uchar len,i,j;
  len = strlen (puts);      //判断字符串长度
  for(j=0;j<len;j++)  //外层循环 次数为len的一半
  {
   for(i=0;i<30;i++)  //内层循环 按汉字索引写字
    {      //判断是否与索引一致
     if(GB_16.Index[0]==puts[j]&&GB_16.Index[1]==puts[j+1]) {showhz(row,col,&GB_16.Msk);break;}//一致即写出汉字,跳出循环
    }
    col+=1;
  }
}


*/
 


 


 


 


 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
6
关闭 站长推荐上一条 /3 下一条