⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 c8051学习机实验程序
💻 C
字号:
#include <c8051f020.h>
#include <absacc.h>

extern void config (void);
//////////////////////////////////////////////
#define UINT8 unsigned char
#define INT8 char
#define UINT16 unsigned int
#define INT16 int
#define FP32	float
////////////////////////////////////
#define DAT_ADDR  0xFC00
#define COD_ADDR  0xFD00
#define LCD_DAT   XBYTE[DAT_ADDR]   //数据接口
#define LCD_CODE  XBYTE[COD_ADDR]   //指令接口
// T6963C 命令定义
#define LCD_CUR_POS  0x21 // 光标位置设置
#define LCD_CGR_POS  0x22 // CGRAM偏置地址设置
#define LCD_ADDR_POS  0x24 // 地址指针位置
#define LCD_TXT_STP  0x40 // 文本区首址
#define LCD_TXT_WID  0x41 // 文本区宽度
#define LCD_GRH_STP  0x42 // 图形区首址
#define LCD_GRH_WID  0x43 // 图形区宽度
#define LCD_MOD_OR   0x80 // 显示方式:逻辑"或"
#define LCD_MOD_XOR  0x81 // 显示方式:逻辑"异或"
#define LCD_MOD_AND  0x82 // 显示方式:逻辑"与"
#define LCD_MOD_TCH  0x83 // 显示方式:文本特征
#define LCD_DIS_SW   0x90 // 显示开关:D0=1/0:光标闪烁启用/禁用;
// D1=1/0:光标显示启用/禁用;
// D2=1/0:文本显示启用/禁用;
// D3=1/0:图形显示启用/禁用;
#define LCD_CUR_SHP 0xA0 // 光标形状选择:0xA0-0xA7 表示光标占的行数
#define LCD_AUTO_WR 0xB0 // 自动写设置
#define LCD_AUTO_RD 0xB1 // 自动读设置
#define LCD_AUTO_OVER 0xB2 // 自动读/写结束
#define LCD_INC_WR 0xC0 // 数据一次写,地址加1
#define LCD_INC_RD 0xC1 // 数据一次读,地址加1
#define LCD_DEC_WR 0xC2 // 数据一次写,地址减1
#define LCD_DEC_RD 0xC3 // 数据一次读,地址减1
#define LCD_NOC_WR 0xC4 // 数据一次写,地址不变
#define LCD_NOC_RD 0xC5 // 数据一次读,地址不变
#define LCD_SCN_RD 0xE0 // 屏读
#define LCD_SCN_CP 0xE8 // 屏拷贝
#define LCD_BIT_OP 0xF0 // 位操作:D0-D2:定义D0-D7 位;D3:1 置位;0:清除
////////////////////////////////////////////////////////////////////
#define MAX_VERTICAL_DOT 128
#define MAX_HORIZON_DOT 150
#define MAX_SAMPLE  255
///////////////////////////////////////////////////////////////////
UINT8 code DIS_CTRL[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
///////////////////////////////////////////////////////////////////
UINT8 code A[16] = {
/*a    */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x1E,0x22,0x42,0x42,0x3F,0x00,0x00

};
extern void config (void);
//**********************************************************
//********子函数**************
//判断状态为STA0(指令读写)和STA1(数据读写)
void LcdRWCheck()
{
    while((LCD_CODE&0X03)!=0X03)
    {;}
}
//判断自动读状态STA2
void LcdAutoRCheck()
{
    while((LCD_CODE&0X04)!=0X04)
    {;}
}
//判断自动写状态STA3
void LcdAutoWCheck()
{
    while((LCD_CODE&0X08)!=0X08)
    {;}
}
//写无参数命令
void WrCmdNoP(UINT8 cmd)
{
    LcdRWCheck();
    LCD_CODE=cmd;
}
//写一个参数的命令
void WrCmdOneP(UINT8 dat,UINT8 cmd)
{
    LcdRWCheck();
    LCD_DAT=dat;
    LcdRWCheck();
    LCD_CODE=cmd;
}
//写两个参数的命令
void WrCmdTwoP(UINT8 dat1,UINT8 dat2,UINT8 cmd)
{
    LcdRWCheck();
    LCD_DAT=dat1;
    LcdRWCheck();
    LCD_DAT=dat2;
    LcdRWCheck();
    LCD_CODE=cmd;
}

//自动写
void DatAutoWr(UINT8 dat)
{
    LcdAutoWCheck();
    LCD_DAT=dat;
}
//数据自动读
UINT8 DatAutoRd()
{
    UINT8 dat;
    LcdAutoRCheck();
    dat=LCD_DAT;
    return dat;
}
//清屏
void ClearDisplay()
{
    UINT16 i;
    WrCmdTwoP(0,0,LCD_ADDR_POS);
    WrCmdNoP(LCD_AUTO_WR);
    for(i=0;i<30*128;i++)
    {
        DatAutoWr(0x00);
    }
    WrCmdNoP(LCD_AUTO_OVER);
}
//读任意处的值
UINT8 ReadAny(UINT8 v_Row, UINT8 v_Col)
{
    UINT8 v_Dat;
    UINT16 v_Addr;
    v_Addr=v_Row*30+v_Col;
    WrCmdTwoP(v_Addr&0xff,v_Addr/256,LCD_ADDR_POS);

(LCD_NOC_RD);
    v_Dat=LCD_DAT;
    return v_Dat;
}
//在任意处显示任意值
void DisplayAny(UINT8 v_Row,UINT8 v_Col,UINT8 v_Dat)
{
    UINT16 v_Addr;
    v_Addr=v_Row*30+v_Col;
    WrCmdTwoP(v_Addr&0xff,v_Addr/256,LCD_ADDR_POS);
    WrCmdOneP(v_Dat,LCD_NOC_WR);
}

//显示英文字母(8*16)
void DisplayChar(UINT8 row,UINT8 col,UINT8 *ch,UINT8 height)
{
    UINT8 i;
    UINT16 addr;
    addr=row*30+col;
    WrCmdTwoP(addr&0xff,addr/256,LCD_ADDR_POS);
    for(i=0;i<height;i++)
    {
        WrCmdOneP(ch[i],LCD_NOC_WR);
        addr+=30;
        WrCmdTwoP(addr&0xff,addr/256,LCD_ADDR_POS);
    }
}
//显示汉字
void DisplayChn(UINT8 row,UINT8 col,UINT8 *chn)
{
    UINT8 i;
    UINT16 addr;
    addr=row*30+col;
    WrCmdTwoP(addr&0xff,addr/256,LCD_ADDR_POS);
    for(i=0;i<16;i++)
    {
        WrCmdOneP(chn[i],LCD_NOC_WR);
        addr+=30;
        WrCmdTwoP(addr&0xff,addr/256,LCD_ADDR_POS);
    }
    addr=row*30+col+1;
    WrCmdTwoP(addr&0xff,addr/256,LCD_ADDR_POS);
    for(i=0;i<16;i++)
    {
        WrCmdOneP(chn[i+16],LCD_NOC_WR);
        addr+=30;
        WrCmdTwoP(addr&0xff,addr/256,LCD_ADDR_POS);
    }
}
//画坐标系
/*void DisplayXY(UINT8 row,UINT8 col)
{
    //先画竖线
    UINT8 i;
    UINT16 addr;
    addr=row*30+col;
    WrCmdTwoP(addr&0xff,addr/256,LCD_ADDR_POS);
    for(i=0;i<MAX_VERTICAL_DOT;i++)
    {
        WrCmdOneP(0x80,LCD_NOC_WR);
        addr=addr-30;
        WrCmdTwoP(addr&0xff,addr/256,LCD_ADDR_POS);
    }
    //写Ic
    DisplayChar(row+11-MAX_VERTICAL_DOT,col-3,CHAR_I);
    DisplayChar(row+11-MAX_VERTICAL_DOT,col-2,CHAR_c);
    DisplayChar(18,10,CHAR_uu);
    DisplayChar(18,11,CHAR_AA);
    //画横线
    addr=row*30+col;
    WrCmdTwoP(addr&0xff,addr/256,LCD_ADDR_POS);
    for(i=0;i<(MAX_HORIZON_DOT/8);i++)
    {
        WrCmdOneP(0xff,LCD_INC_WR);
    }
    //写Uce
    DisplayChar(row-15,col+MAX_HORIZON_DOT/8-3,CHAR_U);
    DisplayChar(row-15,col+MAX_HORIZON_DOT/8-2,CHAR_c);
    DisplayChar(row-15,col+MAX_HORIZON_DOT/8-1,CHAR_e);
    DisplayChar(116,28,CHAR_VV);
    //写B=
    DisplayChar(46,3,CHAR_beta);
     DisplayChar(46,4,CHAR_equ);
    DisplayChar(46,5,CHAR_11);
     DisplayChar(46,6,CHAR_00);
     DisplayChar(46,7,CHAR_00);
     //坐标点
     DisplayChar(118,11,CHAR_00);
     DisplayChar(118,14,CHAR_99);
     DisplayChar(118,16,CHAR_11);
     DisplayChar(118,17,CHAR_88);
     DisplayChar(118,19,CHAR_22);
     DisplayChar(118,20,CHAR_77);
     DisplayChar(118,22,CHAR_33);
     DisplayChar(118,23,CHAR_66);
     DisplayChar(118,25,CHAR_44);
     DisplayChar(118,26,CHAR_55);
   /*DisplayChar(98,11,CHAR_22);
   DisplayChar(78,11,CHAR_44);
   DisplayChar(58,11,CHAR_66);
   DisplayChar(38,11,CHAR_88);*/
/*DisplayChar(18,8,CHAR_55);
DisplayChar(18,9,CHAR_55);
DisplayChar(18,12,CHAR_L);
}*/
//画波形
void DisplayWave(UINT8 v_OriginRow,UINT8 v_OriginCol,UINT8 v_Num,UINT8 v_CurSample,UINT8 v_PreSample)
{
    UINT8 i;
    UINT8 v_VolAddition;
    UINT8 v_Dat;
    FP32 v_Temp;
    v_Temp=(FP32)(v_PreSample)/MAX_SAMPLE*MAX_VERTICAL_DOT;
    v_PreSample=(UINT8)v_Temp;
    v_Temp=(FP32)(v_CurSample)/MAX_SAMPLE*MAX_VERTICAL_DOT;
    v_CurSample=(UINT8)v_Temp;
    v_VolAddition=v_Num/8;
    if(v_CurSample>v_PreSample)
    {
        for(i=v_OriginRow-v_CurSample;i<(v_OriginRow-v_PreSample);i++)
        {
            UINT16 addr;
            addr=i*30+v_OriginCol+v_VolAddition;
            WrCmdTwoP(addr&0xff,addr/256,LCD_ADDR_POS);
            WrCmdNoP(0xff-v_Num%8);
        }
    }
    if(v_CurSample<v_PreSample)
    {
        for(i=v_OriginRow-v_CurSample;i>v_OriginRow-v_PreSample;i--)
        {
            UINT16 addr;
            addr=i*30+v_OriginCol+v_VolAddition;
            WrCmdTwoP(addr&0xff,addr/256,LCD_ADDR_POS);
            WrCmdNoP(0xff-v_Num%8);
        }
    }
    if(v_CurSample==v_PreSample)
    {
         UINT16 addr;
         addr=(v_OriginRow-v_CurSample)*30+v_OriginCol+v_VolAddition;
         WrCmdTwoP(addr&0xff,addr/256,LCD_ADDR_POS);
         WrCmdNoP(0xff-v_Num%8);
    }


}
///初始化液晶
void LcdInitial()
{
    //全部显示区为图形显示区
    WrCmdTwoP(0x00,0x00,LCD_GRH_STP);
    WrCmdTwoP(30,0,LCD_GRH_WID);
    //设置光标形状
    WrCmdNoP(0xa0);
    //显示方式
    WrCmdNoP(0x80);
    //关闭光标显示,关闭文本显示,打开图形显示
    WrCmdNoP(0x98);
    ClearDisplay();            
}

void delay(unsigned int n)
{
	unsigned int i,j;
	i = 0;
	j = 0;
	while(j<n)
	{
		i = 0;
		while(i<20) i++;
		j++;
	}
}
///////////////////////////////////////////////////
void main()
{
    //WrCmdTwoP(0x00,0x00,LCD_TXT_STP);
    //WrCmdTwoP(30,0,LCD_TXT_WID);
    UINT8 i;
    UINT8 temp[60]={10,15,25,35,45,55,65,75,85,95,105,110,111,113,115,118,120,122,125,126,126 ,126,126,126,126,126,126,126   ,126,126 ,127,127,127,127,127,128,128,128,128,128,129,129,129,129,129,130,130,130,130,130,131,131,131,131,131,132,132,132,132,132
    };
	config ();
    P1 = 0xff;
	while(1)
	{
		LCD_DAT=0x01;
		LCD_CODE=0x00;
		P1 = 0xff - P1;
	}
   config();

    WrCmdTwoP(0x00,0x00,LCD_GRH_STP);
    WrCmdTwoP(30,0,LCD_GRH_WID);
    WrCmdNoP(0xa0);
    WrCmdNoP(0x80); //显示方式
    WrCmdNoP(0x98); //关闭光标显示,关闭文本显示,打开图形显示
    ClearDisplay();
    WrCmdTwoP(0x00,0x00,LCD_ADDR_POS);
    WrCmdOneP(0xff,LCD_INC_WR);
    //menu1();
    ClearDisplay();
   // menu2();
   do{
    ClearDisplay();
	DisplayChar(1,1,&A[0],16);
	}
//    DisplayXY(117,12);
    while(1);

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -